diff options
360 files changed, 0 insertions, 93367 deletions
diff --git a/usr.sbin/xntpd/COPYRIGHT b/usr.sbin/xntpd/COPYRIGHT deleted file mode 100644 index b5d6282c2aa9..000000000000 --- a/usr.sbin/xntpd/COPYRIGHT +++ /dev/null @@ -1,62 +0,0 @@ -/****************************************************************************** - * * - * Copyright (c) David L. Mills 1992, 1993, 1994 * - * * - * Permission to use, copy, modify, and distribute this software and its * - * documentation for any purpose and without fee is hereby granted, provided * - * that the above copyright notice appears in all copies and that both the * - * copyright notice and this permission notice appear in supporting * - * documentation, and that the name University of Delaware not be used in * - * advertising or publicity pertaining to distribution of the software * - * without specific, written prior permission. The University of Delaware * - * makes no representations about the suitability this software for any * - * purpose. It is provided "as is" without express or implied warranty. * - * * - ******************************************************************************/ - -/* - * For all files included in this distribution and not specifically marked - * otherwise, the above copyright information applies. - * - * Authors - * - * Dennis Ferguson <dennis@mrbill.canet.ca> (foundation code for NTP - * Version 2 as specified in RFC-1119) - * Lars H. Mathiesen <thorinn@diku.dk> (adaptation of foundation code for - * Version 3 as specified in RFC-1305) - * Louis A. Mamakos <louie@ni.umd.edu> (support for md5-based - * authentication) - * Craig Leres <leres@ee.lbl.gov> (port to 4.4BSD operating system, - * ppsclock, Maganavox GPS clock driver) - * Nick Sayer <mrapple@quack.kfu.com> (SunOS streams modules) - * Frank Kardel <Frank.Kardel@informatik.uni-erlangen.de>(PARSE (GENERIC) - * driver, STREAMS module for PARSE, support scripts, reference clock - * configuration scripts, Makefile cleanup) - * Rainer Pruy <Rainer.Pruy@informatik.uni-erlangen.de> (monitoring/trap - * scripts, statistics file handling) - * Glenn Hollinger <glenn@herald.usask.ca> (GOES clock driver) - * Kenneth Stone <ken@sdd.hp.com> (port to HPUX operating system) - * Dave Katz <dkatz@cisco.com> (port to RS/6000 AIX operating system) - * William L. Jones <jones@hermes.chpc.utexas.edu> (RS/6000 AIX - * modifications, HPUX modifications) - * John A. Dundas III <dundas@salt.jpl.nasa.gov> (Apple A/UX port) - * David L. Mills <mills@udel.edu> (Spectractom WWVB, Austron GPS, - * Heath, ATOM, ACTS, KSI/Odetics IRIG-B clock drivers; pps support) - * Jeffrey Mogul <mogul@pa.dec.com> (ntptrace utility) - * Steve Clift (clift@ml.csiro.au) OMEGA clock driver) - * Mike Iglesias (iglesias@uci.edu) (DEC Alpha changes) - * Mark Andrews <marka@syd.dms.csiro.au> (Leitch atomic clock controller) - * George Lindholm <lindholm@ucs.ubc.ca> (port to SunOS 5.1 operating system) - * Jeff Johnson <jbj@chatham.usdesign.com> (massive prototyping overhaul) - * Tom Moore <tmoore@fievel.daytonoh.ncr.com> (port to i386 svr4) - * Piete Brooks <Piete.Brooks@cl.cam.ac.uk> (MSF clock driver, Trimble PARSE - * support) - * Karl Berry <karl@owl.HQ.ileaf.com> (syslog to file option) - * Torsten Duwe <duwe@immd4.informatik.uni-erlangen.de> (Linux Port) - * Paul A Vixie <vixie@vix.com> (TrueTime GPS driver) - * Jim Jagielski <jim@jagubox.gsfc.nasa.gov> (A/UX port) - * Ray Schnitzler <schnitz@unipress.com> (First pass at a Unixware1 port.) - * Ajit Thyagarajan <ajit@ee.udel.edu> (IP multicast support) - * Jeff Steinman <jss@pebbles.jpl.nasa.gov> (Datum PTS clock driver) - * Tomoaki TSURUOKA <tsuruoka@nc.fukuoka-u.ac.jp> (TRAK clock driver) - */ diff --git a/usr.sbin/xntpd/Makefile b/usr.sbin/xntpd/Makefile deleted file mode 100644 index c1623c7cdaf9..000000000000 --- a/usr.sbin/xntpd/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# -# Makefile for xntpd. -# $FreeBSD$ -# -SUBDIR= lib parse xntpd xntpdc ntpq ntpdate ntptrace authstuff - -.include <bsd.subdir.mk> diff --git a/usr.sbin/xntpd/Makefile.inc b/usr.sbin/xntpd/Makefile.inc deleted file mode 100644 index 3fa34c048038..000000000000 --- a/usr.sbin/xntpd/Makefile.inc +++ /dev/null @@ -1,21 +0,0 @@ -# $FreeBSD$ - -DEFS_LOCAL=-DREFCLOCK -DPARSE -DUDP_WILDCARD_DELIVERY -NTPDEFS= -DSYS_FREEBSD -DSYS_44BSD -AUTHDEFS= -DMD5 -CLOCKDEFS= -DLOCAL_CLOCK -DPST -DWWVB -DAS2201 -DGOES -DGPSTM -DOMEGA \ - -DLEITCH -DTRAK -DACTS -DATOM -DDATUM -DHEATH -DMSFEES \ - -DMX4200 -DNMEA -DBOEDER -CFLAGS+= ${NTPDEFS} ${DEFS_LOCAL} ${AUTHDEFS} ${CLOCKDEFS} ${COPTS} - -.if exists(${.OBJDIR}/../lib) -LIBNTP= ${.OBJDIR}/../lib/libntp.a -.else -LIBNTP= ${.CURDIR}/../lib/libntp.a -.endif - -.if !defined(NOCRYPT) && exists(${.CURDIR}/../../../secure/usr.sbin/xntpd/lib) -AUTHDEFS+= -DDES -.endif - -.include "../Makefile.inc" diff --git a/usr.sbin/xntpd/PORTING b/usr.sbin/xntpd/PORTING deleted file mode 100644 index 7f236424ec4f..000000000000 --- a/usr.sbin/xntpd/PORTING +++ /dev/null @@ -1,37 +0,0 @@ -These are the rules so that older bsd systems and the POSIX standard -system can coexist togather. - - 1) If you use select then include "ntp_select.h" - select is not standard, since it is very system depenedent as to where - select is defined. The logic to include the right system dependent - include file is in "ntp_select.h". - 2) Always use POSIX defintion of strings. Inlcude "ntp_string.h" instaed - of <string.h>. - 3) Always include "ntp_malloc.h" if you use malloc. - 4) Always include "ntp_io.h" instead of <sys/file.h> or <fnctl.h> to - get O_* flags. - 5) Always include "ntp_if.h" instead of <net/if.h>. - 6) Always include "ntp_stdlib.h" instead of <stdlib.h>. - 7) Always define a system identifier for any new system added to the - machines directory. The identifier should always start with SYS_! - 8) Define any special defines needed for a system in - ./include/ntp_machine.h based on system identifier. This file is - included by the "ntp_types.h" file and should always be placed - first after the <> defines. - 9) Define any special library prototypes left over from the system - library and include files in the "l_stdlib.h" file. This file is - included by the "ntp_stdlib.h" file and should ordinarily be - placed last in the includes list. - 10) Don't define a include file by the same name as a system include file. - - -"l_stdlib.h" can contain any extra definitions that are needed so that -gcc will shut up. They should be controlled by a system identifier and -there should be a seperate section for each system. Really this will -make it easier to maintain. - -See include/ntp_machines.h for the verious compile time options. - -Good luck. - -Bill Jones, with amendments by Dave Mills diff --git a/usr.sbin/xntpd/README b/usr.sbin/xntpd/README deleted file mode 100644 index 43780d6e35eb..000000000000 --- a/usr.sbin/xntpd/README +++ /dev/null @@ -1,156 +0,0 @@ -The xntp3 Distribution - -This directory and its subdirectories contain the Network Time Protocol -Version 3 (NTP) distribution for Unix systems. It contains source code -for the daemon, together with related auxiliary programs, documentation -and strange stuff. You are welcome to the lot, with due consideration of -the COPYRIGHT files stashed in the distributions. You are also invited -to contribute bugfixes and drivers for new and exotic radios, telephones -and sundials. This distribution is normally available by anonymous ftp -as the compressed tar archive xntp-<version>.tar.Z in the pub/ntp directory -on louie.udel.edu. - -The base directory contains the distributions and related stuff. The files -marked with a "*" are not distributed, but generated. Most of -the subdirectories contain README files describing their contents. The -base directory ./ includes: - -COPYRIGHT file specifying copyright conditions, together with a - list of major authors and electric addresses. - -Config * configuration file built by the configuration script - "make makeconfig" and used to build the makefiles in the - various subdirectories. Do not edit. - -Config.local * Unless you have a reference clock (besides the local - computer clock) or want to change the default installation - directory (/usr/local/bin) not action is needed. For - configuring a reference clock a "make refconf" should - suffice. Diehards can still use an editor on this file. - -Config.local.dist file used to generate a plausible Config.local by commands - such as "make Config.local.green". - -Config.sed * sed script used to build makefiles from the - configuration file. Do not edit. - -Makefile this is the root of the makefile tree. Do not edit. - (Contents under pressure - qualified personel only 8-) - -PORTING contains useful information for porting to unexplored - new systems. - -RELNOTES instructions for compiling and installing the daemon and - supporting programs. - -README this file. - -TODO our current problems where we could need help. - -adjtime directory containing the sources for the adjtime daemon - for HP/UX systems. - -authstuff directory containing sources for miscellaneous programs - to test, calibrate and certify the cryptographic - mechanisms for DES and MD5 based authentication. These - programs do not include the cryptographic routines - themselves, so are free of U.S. export restrictions. - -clockstuff directory containing sources for miscellaneous programs - to test certain auxilliary programs used with some - kernel configurations, together with a program to - calculate propagation delays for use with radio clocks - and national time dissemination services such as - WWV/WWVH, WWVB and CHU. - -compilers directory containing configuration scripts for various - compilers and operating systems. - -conf directory containing a motley collection of - configuration files for various systems. For example - only. - -doc directory containing miscellaneous man pages and memos - useful for installation and subnet management. - -gadget directory containing instructions and construction data - for a mysterious little box used as a CHU radio - demodulator and/or a level converter-pulse generator for - a precision 1-pps signal. - -include directory containing include header files used by most - programs in the distribution. - -hints directory containing files with hints on particular - topics like installation on specific OS variants or - general information. - -kernel directory containing sources for kernel programs such as - line disciplines and STREAMS modules used with the CHU - decoder and precision 1-pps signals. - -lib directory containing sources for the library programs - used by most programs in the distribution. - -machines directory containing configuration scripts for various - operating systems. - -ntpdate directory containing sources for a program to set the - local machine time from one or more remote machines - running NTP. Operates like rdate, but much more - accurate. - -ntpq directory containing sources for a utility program to - query local and remote NTP peers for state variables and - related timekeeping information. This program conforms - to Appendix A of the NTP Version 3 Specification RFC - 1305. - -ntptrace directory containing sources for a utility program that - can be used to reveal the chain of NTP peers from a - designated peer to the primary server at the root of the - timekeeping subnet. - -parse directory containing file belonging to the generic parse - reference clock driver. For reasonably simple clocks it - is possible to get away with about 3-4Kb of code. - additionally the SunOS 4.x streams module for parse is - residing here. - -parse/util some goodies for testing parse processing of DCF77 information. - (primarily for use on Suns, although others may work - also - possibly with a little porting.) - one little gem is dcfd.c - DCF77 decoder with ntp loopfilter - code for standalone DCF77 synchronisation without the full - works of NTP. - Dcfd.c has been ported to FreeBSD for the Boeder DCF77 receiver - by Vincenzo Capuano. - -ppsclock directory containing sources for modifications to the - kernel asynchronous serial driver plus a STREAMS module - to capture a precision 1-pps signal. Useful on SunOS - 4.1.X systems only. - -refclocks directory containing reference clock configuration support - -scripts directory containing scripts to build the configuration - file "config" in this directory and then the makefiles - used in various dependent directories. - the subdirectories monitoring and support hold various - perl and shell scripts for visualising synchronisation - and daemon startup. - -util directory containing sources for various utility and - testing programs. - -xntpd directory containing sources for the NTP Version 3 daemon. - -xntpdc directory containing sources for a utility program to - query local and remote NTP peers for state variables and - related timekeeping information. This program is - specific to this implmentation of NTP Version 3 and does - not conform to Appendix A of the NTP Version 3 - Specification RFC 1305. - -xntpres directory containing sources for a name-resolution - program used in some configurations of NTP Version 3. diff --git a/usr.sbin/xntpd/README.FreeBSD b/usr.sbin/xntpd/README.FreeBSD deleted file mode 100644 index 3d41380f82c3..000000000000 --- a/usr.sbin/xntpd/README.FreeBSD +++ /dev/null @@ -1,15 +0,0 @@ - $FreeBSD$ - -This version of NTP was converted to the BSD-style Makefile system by -Garrett Wollman (wollman@FreeBSD.org); it is based on version -3.4e (beta) from the University of Delaware. - -Besides the Makefile changes, the DES code has been completely removed -in order to make this code exportable. If you have a legal copy of -`authdes.c', you can just add it to the lib/ directory and add `-DDES' -to the AUTHDEFS in Makefile.inc. - -You can change CLOCKDEFS in the same file to add other reference clocks. - -This port should work under either FreeBSD 1.1 or FreeBSD 2.0. For -1.1, change the `-DSYS_44BSD' in Makefile.inc to `-DSYS_386BSD'. diff --git a/usr.sbin/xntpd/RELNOTES b/usr.sbin/xntpd/RELNOTES deleted file mode 100644 index ab3aebe25bd1..000000000000 --- a/usr.sbin/xntpd/RELNOTES +++ /dev/null @@ -1,216 +0,0 @@ -For special hints on setup/compilation/installation and other general -topics you may persue the files in the hints directory. - -This file contains the usual instructions to compile and install the programs in -this distribution. To make these programs: - -(0) Make sure that you have all necessary tools for building executables. - These tools include cc/gcc, make, awk, sed, tr, sh, grep, egrep and - a few others. Not all of these tools exist in the standard distribution - of todays UNIX versions (compilers are likely to be an extra product). - For a successful build all of these tools should be accessible via the - current path. - -(1) By default, if there is no Config.local, the system will generate one - to support a local ref clock (i.e. run off the system clock). - Greenhorns can skip on to (2). - - HACKers can create a Config.local and choose the compilation options, - install destination directory and clock drivers. - A template for Config.local can be found in Config.local.dist. - There are two Configurations that can be auto-generated: - make Config.local.local # network configuration plus local - # reference clock (the default) - make Config.local.NO.clock # network only configuration - - To set up for a radio clock, type "make refconf" and answer the questions - about PLL, PPS and radio clock type. - If this is the first use of the ref clock, don't forget to make suitable - files in /dev/. - - For custom tailored configuration copying Config.local.dist to Config.local - and editing Config.local to suit the local needs is neccessary (at most - 3 lines to change), or use one of the make's above and then tweak it. - Config.local can also be used to override common settings from the - machines/* files like the AUTHDEFS= to select very specific configurations. - Please use this feature with care and don't be disappointed if it doesn't - work the way you expect. - -(2) Type "make" to compile everything of general interest. Expect few or - no warnings using cc and a moderate level of warnings using gcc. - Note: On some Unix platforms the use of gcc can result in quite a few - complaints about system header files and type problems within xntp - code. This is usually the case when the OS header files are not up - up to ANSI standards or GCCISMs. (There may, however, be still some - inconsistencies in the code) - - Other known problems stem from bugs/features/... in utility programs - of some vendors. - - See section "build problems" for known problems and possible work- - arounds. - - Each time you change the configuration a script that pokes your hard- and - software will be run to build the actual configuration files. - If the script fails, it will give you a list of machines it knows about. - You can override the automatic choice by cd to the ../machines directory - and typing "make makeconfig OS=<machine>", where <machine> is one of the - file names in the ../machine directory. - - The shell script will attempt to find the gcc compiler and, if - found, will use it instead of the cc compiler. You can override - this automatic choice by cd to the ../machines directory and typing - "make makeconfig COMP=<compiler>", where <compiler> is one of the file - names in the ../compilers directory. This can be combined with - the OS argument above. - - The configuration step can be separatly invoked by "make makeconfig". - - Note that any reconfiguration will result in cleaning the old - program and object files. - -(3) Assuming you have write permission on the install destination directory, - type "make install" to install the binaries in the destination directory. - At the time of writing this includes - the programs xntpd (the daemon), xntpdc (an xntpd-dependent query - program), ntpq (a standard query program), ntpdate (an rdate - replacement for boot time date setting and sloppy time keeping) - and xntpres (a program which provides name resolver support for - some xntpd configurations). - -(4) You are now ready to configure the daemon and start it. At this - point it might be useful to format and print the file doc/notes.me - and read a little bit. The sections on configuration and on the - tickadj program will be immediately useful. - -Additional "make" target you might find useful are: - -clean cleans out object files, programs and temporary files - -dist makes a new distribution file (also cleans current binaries) - All usual scratch and backup files (*.rej, *.orig, *.o, *~ - core, lint*.errs, executables, tags, Makefile.bak, make.log) - will be removed. The distribution is created in a tar file - (file name: <prefix><version>.tar.<compression suffix> - with - the prefix usually being ../xntp- and a compression suffix - of .Z (compress)) - Note: the file Config.local will never be included in the - distribution tar file. For configuration hints to propagate - in in distribution changes must be made to Config.local.dist. - -depend possible maker of hazardous waste - -refconf a target to interactively configure reference clock support. - This should work for you, but has not yet been tested on - the more exotic Unix ports (mostly the supercomputer ones). - -Bug reports of a general nature can be sent to David Mills (mills@udel.edu). -Reports concerning specific hardware or software systems mentioned in the -COPYRIGHT file should be sent to the author, with copy to David Mills for -archive. - -The distribution has been compiled and run on at least the following -machines, operating systems and compilers. In all known cases, if -the gcc compiler eats it with some success, the cc compiler also enjoys -the meal. The converse is not always true. See the conf directory for -test suites known to compile with various radio clocks; however, not all -the combinations that compile have been tested. - - VAX-11/785 4.3 tahoe cc no REFCLOCK (dm 93/11/20) - Sun3 SunOS 4.1.1 gcc no REFCLOCK (pb 93/10/25) - Sun4 SunOS 4.1.1 gcc all REFCLOCK drivers (dm 93/10/25) - Sun4 SunOS 4.1.3 gcc all REFLCOCK drivers - Sun4 SunOS 5.1 gcc no REFCLOCK (pb 93/10/25) - Sun4 SunOS 5.2 gcc no REFCLOCK (dm 93/11/20) - Sun4 SunOS 5.2 gcc PARSE REFCLOCK (kd 93/11/10) - Sun4 SunOS 5.3 gcc local (pb 93/11/10) - HP700 HPUX 9.0 cc no REFCLOCK - hp7xx HPUX 9.01 cc local + PARSE (kd 93/10/26) - HP3xx HPUX 9.01 cc no REFCLOCK (pb 93/10/25) - HP3xx HPUX 8.0 cc no REFCLOCK (pb 93/10/25) - MIPS Ultrix 4.3a gcc WWVB clock (dm 93/11/20) - MIPS Ultrix 3a gcc green (pb 93/10/26) - ALPHA OSF 1.2a gcc no REFCLOCK (dm 93/11/20) - ALPHA OSF 1.3 gcc no REFCLOCK (pb 93/10/25) - ALPHA OSF1 1.3 gcc green (pb 93/10/26) - Convex Convex OS 10.1 ? ? - SGI IRIX 4.0.5F gcc no REFCLOCK (pb 93/11/10) - AIX 3.2 ? ? - A/UX 2.0.1, 3.x.x gcc LOCAL_CLOCK (jmj (94/01/26 see hints) - RS6000 AIX 3.2 gcc no REFCLOCK - MX500 Sinix-m V5.40 cc PARSE REFCLOCK - S2000 Sequent PTX 1.4 cc LOCAL_CLOCK (kd 93/11/10) - S2000 Sequent PTX 1.4 gcc LOCAL_CLOCK (kd 93/11/10) - PC FreeBSD gcc LOCAL_CLOCK see "build problems" - PC NetBSD? gcc LOCAL_CLOCK possibly see "build problems" - PC BSD/386 1.0 gcc LOCAL_CLOCK possibly see "build problems" - PC Linux (pl14) gcc LOCAL_CLOCK (dw 93/10/30) - PC Dell SVR4 v2.2 gcc ? (tl 93/12/30) - PC Unixware1/SVR4 cc no tickadj, ? (ras 93/04/11) - NCR3445 NCR SVR4 cc LOCAL_CLOCK (tm 93/11/29) - - pb: Piete Brooks - kd: Frank Kardel - dw: Torsten Duwe (duwe@informatik.uni-erlangen.de) - dm: David Mills (mills@udel.edu) - tl: Tony Lill <ajlill@tlill.hookup.net> - tm: Tom Moore <Tom.Moore@DaytonOH.NCR.COM> - jmj: Jim Jagielski <jim@jagubox.gsfc.nasa.gov> - ras: Ray Schnitzler <schnitz@unipress.com> - -Build Problems (and workaround): - -During testing/porting we have found some -of "make" and "sh" and "awk" features in different implementations. -If you have problems other tha the one listed below please check for -usualy things like the latest sh compatible pd shell in your own -environment. Things like this are known to hinder compilation if -they are not fully compatible with sh or are buggy. - -Current build problem on (Mac) NetBSD, possibly BSDI and 386BSD: - pmake (e. g. NetBSD on MAC, possible other BNR2+pmake systems) - Following Makefile construction fails for no - apparent reason (at least to me) - doit: - $(MAKE) MAKE=\"$(MAKE)\" all - - all: - @echo all done. - - for the "make MAKE=make" call but not for "make" or - "make -e MAKE=make". Use the last form if you suffer - from that kind of make problems. (Easily detected - by failure to build with the message: - "don't know how to make make". - - On BSD/386 the solution is to get GNU make and run build as: - % gnumake MAKE=gnumake - Note that BSD/386 1.0's "sed" goes into an infinite loop if - you try to make the "refconf" target -- so edit Config.local - by hand if you have a reference clock. (BSD/386 1.1 will fix - this "sed" bug.) - - The NetBSD people claim that this problem goes away - when you compile make with POSIX compilation options. - -The known sh and some make pecularities have already been taken care of. - -Usually the vendor should fix these bugs in vital utilities. -We try to circumvent these bugs in a hopefully portable way. -If you can reproduce these bugs on your system please bug your -vendor/developer group to fix them. We are not trying anything fancy -in here (except for starting sub-makes) and we are shocked that even -the most common tools fail so miserably. By the time you get this -code the above utilities may already have been fixed. Hopefully one -day we do not have to cope with this kind of broken utilities. - Frank Kardel - -William L. Jones <jones@chpc.utexas.edu> -Dennis Ferguson (Advanced Network Systems) <dennis@ans.net> -Lars Mathiesen (University of Copenhagen) <thorinn@diku.dk> -David Mills <mills@udel.edu> -Frank Kardel <Frank.Kardel@informatik.uni-erlangen.de> -Piete Brooks <Piete.Brooks@cl.cam.ac.uk> - --- and a cast of thousands -- see the COPYRIGHT file -16 November 1993 diff --git a/usr.sbin/xntpd/TODO b/usr.sbin/xntpd/TODO deleted file mode 100644 index e4bbe4713c94..000000000000 --- a/usr.sbin/xntpd/TODO +++ /dev/null @@ -1,26 +0,0 @@ -# -# TODO,v 3.5 1994/01/25 19:03:55 kardel Exp -# -This file contains problems known to the authors that still need to be done. -We would appreciate if you could spare some of your time to look through -these topics and help us with some open questions. Most of the topics -pertain to specific architectures where we have no direct access or not -the time or expertise to currently track down the problem further. -If you don't know what we are talking about in the topics don't bother -with finding out - somebody else will probably solve that problem. - -Before you try to send a solution to mills@udel.edu please check whether -this problem still exists in the distribution on louie.udel.edu. - -Thank you for your help ! - Dave Mills - Frank Kardel - Piete Brooks - -Open issues: - -Apollo: - - terminal affiliation - Check whether thing are still correct in respect to breaking - terminal affiliation - horrible stories are told in the code. - File affected: xntpd/ntpd.c diff --git a/usr.sbin/xntpd/VERSION b/usr.sbin/xntpd/VERSION deleted file mode 100644 index a51bf7747d66..000000000000 --- a/usr.sbin/xntpd/VERSION +++ /dev/null @@ -1 +0,0 @@ -version=3.4e (beta multicast) diff --git a/usr.sbin/xntpd/authstuff/Makefile b/usr.sbin/xntpd/authstuff/Makefile deleted file mode 100644 index bf6ec874cc73..000000000000 --- a/usr.sbin/xntpd/authstuff/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# -# $FreeBSD$ -# -# Most of the programs in this directory are completely useless for the -# NTP configuration that we provide by default. -# We provide the `md5' program as a public service. - -CFLAGS+= -I${.CURDIR}/../include - -DPADD= ${LIBNTP} -LDADD= ${LIBNTP} - -PROG= md5 - -SRCS= md5driver.c -NOMAN= - -install: - -.include <bsd.prog.mk> diff --git a/usr.sbin/xntpd/authstuff/README b/usr.sbin/xntpd/authstuff/README deleted file mode 100644 index 2985751cc0c0..000000000000 --- a/usr.sbin/xntpd/authstuff/README +++ /dev/null @@ -1,13 +0,0 @@ -README file for directory ./authstuff of the NTP Version 3 distribution - -This directory contains the sources for miscellaneous programs to test, -validate and calibreate cryptographic routines used by NTP. These include - -authcert.c used to certify the DES and MD5 message digest algorithms - work properly. See the source for directions for use. - -authspeed.c used to determing the running time for DES and MD5 - messge digest algorithms. See the source for directions - for use. - -For other programs, see the source files. diff --git a/usr.sbin/xntpd/authstuff/auth.samplekeys b/usr.sbin/xntpd/authstuff/auth.samplekeys deleted file mode 100644 index 761c7c251a66..000000000000 --- a/usr.sbin/xntpd/authstuff/auth.samplekeys +++ /dev/null @@ -1,44 +0,0 @@ -# -# Sample key file, also used for testing. -# -# Note that there are three formats for keys. Standard format is a -# hex format with the low order bit of each byte being a parity -# bit, a la the NBS standard. NTP format is also hex, but uses the -# high order bit of each byte for parity. Ascii format simply encodes -# a 1-8 character ascii string as a key. Note that because of the -# simple tokenizing routine, the characters ' ', '#', '\t', '\n' and -# '\0' can't be used in an ascii key. Everything else is fair game, though. -# - -1 S 0101010101010101 # odd parity 0 key -2 N 8080808080808080 # and again -3 A ugosnod -4 A BigbOObs -5 S f1f1f1f1f1f1f1f1 -6 N f8f8f8f8f8f8f8f8 # same as key 5 -7 S f8f8f8f8f8f8f8f8 # not same as key 6 -8 A a # short ascii keys are zero padded -9 A &^%$@!*( -10 S 01020407080bf1f1 -11 N 4040404040404040 -12 A more -13 A random -14 A keys -15 A password # 15 used as password by runtime configuration -# -16 M password # MD5 key -17 M secret -18 M key1 -19 M key2 -20 M foobar -21 M tick -22 M tock -23 M key23 -24 M key24 -25 M key25 -26 M a -27 M few -28 M more -29 M random -30 M md5 -31 M keys! diff --git a/usr.sbin/xntpd/authstuff/auth.speed b/usr.sbin/xntpd/authstuff/auth.speed deleted file mode 100644 index ccf89938e522..000000000000 --- a/usr.sbin/xntpd/authstuff/auth.speed +++ /dev/null @@ -1,33 +0,0 @@ -Authentication delays (us) DES MD5 -------------------------------------------- -IBM RS6000/990 10 28 -IBM RS6000/590 10 29 -HP 9000/735 hpux9.03 snavely 10 33 -DEC 3000/400 OSF/1 bunnylou 14 35 -HP 9000/730 hpux8.07(+OV) 16 55 -SGI Indigo R4000 19 48 -HP 9000/720 hpux8.07 21 66 -IBM RS6000/250 20 39 -IBM RS6000/370 21 43 -IBM RS6000/580 22 43 -SGI 4/35 38 110 -DECstation 5000/240 cowbird 39 81 -IBM RS6000/530H 40 83 -Sun4c/75 SS2 43 96 -Sun4c/50 IPX malarky 47 94 -DECstation 5000/33 sundeck 49 106 -IBM RS6000/530 51 107 -SGI Indigo 54 115 -DECstation 5000/125 herald 63 136 -IBM RS6000/320 69 139 -Sun4c/65 SS1+ pogo 72 159 -Sun4c/40 IPC grundoon 73 163 -Sun4c/60 SS1 albert 95 199 -Sun4c/20 SLC 95 203 -DECstation 3100 sheol 98 214 -DECstation 2100 circus 126 278 -VAX 780 985 ? - -Updated 26 April 1994 -David L. Mills - diff --git a/usr.sbin/xntpd/authstuff/authcert.c b/usr.sbin/xntpd/authstuff/authcert.c deleted file mode 100644 index 19ade8c9980c..000000000000 --- a/usr.sbin/xntpd/authstuff/authcert.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * This file, and the certdata file, shamelessly stolen - * from Phil Karn's DES implementation. - */ - -#include <stdio.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> - -#define DES -#include "ntp_stdlib.h" - -u_char ekeys[128]; -u_char dkeys[128]; - -static void get8 P((U_LONG *)); -static void put8 P((U_LONG *)); - -void -main() -{ - U_LONG key[2], plain[2], cipher[2], answer[2], temp; - int i; - int test; - int fail; - - for(test = 0; !feof(stdin); test++){ - get8(key); - DESauth_subkeys(key, ekeys, dkeys); - printf(" K: "); put8(key); - get8(plain); - printf(" P: "); put8(plain); - get8(answer); - printf(" C: "); put8(answer); - for (i = 0; i < 2; i++) - cipher[i] = htonl(plain[i]); - DESauth_des(cipher, ekeys); - for (i = 0; i < 2; i++) { - temp = ntohl(cipher[i]); - if (temp != answer[i]) - break; - } - - fail = 0; - if (i != 2) { - printf(" Encrypt FAIL"); - fail++; - } - DESauth_des(cipher, dkeys); - for (i = 0; i < 2; i++) { - temp = ntohl(cipher[i]); - if (temp != plain[i]) - break; - } - if (i != 2) { - printf(" Decrypt FAIL"); - fail++; - } - if (fail == 0) - printf(" OK"); - printf("\n"); - } -} - -static void -get8(lp) - U_LONG *lp; -{ - int t; - U_LONG l[2]; - int i; - - l[0] = l[1] = 0; - for (i = 0; i < 8; i++) { - scanf("%2x", &t); - if (feof(stdin)) - exit(0); - l[i / 4] <<= 8; - l[i / 4] |= (U_LONG)(t & 0xff); - } - *lp = l[0]; - *(lp + 1) = l[1]; -} - -static void -put8(lp) - U_LONG *lp; -{ - int i; - - - for(i = 0; i < 2; i++) - printf("%08lx", (u_long)(*lp++)); -} diff --git a/usr.sbin/xntpd/authstuff/authspeed.c b/usr.sbin/xntpd/authstuff/authspeed.c deleted file mode 100644 index 93965d2e278c..000000000000 --- a/usr.sbin/xntpd/authstuff/authspeed.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - * authspeed - figure out how long it takes to do an NTP encryption - */ - -#if defined(SYS_HPUX) || defined(SYS_AUX3) || defined(SYS_AUX2) || defined(SOLARIS) || defined(SYS_SVR4) || defined(SYS_PTX) || defined(SYS_UNIXWARE1) -#define FAKE_RUSAGE -#endif - -#include <stdio.h> -#include <sys/types.h> -#include <sys/time.h> -#include <sys/resource.h> -#ifdef FAKE_RUSAGE -#include <sys/param.h> -#include <sys/times.h> -#endif - -#include "ntp_fp.h" -#include "ntp_stdlib.h" - -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -#define DEFLOOPS -1 - -#define DEFDELAYLOOPS 20000 -#define DEFCOSTLOOPS 2000 - -char *progname; -int debug; - -struct timeval tstart, tend; -#ifdef FAKE_RUSAGE -struct tms rstart, rend; -#define getrusage(foo, t) times(t) -#define RUSAGE_SELF 0 -#else -struct rusage rstart, rend; -#endif - -l_fp dummy1, dummy2; -u_long dummy3; - -U_LONG pkt[15]; - -int totalcost = 0; -double rtime; -double vtime; - -int domd5 = 0; - -static void dodelay P((int)); -static void docheap P((int)); -static void docost P((int)); -static void subtime P((struct timeval *, struct timeval *, double *)); - -/* - * main - parse arguments and handle options - */ -void -main(argc, argv) -int argc; -char *argv[]; -{ - int c; - int loops; - int i; - int errflg = 0; - extern int ntp_optind; - extern char *ntp_optarg; - - progname = argv[0]; - loops = DEFLOOPS; - while ((c = ntp_getopt(argc, argv, "cdmn:")) != EOF) - switch (c) { - case 'c': - totalcost++; - break; - case 'd': - ++debug; - break; - case 'm': - domd5 = 16; /* offset into list of keys */ - break; - case 'n': - loops = atoi(ntp_optarg); - if (loops <= 0) { - (void) fprintf(stderr, - "%s: %s is unlikely to be a useful number of loops\n", - progname, ntp_optarg); - errflg++; - } - break; - default: - errflg++; - break; - } - if (errflg || ntp_optind == argc) { - (void) fprintf(stderr, - "usage: %s [-d] [-n loops] [ -c ] auth.samplekeys\n", - progname); - exit(2); - } - printf("Compute timing for "); - if (domd5) - printf("MD5"); - else - printf("DES"); - printf(" based authentication.\n"); - - init_auth(); - authreadkeys(argv[ntp_optind]); - for (i = 0; i < 16; i++) { - if (!auth_havekey(i + domd5)) { - errflg++; - (void) fprintf(stderr, "%s: key %d missing\n", - progname, i + domd5); - } - } - - if (errflg) { - (void) fprintf(stderr, - "%s: check syslog for errors, or use file with complete set of keys\n", - progname); - exit(1); - } - - if (loops == DEFLOOPS) { - if (totalcost) - loops = DEFCOSTLOOPS; - else - loops = DEFDELAYLOOPS; - } - - dummy1.l_ui = 0x80808080; - dummy1.l_uf = 0xffffff00; - dummy3 = 0x0aaaaaaa; - - for (i = 0; i < 12; i++) - pkt[i] = i * 0x22222; - - if (totalcost) { - if (totalcost > 1) - docheap(loops); - else - docost(loops); - } else { - dodelay(loops); - } - - printf("total real time: %.3f\n", rtime); - printf("total CPU time: %.3f\n", vtime); - if (totalcost) { - printf("real cost (in seconds): %.6f\n", - rtime/(double)loops); - printf("CPU cost (in seconds): %.6f\n", - vtime/(double)loops); - printf("\nThis includes the cost of a decryption plus the\n"); - printf("the cost of an encryption, i.e. the cost to process\n"); - printf("a single authenticated packet.\n"); - } else { - printf("authdelay in the configuration file\n"); - printf("real authentication delay: %.6f\n", - rtime/(double)loops); - printf("authentication delay in CPU time: %.6f\n", - vtime/(double)loops); - printf("\nThe CPU delay is probably the best bet for\n"); - printf("authdelay in the configuration file\n"); - } - exit(0); -} - - -/* - * dodelay - do the delay measurement - */ -static void -dodelay(loops) - int loops; -{ - double vtime1, rtime1, vtime2, rtime2; - register int loopcount; - /* - * If we're attempting to compute the cost of an auth2crypt() - * for first compute the total cost, then compute the - * cost of only doing the first step, auth1crypt(). What - * remains is the cost of auth2crypt. - */ - loopcount = loops; - (void) gettimeofday(&tstart, (struct timezone *)0); - (void) getrusage(RUSAGE_SELF, &rstart); - - while (loopcount-- > 0) { - auth1crypt((loops & 0xf) + domd5, pkt, 48); - L_ADDUF(&dummy1, dummy3); - auth2crypt((loops & 0xf) + domd5, pkt, 48); - } - - (void) getrusage(RUSAGE_SELF, &rend); - (void) gettimeofday(&tend, (struct timezone *)0); - - subtime(&tstart, &tend, &rtime1); -#ifdef FAKE_RUSAGE - vtime1 = (rend.tms_utime - rstart.tms_utime) * 1.0 / HZ; -#else - subtime(&rstart.ru_utime, &rend.ru_utime, &vtime1); -#endif -printf("Time for full encryptions is %f rusage %f real\n", vtime1, rtime1); - loopcount = loops; - (void) gettimeofday(&tstart, (struct timezone *)0); - (void) getrusage(RUSAGE_SELF, &rstart); - - while (loopcount-- > 0) { - auth1crypt((loops & 0xf) + domd5, pkt, 48); - } - - (void) getrusage(RUSAGE_SELF, &rend); - (void) gettimeofday(&tend, (struct timezone *)0); - - subtime(&tstart, &tend, &rtime2); -#ifdef FAKE_RUSAGE - vtime2 = (rend.tms_utime - rstart.tms_utime) * 1.0 / HZ; -#else - subtime(&rstart.ru_utime, &rend.ru_utime, &vtime2); -#endif - -printf("Time for auth1crypt is %f rusage %f real\n", vtime2, rtime2); - vtime = vtime1 - vtime2; - rtime = rtime1 - rtime2; -} - - -/* - * docheap - do the cost measurement the cheap way - */ -static void -docheap(loops) - register int loops; -{ - - (void) authhavekey(3 + domd5); - - (void) gettimeofday(&tstart, (struct timezone *)0); - (void) getrusage(RUSAGE_SELF, &rstart); - - while (loops-- > 0) { - auth1crypt(3 + domd5, pkt, 48); - L_ADDUF(&dummy1, dummy3); - auth2crypt(3 + domd5, pkt, 48); - (void) authdecrypt(3 + domd5, pkt, 48); - } - - (void) getrusage(RUSAGE_SELF, &rend); - (void) gettimeofday(&tend, (struct timezone *)0); - - subtime(&tstart, &tend, &rtime); -#ifdef FAKE_RUSAGE - vtime = (rend.tms_utime - rstart.tms_utime) * 1.0 / HZ; -#else - subtime(&rstart.ru_utime, &rend.ru_utime, &vtime); -#endif -} - - -/* - * docost - do the cost measurement - */ -static void -docost(loops) - register int loops; -{ - - (void) gettimeofday(&tstart, (struct timezone *)0); - (void) getrusage(RUSAGE_SELF, &rstart); - - while (loops-- > 0) { - auth1crypt((loops & 0xf) + domd5, pkt, 48); - L_ADDUF(&dummy1, dummy3); - auth2crypt((loops & 0xf) + domd5, pkt, 48); - (void) authdecrypt(((loops+1) & 0xf) + domd5, pkt, 48); - } - - (void) getrusage(RUSAGE_SELF, &rend); - (void) gettimeofday(&tend, (struct timezone *)0); - - subtime(&tstart, &tend, &rtime); -#ifdef FAKE_RUSAGE - vtime = (rend.tms_utime - rstart.tms_utime) * 1.0 / HZ; -#else - subtime(&rstart.ru_utime, &rend.ru_utime, &vtime); -#endif -} - - -/* - * subtime - subtract two struct timevals, return double result - */ -static void -subtime(tvs, tve, res) - struct timeval *tvs, *tve; - double *res; -{ - long sec; - long usec; - - sec = tve->tv_sec - tvs->tv_sec; - usec = tve->tv_usec - tvs->tv_usec; - - if (usec < 0) { - usec += 1000000; - sec--; - } - - *res = (double)sec + (double)usec/1000000.; - return; -} diff --git a/usr.sbin/xntpd/authstuff/certdata b/usr.sbin/xntpd/authstuff/certdata deleted file mode 100644 index f9a818efecb8..000000000000 --- a/usr.sbin/xntpd/authstuff/certdata +++ /dev/null @@ -1,34 +0,0 @@ -0000000000000000 0000000000000000 8CA64DE9C1B123A7 -FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF 7359B2163E4EDC58 -3000000000000000 1000000000000001 958E6E627A05557B -1111111111111111 1111111111111111 F40379AB9E0EC533 -0123456789ABCDEF 1111111111111111 17668DFC7292532D -1111111111111111 0123456789ABCDEF 8A5AE1F81AB8F2DD -0000000000000000 0000000000000000 8CA64DE9C1B123A7 -FEDCBA9876543210 0123456789ABCDEF ED39D950FA74BCC4 -7CA110454A1A6E57 01A1D6D039776742 690F5B0D9A26939B -0131D9619DC1376E 5CD54CA83DEF57DA 7A389D10354BD271 -07A1133E4A0B2686 0248D43806F67172 868EBB51CAB4599A -3849674C2602319E 51454B582DDF440A 7178876E01F19B2A -04B915BA43FEB5B6 42FD443059577FA2 AF37FB421F8C4095 -0113B970FD34F2CE 059B5E0851CF143A 86A560F10EC6D85B -0170F175468FB5E6 0756D8E0774761D2 0CD3DA020021DC09 -43297FAD38E373FE 762514B829BF486A EA676B2CB7DB2B7A -07A7137045DA2A16 3BDD119049372802 DFD64A815CAF1A0F -04689104C2FD3B2F 26955F6835AF609A 5C513C9C4886C088 -37D06BB516CB7546 164D5E404F275232 0A2AEEAE3FF4AB77 -1F08260D1AC2465E 6B056E18759F5CCA EF1BF03E5DFA575A -584023641ABA6176 004BD6EF09176062 88BF0DB6D70DEE56 -025816164629B007 480D39006EE762F2 A1F9915541020B56 -49793EBC79B3258F 437540C8698F3CFA 6FBF1CAFCFFD0556 -4FB05E1515AB73A7 072D43A077075292 2F22E49BAB7CA1AC -49E95D6D4CA229BF 02FE55778117F12A 5A6B612CC26CCE4A -018310DC409B26D6 1D9D5C5018F728C2 5F4C038ED12B2E41 -1C587F1C13924FEF 305532286D6F295A 63FAC0D034D9F793 -0101010101010101 0123456789ABCDEF 617B3A0CE8F07100 -1F1F1F1F0E0E0E0E 0123456789ABCDEF DB958605F8C8C606 -E0FEE0FEF1FEF1FE 0123456789ABCDEF EDBFD1C66C29CCC7 -0000000000000000 FFFFFFFFFFFFFFFF 355550B2150E2451 -FFFFFFFFFFFFFFFF 0000000000000000 CAAAAF4DEAF1DBAE -0123456789ABCDEF 0000000000000000 D5D44FF720683D0D -FEDCBA9876543210 FFFFFFFFFFFFFFFF 2A2BB008DF97C2F2 diff --git a/usr.sbin/xntpd/authstuff/keyparity.c b/usr.sbin/xntpd/authstuff/keyparity.c deleted file mode 100644 index 8a12c13f3399..000000000000 --- a/usr.sbin/xntpd/authstuff/keyparity.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * keyparity - add parity bits to key and/or change an ascii key to binary - */ - -#include <stdio.h> -#include <sys/types.h> -#include <ctype.h> - -#include "ntp_string.h" -#include "ntp_stdlib.h" - -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -/* - * Types of ascii representations for keys. "Standard" means a 64 bit - * hex number in NBS format, i.e. with the low order bit of each byte - * a parity bit. "NTP" means a 64 bit key in NTP format, with the - * high order bit of each byte a parity bit. "Ascii" means a 1-to-8 - * character string whose ascii representation is used as the key. - */ -#define KEY_TYPE_STD 1 -#define KEY_TYPE_NTP 2 -#define KEY_TYPE_ASCII 3 - -#define STD_PARITY_BITS 0x01010101 - -char *progname; -int debug; - -int ntpflag = 0; -int stdflag = 0; -int asciiflag = 0; -int ntpoutflag = 0; -int gotoopt = 0; - -static int parity P((u_long *)); -static int decodekey P((int, char *, u_long *)); -static void output P((u_long *, int)); - -/* - * main - parse arguments and handle options - */ -void -main(argc, argv) -int argc; -char *argv[]; -{ - int c; - int errflg = 0; - int keytype; - u_long key[2]; - extern int ntp_optind; - extern char *ntp_optarg; - - progname = argv[0]; - while ((c = ntp_getopt(argc, argv, "adno:s")) != EOF) - switch (c) { - case 'a': - asciiflag = 1; - break; - case 'd': - ++debug; - break; - case 'n': - ntpflag = 1; - break; - case 's': - stdflag = 1; - break; - case 'o': - if (*ntp_optarg == 'n') { - ntpoutflag = 1; - gotoopt = 1; - } else if (*ntp_optarg == 's') { - ntpoutflag = 0; - gotoopt = 1; - } else { - (void) fprintf(stderr, - "%s: output format must be `n' or `s'\n", - progname); - errflg++; - } - break; - default: - errflg++; - break; - } - if (errflg || ntp_optind == argc) { - (void) fprintf(stderr, - "usage: %s -n|-s [-a] [-o n|s] key [...]\n", - progname); - exit(2); - } - - if (!ntpflag && !stdflag) { - (void) fprintf(stderr, - "%s: one of either the -n or -s flags must be specified\n", - progname); - exit(2); - } - - if (ntpflag && stdflag) { - (void) fprintf(stderr, - "%s: only one of the -n and -s flags may be specified\n", - progname); - exit(2); - } - - if (!gotoopt) { - if (ntpflag) - ntpoutflag = 1; - } - - if (asciiflag) - keytype = KEY_TYPE_ASCII; - else if (ntpflag) - keytype = KEY_TYPE_NTP; - else - keytype = KEY_TYPE_STD; - - for (; ntp_optind < argc; ntp_optind++) { - if (!decodekey(keytype, argv[ntp_optind], key)) { - (void) fprintf(stderr, - "%s: format of key %s invalid\n", - progname, argv[ntp_optind]); - exit(1); - } - (void) parity(key); - output(key, ntpoutflag); - } - exit(0); -} - - - -/* - * parity - set parity on a key/check for odd parity - */ -static int -parity(key) - u_long *key; -{ - u_long mask; - int parity_err; - int bitcount; - int half; - int byte; - int i; - - /* - * Go through counting bits in each byte. Check to see if - * each parity bit was set correctly. If not, note the error - * and set it right. - */ - parity_err = 0; - for (half = 0; half < 2; half++) { /* two halves of key */ - mask = 0x80000000; - for (byte = 0; byte < 4; byte++) { /* 4 bytes per half */ - bitcount = 0; - for (i = 0; i < 7; i++) { /* 7 data bits / byte */ - if (key[half] & mask) - bitcount++; - mask >>= 1; - } - - /* - * If bitcount is even, parity must be set. If - * bitcount is odd, parity must be clear. - */ - if ((bitcount & 0x1) == 0) { - if (!(key[half] & mask)) { - parity_err++; - key[half] |= mask; - } - } else { - if (key[half] & mask) { - parity_err++; - key[half] &= ~mask; - } - } - mask >>= 1; - } - } - - /* - * Return the result of the parity check. - */ - return (parity_err == 0); -} - - -static int -decodekey(keytype, str, key) - int keytype; - char *str; - u_long *key; -{ - u_char keybytes[8]; - char *cp; - char *xdigit; - int len; - int i; - static char *hex = "0123456789abcdef"; - - cp = str; - len = strlen(cp); - if (len == 0) - return 0; - - switch(keytype) { - case KEY_TYPE_STD: - case KEY_TYPE_NTP: - if (len != 16) /* Lazy. Should define constant */ - return 0; - /* - * Decode hex key. - */ - key[0] = 0; - key[1] = 0; - for (i = 0; i < 16; i++) { - if (!isascii(*cp)) - return 0; - xdigit = strchr(hex, isupper(*cp) ? tolower(*cp) : *cp); - cp++; - if (xdigit == 0) - return 0; - key[i>>3] <<= 4; - key[i>>3] |= (u_long)(xdigit - hex) & 0xf; - } - - /* - * If this is an NTP format key, put it into NBS format - */ - if (keytype == KEY_TYPE_NTP) { - for (i = 0; i < 2; i++) - key[i] = ((key[i] << 1) & ~STD_PARITY_BITS) - | ((key[i] >> 7) & STD_PARITY_BITS); - } - break; - - case KEY_TYPE_ASCII: - /* - * Make up key from ascii representation - */ - memset(keybytes, 0, sizeof(keybytes)); - for (i = 0; i < 8 && i < len; i++) - keybytes[i] = *cp++ << 1; - key[0] = keybytes[0] << 24 | keybytes[1] << 16 - | keybytes[2] << 8 | keybytes[3]; - key[1] = keybytes[4] << 24 | keybytes[5] << 16 - | keybytes[6] << 8 | keybytes[7]; - break; - - default: - /* Oh, well */ - return 0; - } - - return 1; -} - - -/* - * output - print a hex key on the standard output - */ -static void -output(key, ntpformat) - u_long *key; - int ntpformat; -{ - int i; - - if (ntpformat) { - for (i = 0; i < 2; i++) - key[i] = ((key[i] & ~STD_PARITY_BITS) >> 1) - | ((key[i] & STD_PARITY_BITS) << 7); - } - (void) printf("%08x%08x\n", key[0], key[1]); -} diff --git a/usr.sbin/xntpd/authstuff/makeIPFP.c b/usr.sbin/xntpd/authstuff/makeIPFP.c deleted file mode 100644 index 8fabdb77de7c..000000000000 --- a/usr.sbin/xntpd/authstuff/makeIPFP.c +++ /dev/null @@ -1,345 +0,0 @@ -/* - * makeIPFP - make fast DES IP and FP tables - */ - -#include <stdio.h> -#include <sys/types.h> - -#include "ntp_stdlib.h" - -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -u_long IPL[256]; -u_long FPL[256]; - -char *progname; -int debug; - -static void perm P((u_char *, u_char *, u_long *, u_long *)); -static void doit P((void)); - -/* - * main - parse arguments and handle options - */ -void -main(argc, argv) -int argc; -char *argv[]; -{ - int c; - int errflg = 0; - extern int ntp_optind; - extern char *ntp_optarg; - - progname = argv[0]; - while ((c = ntp_getopt(argc, argv, "d")) != EOF) - switch (c) { - case 'd': - ++debug; - break; - default: - errflg++; - break; - } - if (errflg) { - (void) fprintf(stderr, "usage: %s [-d]\n", progname); - exit(2); - } - doit(); - exit(0); -} - - -/* - * Initial permutation table - */ -u_char IP[64] = { - 58, 50, 42, 34, 26, 18, 10, 2, - 60, 52, 44, 36, 28, 20, 12, 4, - 62, 54, 46, 38, 30, 22, 14, 6, - 64, 56, 48, 40, 32, 24, 16, 8, - 57, 49, 41, 33, 25, 17, 9, 1, - 59, 51, 43, 35, 27, 19, 11, 3, - 61, 53, 45, 37, 29, 21, 13, 5, - 63, 55, 47, 39, 31, 23, 15, 7 -}; - -/* - * Inverse initial permutation table - */ -u_char FP[64] = { - 40, 8, 48, 16, 56, 24, 64, 32, - 39, 7, 47, 15, 55, 23, 63, 31, - 38, 6, 46, 14, 54, 22, 62, 30, - 37, 5, 45, 13, 53, 21, 61, 29, - 36, 4, 44, 12, 52, 20, 60, 28, - 35, 3, 43, 11, 51, 19, 59, 27, - 34, 2, 42, 10, 50, 18, 58, 26, - 33, 1, 41, 9, 49, 17, 57, 25 -}; - - -/* - * Bit order after the operation - * - * ((left & 0x55555555) << 1) | (right & 0x55555555) - */ -u_char IPLbits[32] = { - 2, 34, 4, 36, 6, 38, 8, 40, - 10, 42, 12, 44, 14, 46, 16, 48, - 18, 50, 20, 52, 22, 54, 24, 56, - 26, 58, 28, 60, 30, 62, 32, 64 -}; - - -/* - * Bit order after the operation - * - * (left & 0xaaaaaaaa) | ((right & 0xaaaaaaaa) >> 1) - */ -u_char IPRbits[32] = { - 1, 33, 3, 35, 5, 37, 7, 39, - 9, 41, 11, 43, 13, 45, 15, 47, - 17, 49, 19, 51, 21, 53, 23, 55, - 25, 57, 27, 59, 29, 61, 31, 63 -}; - - -/* - * Bit order after the operation - * - * ((left & 0x0f0f0f0f) << 4) | (right & 0x0f0f0f0f) - */ -u_char FPLbits[32] = { - 5, 6, 7, 8, 37, 38, 39, 40, - 13, 14, 15, 16, 45, 46, 47, 48, - 21, 22, 23, 24, 53, 54, 55, 56, - 29, 30, 31, 32, 61, 62, 63, 64 -}; - - -/* - * Bit order after the operation - * - * (left & 0xf0f0f0f0) | ((right & 0xf0f0f0f0) >> 4) - */ -u_char FPRbits[32] = { - 1, 2, 3, 4, 33, 34, 35, 36, - 9, 10, 11, 12, 41, 42, 43, 44, - 17, 18, 19, 20, 49, 50, 51, 52, - 25, 26, 27, 28, 57, 58, 59, 60 -}; - - -/* - * perm - do a permutation with the given table - */ -static void -perm(databits, permtab, leftp, rightp) - u_char *databits; - u_char *permtab; - u_long *leftp; - u_long *rightp; -{ - register u_long left; - register u_long right; - register u_char *PT; - register u_char *bits; - register int i; - - left = right = 0; - PT = permtab; - bits = databits; - - for (i = 0; i < 32; i++) { - left <<= 1; - if (bits[PT[i]-1]) - left |= 1; - } - - for (i = 32; i < 64; i++) { - right <<= 1; - if (bits[PT[i]-1]) - right |= 1; - } - - *leftp = left; - *rightp = right; -} - - -/* - * doit - make up the tables - */ -static void -doit() -{ - u_char bits[64]; - u_long left; - u_long right; - int tabno; - int i; - int ind0, ind1, ind2, ind3; - int ind4, ind5, ind6, ind7; - int octbits; - - memset((char *)bits, 0, sizeof bits); - - /* - * Do the rounds for the IP table. We save the results of - * this as well as printing them. Note that this is the - * left-half table, the right half table will be identical. - */ - printf("static u_long IP[256] = {"); - for (tabno = 0; tabno < 4; tabno++) { - i = tabno * 8; - ind7 = IPLbits[i] - 1; - ind6 = IPLbits[i+1] - 1; - ind5 = IPLbits[i+2] - 1; - ind4 = IPLbits[i+3] - 1; - ind3 = IPLbits[i+4] - 1; - ind2 = IPLbits[i+5] - 1; - ind1 = IPLbits[i+6] - 1; - ind0 = IPLbits[i+7] - 1; - for (octbits = 0; octbits < 256; octbits++) { - if (octbits & (1 << 7)) - bits[ind7] = 1; - if (octbits & (1 << 6)) - bits[ind6] = 1; - if (octbits & (1 << 5)) - bits[ind5] = 1; - if (octbits & (1 << 4)) - bits[ind4] = 1; - if (octbits & (1 << 3)) - bits[ind3] = 1; - if (octbits & (1 << 2)) - bits[ind2] = 1; - if (octbits & (1 << 1)) - bits[ind1] = 1; - if (octbits & 1) - bits[ind0] = 1; - perm(bits, IP, &left, &right); - bits[ind7] = 0; - bits[ind6] = 0; - bits[ind5] = 0; - bits[ind4] = 0; - bits[ind3] = 0; - bits[ind2] = 0; - bits[ind1] = 0; - bits[ind0] = 0; - if (right != 0) { - fprintf(stderr, - "IP tabno %d oct %d right not zero\n", - tabno, octbits); - exit(1); - } - if (tabno > 0) { - if ((IPL[octbits] << tabno) != left) { - fprintf(stderr, - "IP tabno %d oct %d IP %d left %d, IP != left\n", - tabno, octbits, IPL[octbits], left); - exit (1); - } - } else { - IPL[octbits] = left; - if (octbits == 255) { - printf(" 0x%08x", left); - } else if (octbits & 0x3) { - printf(" 0x%08x,", left); - } else { - printf("\n\t0x%08x,", left); - } - } - } - if (tabno == 0) - printf("\n};\n\n"); - } - - /* - * Next is the FP table, in big endian order - */ - printf("#if BYTE_ORDER == LITTLE_ENDIAN\nstatic u_long FP[256] = {"); - for (tabno = 3; tabno >= 0; tabno--) { - i = tabno * 8; - ind7 = FPLbits[i] - 1; - ind6 = FPLbits[i+1] - 1; - ind5 = FPLbits[i+2] - 1; - ind4 = FPLbits[i+3] - 1; - ind3 = FPLbits[i+4] - 1; - ind2 = FPLbits[i+5] - 1; - ind1 = FPLbits[i+6] - 1; - ind0 = FPLbits[i+7] - 1; - for (octbits = 0; octbits < 256; octbits++) { - if (octbits & (1 << 7)) - bits[ind7] = 1; - if (octbits & (1 << 6)) - bits[ind6] = 1; - if (octbits & (1 << 5)) - bits[ind5] = 1; - if (octbits & (1 << 4)) - bits[ind4] = 1; - if (octbits & (1 << 3)) - bits[ind3] = 1; - if (octbits & (1 << 2)) - bits[ind2] = 1; - if (octbits & (1 << 1)) - bits[ind1] = 1; - if (octbits & 1) - bits[ind0] = 1; - perm(bits, FP, &left, &right); - bits[ind7] = 0; - bits[ind6] = 0; - bits[ind5] = 0; - bits[ind4] = 0; - bits[ind3] = 0; - bits[ind2] = 0; - bits[ind1] = 0; - bits[ind0] = 0; - if (right != 0) { - fprintf(stderr, - "FP tabno %d oct %d right not zero\n", - tabno, octbits); - exit(1); - } - if (tabno != 3) { - if ((FPL[octbits] << ((3-tabno)<<1)) != left) { - fprintf(stderr, - "FP tabno %d oct %d FP %x left %x, FP != left\n", - tabno, octbits, FPL[octbits], left); - exit (1); - } - } else { - FPL[octbits] = left; - if (octbits == 255) { - printf(" 0x%08x", left); - } else if (octbits & 0x3) { - printf(" 0x%08x,", left); - } else { - printf("\n\t0x%08x,", left); - } - } - } - if (tabno == 3) - printf("\n};\n"); - } - - /* - * Now reouput the FP table in order appropriate for little - * endian machines - */ - printf("#else\nstatic u_long FP[256] = {"); - for (octbits = 0; octbits < 256; octbits++) { - left = ((FPL[octbits] >> 24) & 0x000000ff) - | ((FPL[octbits] >> 8) & 0x0000ff00) - | ((FPL[octbits] << 8) & 0x00ff0000) - | ((FPL[octbits] << 24) & 0xff000000); - if (octbits == 255) { - printf(" 0x%08x", left); - } else if (octbits & 0x3) { - printf(" 0x%08x,", left); - } else { - printf("\n\t0x%08x,", left); - } - } - printf("\n};\n#endif\n"); -} diff --git a/usr.sbin/xntpd/authstuff/makePC1.c b/usr.sbin/xntpd/authstuff/makePC1.c deleted file mode 100644 index 8a49ec902e94..000000000000 --- a/usr.sbin/xntpd/authstuff/makePC1.c +++ /dev/null @@ -1,286 +0,0 @@ -/* - * makePC1 - build custom permutted choice 1 tables - */ - -#include <stdio.h> -#include <sys/types.h> - -#include "ntp_stdlib.h" - -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -char *progname; -int debug; - -static void permute P((u_char *, u_long *, u_long *)); -static void doit P((void)); - -/* - * main - parse arguments and handle options - */ -void -main(argc, argv) -int argc; -char *argv[]; -{ - int c; - int errflg = 0; - extern int ntp_optind; - extern char *ntp_optarg; - - progname = argv[0]; - while ((c = ntp_getopt(argc, argv, "d")) != EOF) - switch (c) { - case 'd': - ++debug; - break; - default: - errflg++; - break; - } - if (errflg) { - (void) fprintf(stderr, "usage: %s [-d]\n", progname); - exit(2); - } - doit(); - exit(0); -} - -/* - * Permuted choice 1 table, to produce the initial C. This table - * has had 1 subtracted from it to give it a zero base. - */ -static u_char PC1_C[28] = { - 56, 48, 40, 32, 24, 16, 8, - 0, 57, 49, 41, 33, 25, 17, - 9, 1, 58, 50, 42, 34, 26, - 18, 10, 2, 59, 51, 43, 35 -}; - -/* - * Permuted choice 1 table, to produce the initial D. Again, 1 has - * been subtracted to match C language zero base arrays. - */ -static u_char PC1_D[28] = { - 62, 54, 46, 38, 30, 22, 14, - 6, 61, 53, 45, 37, 29, 21, - 13, 5, 60, 52, 44, 36, 28, - 20, 12, 4, 27, 19, 11, 3 -}; - -/* - * permute - produce c and d for the given bits - */ -static void -permute(bits, cp, dp) - u_char *bits; - u_long *cp; - u_long *dp; -{ - register int i; - register u_long mask; - u_char c[28]; - u_char d[28]; - - memset((char *)c, 0, sizeof c); - memset((char *)d, 0, sizeof d); - - for (i = 0; i < 28; i++) { - c[i] = bits[PC1_C[i]]; - d[i] = bits[PC1_D[i]]; - } - - mask = 0x10000000; - *cp = *dp = 0; - for (i = 0; i < 28; i++) { - mask >>= 1; - if (c[i]) - *cp |= mask; - if (d[i]) - *dp |= mask; - } -} - - -/* - * bits from the left part of the key used to form the C subkey - */ -static int lc3[4] = { 0, 8, 16, 24 }; - -/* - * bits from the left part of the key used to form the D subkey - */ -static int ld4[4] = { 3, 11, 19, 27 }; - -/* - * bits from the right part of the key used to form the C subkey - */ -static int rc4[4] = { 32, 40, 48, 56 }; - -/* - * bits from the right part of the key used to form the D subkey - */ -static int rd3[4] = { 36, 44, 52, 60 }; - -static u_long PC_CL[8]; -static u_long PC_DL[16]; -static u_long PC_CR[16]; -static u_long PC_DR[8]; - - -/* - * doit - compute and print the four PC1 tables - */ -static void -doit() -{ - int i; - int comb; - u_long c; - u_long d; - u_char bits[64]; - - memset((char *)bits, 0, sizeof bits); - - printf("static u_long PC1_CL[8] = {"); - for (i = 0; i < 4; i++) { - for (comb = 0; comb < 8; comb++) { - if (comb & 0x4) - bits[lc3[i]] = 1; - if (comb & 0x2) - bits[lc3[i]+1] = 1; - if (comb & 0x1) - bits[lc3[i]+2] = 1; - permute(bits, &c, &d); - bits[lc3[i]] = 0; - bits[lc3[i]+1] = 0; - bits[lc3[i]+2] = 0; - if (d != 0) { - (void) fprintf(stderr, - "Error PC_CL i %d comb %d\n", i, comb); - } - if (i == 0) { - PC_CL[comb] = c; - if ((comb & 0x3) == 0) - printf("\n\t0x%08x,", c); - else if (comb == 7) - printf(" 0x%08x\n};\n\n", c); - else - printf(" 0x%08x,", c); - } else { - if (c != PC_CL[comb] << i) - (void) fprintf(stderr, - "Error PC_CL 0x%08x c 0x%08x\n", - PC_CL[comb], c); - } - } - } - - printf("static u_long PC1_DL[16] = {"); - for (i = 0; i < 4; i++) { - for (comb = 0; comb < 16; comb++) { - if (comb & 0x8) - bits[ld4[i]] = 1; - if (comb & 0x4) - bits[ld4[i]+1] = 1; - if (comb & 0x2) - bits[ld4[i]+2] = 1; - if (comb & 0x1) - bits[ld4[i]+3] = 1; - permute(bits, &c, &d); - bits[ld4[i]] = 0; - bits[ld4[i]+1] = 0; - bits[ld4[i]+2] = 0; - bits[ld4[i]+3] = 0; - if (c != 0) { - (void) fprintf(stderr, - "Error PC_DL i %d comb %d\n", i, comb); - } - if (i == 0) { - PC_DL[comb] = d; - if ((comb & 0x3) == 0) - printf("\n\t0x%08x,", d); - else if (comb == 15) - printf(" 0x%08x\n};\n\n", d); - else - printf(" 0x%08x,", d); - } else { - if (d != PC_DL[comb] << i) - (void) fprintf(stderr, - "Error PC_DL 0x%08x c 0x%08x\n", - PC_DL[comb], d); - } - } - } - - printf("static u_long PC1_CR[16] = {"); - for (i = 0; i < 4; i++) { - for (comb = 0; comb < 16; comb++) { - if (comb & 0x8) - bits[rc4[i]] = 1; - if (comb & 0x4) - bits[rc4[i]+1] = 1; - if (comb & 0x2) - bits[rc4[i]+2] = 1; - if (comb & 0x1) - bits[rc4[i]+3] = 1; - permute(bits, &c, &d); - bits[rc4[i]] = 0; - bits[rc4[i]+1] = 0; - bits[rc4[i]+2] = 0; - bits[rc4[i]+3] = 0; - if (d != 0) { - (void) fprintf(stderr, - "Error PC_CR i %d comb %d\n", i, comb); - } - if (i == 0) { - PC_CR[comb] = c; - if ((comb & 0x3) == 0) - printf("\n\t0x%08x,", c); - else if (comb == 15) - printf(" 0x%08x\n};\n\n", c); - else - printf(" 0x%08x,", c); - } else { - if (c != PC_CR[comb] << i) - (void) fprintf(stderr, - "Error PC_CR 0x%08x c 0x%08x\n", - PC_CR[comb], c); - } - } - } - - printf("static u_long PC1_DR[8] = {"); - for (i = 0; i < 4; i++) { - for (comb = 0; comb < 8; comb++) { - if (comb & 0x4) - bits[rd3[i]] = 1; - if (comb & 0x2) - bits[rd3[i]+1] = 1; - if (comb & 0x1) - bits[rd3[i]+2] = 1; - permute(bits, &c, &d); - bits[rd3[i]] = 0; - bits[rd3[i]+1] = 0; - bits[rd3[i]+2] = 0; - if (c != 0) { - (void) fprintf(stderr, - "Error PC_DR i %d comb %d\n", i, comb); - } - if (i == 0) { - PC_DR[comb] = d; - if ((comb & 0x3) == 0) - printf("\n\t0x%08x,", d); - else if (comb == 7) - printf(" 0x%08x\n};\n\n", d); - else - printf(" 0x%08x,", d); - } else { - if (d != PC_DR[comb] << i) - (void) fprintf(stderr, - "Error PC_DR 0x%08x c 0x%08x\n", - PC_DR[comb], d); - } - } - } -} diff --git a/usr.sbin/xntpd/authstuff/makePC2.c b/usr.sbin/xntpd/authstuff/makePC2.c deleted file mode 100644 index e5121fd08364..000000000000 --- a/usr.sbin/xntpd/authstuff/makePC2.c +++ /dev/null @@ -1,238 +0,0 @@ -/* - * makePC2 - build custom permutted choice 2 tables - */ - -#include <stdio.h> -#include <sys/types.h> - -#include "ntp_stdlib.h" - -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -char *progname; -int debug; - -static void permc P((u_char *, u_long *)); -static void permd P((u_char *, u_long *)); -static void doit P((void)); - -/* - * main - parse arguments and handle options - */ -void -main(argc, argv) -int argc; -char *argv[]; -{ - int c; - int errflg = 0; - extern int ntp_optind; - extern char *ntp_optarg; - - progname = argv[0]; - while ((c = ntp_getopt(argc, argv, "d")) != EOF) - switch (c) { - case 'd': - ++debug; - break; - default: - errflg++; - break; - } - if (errflg) { - (void) fprintf(stderr, "usage: %s [-d]\n", progname); - exit(2); - } - doit(); - exit(0); -} - -/* - * Permuted choice 2 table. This actually produces the low order 24 - * bits of the subkey Ki from the 28 bit value of Ci. This has had - * 1 subtracted from it to give a zero base. - */ -static u_char PC2_C[24] = { - 13, 16, 10, 23, 0, 4, - 2, 27, 14, 5, 20, 9, - 22, 18, 11, 3, 25, 7, - 15, 6, 26, 19, 12, 1 -}; - -/* - * Permuted choice 2 table, operating on the 28 Di bits to produce the - * high order 24 bits of subkey Ki. This has had 29 subtracted from - * it to give it a zero base into our D bit array. - */ -static u_char PC2_D[24] = { - 12, 23, 2, 8, 18, 26, - 1, 11, 22, 16, 4, 19, - 15, 20, 10, 27, 5, 24, - 17, 13, 21, 7, 0, 3 -}; - -u_long masks[4] = { 0x40000000, 0x400000, 0x4000, 0x40 }; - - -/* - * permc - permute C, producing a four byte result - */ -static void -permc(bits, resp) - u_char *bits; - u_long *resp; -{ - register int part; - register int i; - register u_long mask; - u_char res[24]; - - memset((char *)res, 0, sizeof res); - - for (i = 0; i < 24; i++) { - res[i] = bits[PC2_C[i]]; - } - - *resp = 0; - for (part = 0; part < 4; part++) { - mask = masks[part]; - for (i = part*6; i < (part+1)*6; i++) { - mask >>= 1; - if (res[i]) - *resp |= mask; - } - } -} - -/* - * permd - permute D, producing a four byte result - */ -static void -permd(bits, resp) - u_char *bits; - u_long *resp; -{ - register int part; - register int i; - register u_long mask; - u_char res[24]; - - memset((char *)res, 0, sizeof res); - - for (i = 0; i < 24; i++) { - res[i] = bits[PC2_D[i]]; - } - - *resp = 0; - for (part = 0; part < 4; part++) { - mask = masks[part]; - for (i = part*6; i < (part+1)*6; i++) { - mask >>= 1; - if (res[i]) - *resp |= mask; - } - } -} - - -/* - * bits used for each round in C - */ -static int cbits[4][6] = { - 0, 1, 2, 3, 4, 5, - 6, 7, 9, 10, 11, 12, - 13, 14, 15, 16, 22, 23, - 18, 19, 20, 25, 26, 27 -}; - - -/* - * bits used for each round in D - */ -static int dbits[4][6] = { - 0, 1, 2, 3, 4, 5, - 7, 8, 10, 11, 12, 13, - 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 26, 27 -}; - - -/* - * doit - compute and print the four PC1 tables - */ -static void -doit() -{ - int i; - int comb; - u_long res; - u_char bits[28]; - - memset((char *)bits, 0, sizeof bits); - - printf("static u_long PC2_C[4][64] = {"); - for (i = 0; i < 4; i++) { - for (comb = 0; comb < 64; comb++) { - if (comb & 0x20) - bits[cbits[i][0]] = 1; - if (comb & 0x10) - bits[cbits[i][1]] = 1; - if (comb & 0x8) - bits[cbits[i][2]] = 1; - if (comb & 0x4) - bits[cbits[i][3]] = 1; - if (comb & 0x2) - bits[cbits[i][4]] = 1; - if (comb & 0x1) - bits[cbits[i][5]] = 1; - permc(bits, &res); - bits[cbits[i][0]] = 0; - bits[cbits[i][1]] = 0; - bits[cbits[i][2]] = 0; - bits[cbits[i][3]] = 0; - bits[cbits[i][4]] = 0; - bits[cbits[i][5]] = 0; - if ((comb & 0x3) == 0) - printf("\n\t0x%08x,", res); - else if (comb == 63 && i == 3) - printf(" 0x%08x\n};\n\n", res); - else if (comb == 63) - printf(" 0x%08x,\n", res); - else - printf(" 0x%08x,", res); - } - } - - printf("static u_long PC2_D[4][64] = {"); - for (i = 0; i < 4; i++) { - for (comb = 0; comb < 64; comb++) { - if (comb & 0x20) - bits[dbits[i][0]] = 1; - if (comb & 0x10) - bits[dbits[i][1]] = 1; - if (comb & 0x8) - bits[dbits[i][2]] = 1; - if (comb & 0x4) - bits[dbits[i][3]] = 1; - if (comb & 0x2) - bits[dbits[i][4]] = 1; - if (comb & 0x1) - bits[dbits[i][5]] = 1; - permd(bits, &res); - bits[dbits[i][0]] = 0; - bits[dbits[i][1]] = 0; - bits[dbits[i][2]] = 0; - bits[dbits[i][3]] = 0; - bits[dbits[i][4]] = 0; - bits[dbits[i][5]] = 0; - if ((comb & 0x3) == 0) - printf("\n\t0x%08x,", res); - else if (comb == 63 && i == 3) - printf(" 0x%08x\n};\n\n", res); - else if (comb == 63) - printf(" 0x%08x,\n", res); - else - printf(" 0x%08x,", res); - } - } -} diff --git a/usr.sbin/xntpd/authstuff/makeSP.c b/usr.sbin/xntpd/authstuff/makeSP.c deleted file mode 100644 index 7daefa6cc834..000000000000 --- a/usr.sbin/xntpd/authstuff/makeSP.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - * makeSP - build combination S and P tables for quick DES computation - */ - -#include <stdio.h> -#include <sys/types.h> - -#include "ntp_stdlib.h" - -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -char *progname; -int debug; - -static void selperm P((int, int, u_long *)); -static void doit P((void)); - -/* - * main - parse arguments and handle options - */ -void -main(argc, argv) -int argc; -char *argv[]; -{ - int c; - int errflg = 0; - extern int ntp_optind; - extern char *ntp_optarg; - - progname = argv[0]; - while ((c = ntp_getopt(argc, argv, "d")) != EOF) - switch (c) { - case 'd': - ++debug; - break; - default: - errflg++; - break; - } - if (errflg) { - (void) fprintf(stderr, "usage: %s [-d]\n", progname); - exit(2); - } - doit(); - exit(0); -} - - -/* - * The cipher selection function tables. These turn 6 bit data back - * into 4 bit data. - */ -u_char S[8][64] = { - 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, - 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, - 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, - 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13, - - 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, - 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, - 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, - 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9, - - 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, - 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, - 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, - 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12, - - 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, - 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, - 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, - 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14, - - 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, - 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, - 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, - 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3, - - 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, - 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, - 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, - 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13, - - 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, - 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, - 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, - 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12, - - 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, - 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, - 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, - 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 -}; - -/* - * Cipher function permutation table - */ -u_char PT[32] = { - 16, 7, 20, 21, - 29, 12, 28, 17, - 1, 15, 23, 26, - 5, 18, 31, 10, - 2, 8, 24, 14, - 32, 27, 3, 9, - 19, 13, 30, 6, - 22, 11, 4, 25 -}; - - -/* - * Bits array. We keep this zeroed. - */ -u_char bits[32]; - - -/* - * selperm - run six bit data through the given selection table, then - * through the PT table to produce a long output. - */ -static void -selperm(selnumber, sixbits, resp) - int selnumber; - int sixbits; - u_long *resp; -{ - register u_long res; - register int selno; - register int i; - register int ind; - - selno = selnumber; - i = sixbits; - ind = (i & 0x20) | ((i >> 1) & 0xf) | ((i & 0x1) << 4); - i = S[selno][ind]; - - for (ind = 0; ind < 4; ind++) { - if (i & 0x8) - bits[4*selno + ind] = 1; - i <<= 1; - } - - res = 0; - for (i = 0; i < 32; i++) { - res <<= 1; - if (bits[PT[i]-1]) - res |= 1; - } - - *resp = res; - bits[4*selno] = 0; - bits[4*selno + 1] = 0; - bits[4*selno + 2] = 0; - bits[4*selno + 3] = 0; -} - - -/* - * doit - compute and print the 8 SP tables - */ -static void -doit() -{ - int selno; - u_long result; - int sixbits; - - memset((char *)bits, 0, sizeof bits); - printf("static u_long SP[8][64] = {"); - for (selno = 0; selno < 8; selno++) { - for (sixbits = 0; sixbits < 64; sixbits++) { - selperm(selno, sixbits, &result); - if ((sixbits & 0x3) == 0) - printf("\n\t0x%08x,", result); - else if (sixbits == 63 && selno == 7) - printf(" 0x%08x\n};\n", result); - else if (sixbits == 63) - printf(" 0x%08x,\n", result); - else - printf(" 0x%08x,", result); - } - } -} diff --git a/usr.sbin/xntpd/authstuff/md5_sample_output b/usr.sbin/xntpd/authstuff/md5_sample_output deleted file mode 100644 index a7d4282d2edb..000000000000 --- a/usr.sbin/xntpd/authstuff/md5_sample_output +++ /dev/null @@ -1,8 +0,0 @@ -MD5 test suite results: -d41d8cd98f00b204e9800998ecf8427e "" -0cc175b9c0f1b6a831c399e269772661 "a" -900150983cd24fb0d6963f7d28e17f72 "abc" -f96b697d7cb7938d525a2f31aaf161d0 "message digest" -c3fcd3d76192e4007dfb496cca67e13b "abcdefghijklmnopqrstuvwxyz" -d174ab98d277d9f5a5611c2c9f419d9f "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" -57edf4a22be3c955ac49da2e2107b67a "12345678901234567890123456789012345678901234567890123456789012345678901234567890" diff --git a/usr.sbin/xntpd/authstuff/md5driver.c b/usr.sbin/xntpd/authstuff/md5driver.c deleted file mode 100644 index aef597caee44..000000000000 --- a/usr.sbin/xntpd/authstuff/md5driver.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - *********************************************************************** - ** md5driver.c -- sample test routines ** - ** RSA Data Security, Inc. MD5 Message-Digest Algorithm ** - ** Created: 2/16/90 RLR ** - ** Updated: 1/91 SRD ** - ** Updated: 7/91 SRD Removed file "foo" from test suite ** - *********************************************************************** - */ - -/* - *********************************************************************** - ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. ** - ** ** - ** RSA Data Security, Inc. makes no representations concerning ** - ** either the merchantability of this software or the suitability ** - ** of this software for any particular purpose. It is provided "as ** - ** is" without express or implied warranty of any kind. ** - ** ** - ** These notices must be retained in any copies of any part of this ** - ** documentation and/or software. ** - *********************************************************************** - */ - -/* $FreeBSD$ */ - -#include <stdio.h> -#include <sys/types.h> -#include <time.h> -#if defined(SYS_BSDI) || defined(SYS_44BSD) -#include <sys/time.h> -#endif /* SYS_BSDI */ -#include "md5.h" - -#ifndef MD5 -#define MD5 -#endif -#include "ntp_string.h" -#include "ntp_stdlib.h" - -/* Prints message digest buffer in mdContext as 32 hexadecimal digits. - Order is from low-order byte to high-order byte of digest. - Each byte is printed with high-order hexadecimal digit first. - */ -static void -MDPrint (mdContext) -MD5_CTX *mdContext; -{ - int i; - - for (i = 0; i < 16; i++) - printf ("%02x", mdContext->digest[i]); -} - -/* size of test block */ -#define TEST_BLOCK_SIZE 1000 - -/* number of blocks to process */ -#define TEST_BLOCKS 10000 - -/* number of test bytes = TEST_BLOCK_SIZE * TEST_BLOCKS */ -static long TEST_BYTES = (long)TEST_BLOCK_SIZE * (long)TEST_BLOCKS; - -/* A time trial routine, to measure the speed of MD5. - Measures wall time required to digest TEST_BLOCKS * TEST_BLOCK_SIZE - characters. - */ -static void -MDTimeTrial () -{ - MD5_CTX mdContext; - time_t endTime, startTime; - unsigned char data[TEST_BLOCK_SIZE]; - unsigned int i; - - /* initialize test data */ - for (i = 0; i < TEST_BLOCK_SIZE; i++) - data[i] = (unsigned char)(i & 0xFF); - - /* start timer */ - printf ("MD5 time trial. Processing %ld characters...\n", (long)TEST_BYTES); - time (&startTime); - - /* digest data in TEST_BLOCK_SIZE byte blocks */ - MD5Init (&mdContext); - for (i = TEST_BLOCKS; i > 0; i--) - MD5Update (&mdContext, data, TEST_BLOCK_SIZE); - MD5Final (&mdContext); - - /* stop timer, get time difference */ - time (&endTime); - MDPrint (&mdContext); - printf (" is digest of test input.\n"); - printf - ("Seconds to process test input: %ld\n", (long)endTime-startTime); - printf - ("Characters processed per second: %ld\n", - (long)(TEST_BYTES/(endTime-startTime))); -} - -/* Computes the message digest for string inString. - Prints out message digest, a space, the string (in quotes) and a - carriage return. - */ -static void -MDString (inString) -char *inString; -{ - MD5_CTX mdContext; - unsigned int len = strlen (inString); - - MD5Init (&mdContext); - MD5Update (&mdContext, inString, len); - MD5Final (&mdContext); - MDPrint (&mdContext); - printf (" \"%s\"\n", inString); -} - -/* Computes the message digest for a specified file. - Prints out message digest, a space, the file name, and a carriage - return. - */ -static void -MDFile (filename) -char *filename; -{ - FILE *inFile = fopen (filename, "rb"); - MD5_CTX mdContext; - int bytes; - unsigned char data[1024]; - - if (inFile == NULL) { - printf ("%s can't be opened.\n", filename); - return; - } - - MD5Init (&mdContext); - while ((bytes = fread (data, 1, 1024, inFile)) != 0) - MD5Update (&mdContext, data, bytes); - MD5Final (&mdContext); - MDPrint (&mdContext); - printf (" %s\n", filename); - fclose (inFile); -} - -/* Writes the message digest of the data from stdin onto stdout, - followed by a carriage return. - */ -static void -MDFilter () -{ - MD5_CTX mdContext; - int bytes; - unsigned char data[16]; - - MD5Init (&mdContext); - while ((bytes = fread (data, 1, 16, stdin)) != 0) - MD5Update (&mdContext, data, bytes); - MD5Final (&mdContext); - MDPrint (&mdContext); - printf ("\n"); -} - -/* Runs a standard suite of test data. - */ -static void -MDTestSuite () -{ - printf ("MD5 test suite results:\n"); - MDString (""); - MDString ("a"); - MDString ("abc"); - MDString ("message digest"); - MDString ("abcdefghijklmnopqrstuvwxyz"); - MDString - ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); - MDString - ("12345678901234567890123456789012345678901234567890123456789012345678901234567890"); -} - -int -main (argc, argv) -int argc; -char *argv[]; -{ - int i; - - /* For each command line argument in turn: - ** filename -- prints message digest and name of file - ** -sstring -- prints message digest and contents of string - ** -t -- prints time trial statistics for 10M - characters - ** -x -- execute a standard suite of test data - ** (no args) -- writes messages digest of stdin onto stdout - */ - if (argc == 1) - MDFilter (); - else - for (i = 1; i < argc; i++) - if (argv[i][0] == '-' && argv[i][1] == 's') - MDString (argv[i] + 2); - else if (strcmp (argv[i], "-t") == 0) - MDTimeTrial (); - else if (strcmp (argv[i], "-x") == 0) - MDTestSuite (); - else MDFile (argv[i]); -} - -/* - *********************************************************************** - ** End of md5driver.c ** - ******************************** (cut) ******************************** - */ diff --git a/usr.sbin/xntpd/authstuff/mkrandkeys.c b/usr.sbin/xntpd/authstuff/mkrandkeys.c deleted file mode 100644 index 0edf733ac6a4..000000000000 --- a/usr.sbin/xntpd/authstuff/mkrandkeys.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * mkrandkeys - make a key file for xntpd with some quite random keys - */ -#include <stdio.h> -#include <sys/types.h> -#include <sys/stat.h> - -#include "ntp_stdlib.h" - -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -char *progname; -int debug; - -u_long keydata[2]; - -int std = 1; /* DES standard key format */ -u_char dokey[16] = { 0 }; - -static void rand_data P((u_long *)); - -/* - * main - parse arguments and handle options - */ -void -main(argc, argv) -int argc; -char *argv[]; -{ - int c; - int i; - int j; - int errflg = 0; - int numkeys; - u_long tmp; - char *passwd; - extern int ntp_optind; - extern char *ntp_optarg; - extern char *getpass(); - - numkeys = 0; - progname = argv[0]; - passwd = NULL; - while ((c = ntp_getopt(argc, argv, "dnp:s")) != EOF) - switch (c) { - case 'd': - ++debug; - break; - case 'n': - std = 0; - break; - case 'p': - passwd = ntp_optarg; - break; - case 's': - std = 1; - break; - default: - errflg++; - break; - } - - numkeys = 0; - for (; !errflg && ntp_optind < argc; ntp_optind++) { - c = atoi(argv[ntp_optind]); - if (c <= 0 || c > 15) { - (void) fprintf(stderr, "%s: invalid key number `%s'\n", - progname, argv[ntp_optind]); - exit(2); - } - dokey[c] = 1; - numkeys++; - } - - if (errflg || numkeys == 0) { - (void) fprintf(stderr, - "usage: %s [-ns] [-p seed] key# [key# ...]\n", - progname); - exit(2); - } - - while (passwd == 0 || *passwd == '\0') { - passwd = getpass("Seed: "); - if (*passwd == '\0') { - (void) fprintf(stderr, - "better use a better seed than that\n"); - } - } - - keydata[0] = keydata[1] = 0; - for (i = 0; i < 8 && *passwd != '\0'; i++) { - keydata[i/4] |= ((((u_long)(*passwd))&0xff)<<(1+((3-(i%4))*8))); - passwd++; - } - - for (i = 1; i <= 15; i++) { - if (dokey[i]) { - for (c = 0, tmp = 0; c < 32; c += 4) - tmp |= (i << c); - keydata[0] ^= tmp; - keydata[1] ^= tmp; - rand_data(keydata); - DESauth_parity(keydata); - - if (std) { - (void)printf("%-2d S\t%08x%08x\n", - i, keydata[0], keydata[1]); - } else { - for (j = 0; j < 2; j++) { - keydata[j] - = ((keydata[j] & 0xfefefefe) >> 1) - | ((keydata[j] & 0x01010101) << 7); - } - (void)printf("%-2d N\t%08x%08x\n", - i, keydata[0], keydata[1]); - } - } - } - exit(0); -} - -char *volatile_file[] = { - "/bin/echo", - "/bin/sh", - "/bin/cat", - "/bin/ls", - "/bin/stty", - "/bin/date", - "/bin/cat", - "/bin/cc", - "/etc/motd", - "/etc/utmp", - "/dev/kmem", - "/dev/null", - "", -}; - -#define NEXT(X) (0x1e1f2f2d*(X) + 0x361962e9) - -static void -rand_data(data) - u_long *data; -{ - register i; - struct stat buf; - extern long time(); - char ekeys[128], dkeys[128]; - - *data ^= 0x9662f394; - *(data+1) ^= 0x9f17c55f; - DESauth_subkeys(data, ekeys, dkeys); - *data ^= NEXT(getpid() + (getuid() << 16)); - *(data+1) ^= NEXT(time((long *)0)); - DESauth_des(data, ekeys); - for (i = 0; strlen(volatile_file[i]); i++) { - if (stat(volatile_file[i], &buf) == -1) - continue; - if (i & 1) { - *data ^= NEXT(buf.st_atime); - *(data+1) ^= NEXT(buf.st_mtime); - } else { - *data ^= NEXT(buf.st_mtime); - *(data+1) ^= NEXT(buf.st_atime); - } - DESauth_des(data, ekeys); - } -} diff --git a/usr.sbin/xntpd/authstuff/omakeIPFP.c b/usr.sbin/xntpd/authstuff/omakeIPFP.c deleted file mode 100644 index 92d87be30ba0..000000000000 --- a/usr.sbin/xntpd/authstuff/omakeIPFP.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * makeIPFP - make fast DES IP and FP tables - * - * This is an older version which generated tables half the size of - * the current version, but which took about double the CPU time to - * compute permutations from these tables. Since the CPU spent on the - * permutations is small compared to the CPU spent in the cipher code, - * I may go back to the smaller tables to save the space some day. - */ - -#include <stdio.h> -#include <sys/types.h> - -#include "ntp_stdlib.h" - -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -u_long IPL[8][16]; -u_long FPL[8][16]; - -char *progname; -int debug; - -static void perm P((u_char *, u_char *, u_long *, u_long *)); -static void doit P((void)); - -/* - * main - parse arguments and handle options - */ -void -main(argc, argv) -int argc; -char *argv[]; -{ - int c; - int errflg = 0; - extern int ntp_optind; - extern char *ntp_optarg; - - progname = argv[0]; - while ((c = ntp_getopt(argc, argv, "d")) != EOF) - switch (c) { - case 'd': - ++debug; - break; - default: - errflg++; - break; - } - if (errflg) { - (void) fprintf(stderr, "usage: %s [-d]\n", progname); - exit(2); - } - doit(); - exit(0); -} - - -/* - * Initial permutation table - */ -u_char IP[64] = { - 58, 50, 42, 34, 26, 18, 10, 2, - 60, 52, 44, 36, 28, 20, 12, 4, - 62, 54, 46, 38, 30, 22, 14, 6, - 64, 56, 48, 40, 32, 24, 16, 8, - 57, 49, 41, 33, 25, 17, 9, 1, - 59, 51, 43, 35, 27, 19, 11, 3, - 61, 53, 45, 37, 29, 21, 13, 5, - 63, 55, 47, 39, 31, 23, 15, 7 -}; - -/* - * Inverse initial permutation table - */ -u_char FP[64] = { - 40, 8, 48, 16, 56, 24, 64, 32, - 39, 7, 47, 15, 55, 23, 63, 31, - 38, 6, 46, 14, 54, 22, 62, 30, - 37, 5, 45, 13, 53, 21, 61, 29, - 36, 4, 44, 12, 52, 20, 60, 28, - 35, 3, 43, 11, 51, 19, 59, 27, - 34, 2, 42, 10, 50, 18, 58, 26, - 33, 1, 41, 9, 49, 17, 57, 25 -}; - - -/* - * Bit order after the operation - * - * ((left & 0x55555555) << 1) | (right & 0x55555555) - */ -u_char IPLbits[32] = { - 2, 34, 4, 36, 6, 38, 8, 40, - 10, 42, 12, 44, 14, 46, 16, 48, - 18, 50, 20, 52, 22, 54, 24, 56, - 26, 58, 28, 60, 30, 62, 32, 64 -}; - - -/* - * Bit order after the operation - * - * (left & 0xaaaaaaaa) | ((right & 0xaaaaaaaa) >> 1) - */ -u_char IPRbits[32] = { - 1, 33, 3, 35, 5, 37, 7, 39, - 9, 41, 11, 43, 13, 45, 15, 47, - 17, 49, 19, 51, 21, 53, 23, 55, - 25, 57, 27, 59, 29, 61, 31, 63 -}; - - -/* - * Bit order after the operation - * - * ((left & 0x0f0f0f0f) << 4) | (right & 0x0f0f0f0f) - */ -u_char FPLbits[32] = { - 5, 6, 7, 8, 37, 38, 39, 40, - 13, 14, 15, 16, 45, 46, 47, 48, - 21, 22, 23, 24, 53, 54, 55, 56, - 29, 30, 31, 32, 61, 62, 63, 64 -}; - - -/* - * Bit order after the operation - * - * (left & 0xf0f0f0f0) | ((right & 0xf0f0f0f0) >> 4) - */ -u_char FPRbits[32] = { - 1, 2, 3, 4, 33, 34, 35, 36, - 9, 10, 11, 12, 41, 42, 43, 44, - 17, 18, 19, 20, 49, 50, 51, 52, - 25, 26, 27, 28, 57, 58, 59, 60 -}; - - -/* - * perm - do a permutation with the given table - */ -static void -perm(databits, permtab, leftp, rightp) - u_char *databits; - u_char *permtab; - u_long *leftp; - u_long *rightp; -{ - register u_long left; - register u_long right; - register u_char *PT; - register u_char *bits; - register int i; - - left = right = 0; - PT = permtab; - bits = databits; - - for (i = 0; i < 32; i++) { - left <<= 1; - if (bits[PT[i]-1]) - left |= 1; - } - - for (i = 32; i < 64; i++) { - right <<= 1; - if (bits[PT[i]-1]) - right |= 1; - } - - *leftp = left; - *rightp = right; -} - - -/* - * doit - make up the tables - */ -static void -doit() -{ - u_char bits[64]; - u_long left; - u_long right; - int tabno; - int i; - int ind0, ind1, ind2, ind3; - int quadbits; - - memset((char *)bits, 0, sizeof bits); - - /* - * Do the rounds for the IPL table. We save the results of - * this as well as printing them. Note that this is the - * left-half table. - */ - printf("static u_long IP[8][16] = {"); - for (tabno = 0; tabno < 8; tabno++) { - i = tabno * 4; - ind3 = IPLbits[i] - 1; - ind2 = IPLbits[i+1] - 1; - ind1 = IPLbits[i+2] - 1; - ind0 = IPLbits[i+3] - 1; - for (quadbits = 0; quadbits < 16; quadbits++) { - if (quadbits & (1 << 3)) - bits[ind3] = 1; - if (quadbits & (1 << 2)) - bits[ind2] = 1; - if (quadbits & (1 << 1)) - bits[ind1] = 1; - if (quadbits & 1) - bits[ind0] = 1; - perm(bits, IP, &left, &right); - bits[ind3] = 0; - bits[ind2] = 0; - bits[ind1] = 0; - bits[ind0] = 0; - if (right != 0) { - fprintf(stderr, - "IPL tabno %d quad %d right not zero\n", - tabno, quadbits); - exit(1); - } - IPL[tabno][quadbits] = left; - if (quadbits == 15 && tabno == 7) { - printf(" 0x%08x", left); - } else if (quadbits & 0x3) { - printf(" 0x%08x,", left); - } else { - printf("\n\t0x%08x,", left); - } - } - if (tabno == 7) - printf("\n};\n"); - printf("\n"); - } - - /* - * Compute the right half of the same table. I noticed this table - * was the same as the previous one, just by luck, so we don't - * actually have to do this. Do it anyway just for a check. - */ - for (tabno = 0; tabno < 8; tabno++) { - i = tabno * 4; - ind3 = IPRbits[i] - 1; - ind2 = IPRbits[i+1] - 1; - ind1 = IPRbits[i+2] - 1; - ind0 = IPRbits[i+3] - 1; - for (quadbits = 0; quadbits < 16; quadbits++) { - if (quadbits & (1 << 3)) - bits[ind3] = 1; - if (quadbits & (1 << 2)) - bits[ind2] = 1; - if (quadbits & (1 << 1)) - bits[ind1] = 1; - if (quadbits & 1) - bits[ind0] = 1; - perm(bits, IP, &left, &right); - bits[ind3] = 0; - bits[ind2] = 0; - bits[ind1] = 0; - bits[ind0] = 0; - if (left != 0) { - fprintf(stderr, - "IPR tabno %d quad %d left not zero\n", - tabno, quadbits); - exit(1); - } - if (right != IPL[tabno][quadbits]) { - fprintf(stderr, - "IPR tabno %d quad %d: 0x%08x not same as 0x%08x\n", - tabno, quadbits, right,IPL[tabno][quadbits]); - exit(1); - } - } - } - - /* - * Next are the FP tables - */ - printf("static u_long FP[8][16] = {"); - for (tabno = 0; tabno < 8; tabno++) { - i = tabno * 4; - ind3 = FPLbits[i] - 1; - ind2 = FPLbits[i+1] - 1; - ind1 = FPLbits[i+2] - 1; - ind0 = FPLbits[i+3] - 1; - for (quadbits = 0; quadbits < 16; quadbits++) { - if (quadbits & (1 << 3)) - bits[ind3] = 1; - if (quadbits & (1 << 2)) - bits[ind2] = 1; - if (quadbits & (1 << 1)) - bits[ind1] = 1; - if (quadbits & 1) - bits[ind0] = 1; - perm(bits, FP, &left, &right); - bits[ind3] = 0; - bits[ind2] = 0; - bits[ind1] = 0; - bits[ind0] = 0; - if (right != 0) { - fprintf(stderr, - "FPL tabno %d quad %d right not zero\n", - tabno, quadbits); - exit(1); - } - FPL[tabno][quadbits] = left; - if (quadbits == 15 && tabno == 7) { - printf(" 0x%08x", left); - } else if (quadbits & 0x3) { - printf(" 0x%08x,", left); - } else { - printf("\n\t0x%08x,", left); - } - } - if (tabno == 7) - printf("\n};"); - printf("\n"); - } - - /* - * Right half of same set of tables. This was symmetric too. - * Amazing! - */ - for (tabno = 0; tabno < 8; tabno++) { - i = tabno * 4; - ind3 = FPRbits[i] - 1; - ind2 = FPRbits[i+1] - 1; - ind1 = FPRbits[i+2] - 1; - ind0 = FPRbits[i+3] - 1; - for (quadbits = 0; quadbits < 16; quadbits++) { - if (quadbits & (1 << 3)) - bits[ind3] = 1; - if (quadbits & (1 << 2)) - bits[ind2] = 1; - if (quadbits & (1 << 1)) - bits[ind1] = 1; - if (quadbits & 1) - bits[ind0] = 1; - perm(bits, FP, &left, &right); - bits[ind3] = 0; - bits[ind2] = 0; - bits[ind1] = 0; - bits[ind0] = 0; - if (left != 0) { - fprintf(stderr, - "FPR tabno %d quad %d left not zero\n", - tabno, quadbits); - exit(1); - } - if (right != FPL[tabno][quadbits]) { - fprintf(stderr, - "FPR tabno %d quad %d: 0x%08x not same as 0x%08x\n", - tabno, quadbits, right,FPL[tabno][quadbits]); - exit(1); - } - } - } -} diff --git a/usr.sbin/xntpd/authstuff/results b/usr.sbin/xntpd/authstuff/results deleted file mode 100644 index 305a179d0a2c..000000000000 --- a/usr.sbin/xntpd/authstuff/results +++ /dev/null @@ -1,2 +0,0 @@ -odin/1000000: 0.000145 -idavolde/1000000: 0.000451 diff --git a/usr.sbin/xntpd/authstuff/unixcert.c b/usr.sbin/xntpd/authstuff/unixcert.c deleted file mode 100644 index 9ec2c9834a97..000000000000 --- a/usr.sbin/xntpd/authstuff/unixcert.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - * This file, and the certdata file, shamelessly stolen - * from Phil Karn's DES implementation. - * - * This version uses the standard Unix setkey() and encrypt() - * routines to do the encryption. - */ - -#include <stdio.h> -#include <sys/types.h> - -#include "ntp_stdlib.h" - -static void get8 P((U_LONG *)); -static void put8 P((U_LONG *)); -static void do_setkey P((U_LONG *)); -static void do_crypt P((U_LONG *, int)); - -void -main() -{ - U_LONG key[2], plain[2], cipher[2], answer[2]; - int i; - int test; - int fail; - - for(test=0;!feof(stdin);test++){ - get8(key); - do_setkey(key); - printf(" K: "); put8(key); - - get8(plain); - printf(" P: "); put8(plain); - - get8(answer); - printf(" C: "); put8(answer); - - - for(i=0;i<2;i++) - cipher[i] = plain[i]; - do_crypt(cipher, 0); - - for(i=0;i<2;i++) - if(cipher[i] != answer[i]) - break; - fail = 0; - if(i != 2){ - printf(" Encrypt FAIL"); - fail++; - } - do_crypt(cipher, 1); - for(i=0;i<2;i++) - if(cipher[i] != plain[i]) - break; - if(i != 2){ - printf(" Decrypt FAIL"); - fail++; - } - if(fail == 0) - printf(" OK"); - printf("\n"); - } -} - -static void -get8(lp) -U_LONG *lp; -{ - int t; - U_LONG l[2]; - int i; - - l[0] = l[1] = 0L; - for(i=0;i<8;i++){ - scanf("%2x",&t); - if(feof(stdin)) - exit(0); - l[i/4] <<= 8; - l[i/4] |= (U_LONG)(t & 0xff); - } - *lp = l[0]; - *(lp+1) = l[1]; -} - -static void -put8(lp) -U_LONG *lp; -{ - int i; - - - for(i=0;i<2;i++){ - printf("%08x",*lp++); - } -} - -static void -do_setkey(key) - U_LONG *key; -{ - int j; - register int i; - register char *kb; - register U_LONG *kp; - char keybits[64]; - - kb = keybits; - kp = key; - for (j = 0; j < 2; j++) { - for (i = 0; i < 32; i++) { - if (*kp & (1<<(31-i))) - *kb++ = 1; - else - *kb++ = 0; - } - kp++; - } - setkey(keybits); -} - -static void -do_crypt(data, edflag) - U_LONG *data; - int edflag; -{ - int j; - register int i; - register char *bp; - register U_LONG *dp; - char block[64]; - - bp = block; - dp = data; - for (j = 0; j < 2; j++) { - for (i = 0; i < 32; i++) { - if (*dp & (1<<(31-i))) - *bp++ = 1; - else - *bp++ = 0; - } - dp++; - } - - encrypt(block, edflag); - - bp = block; - dp = data; - for (j = 0; j < 2; j++) { - *dp = 0; - for (i = 0; i < 32; i++) { - if (*bp++) - *dp |= 1<<(31-i); - } - dp++; - } -} diff --git a/usr.sbin/xntpd/clockstuff/Makefile b/usr.sbin/xntpd/clockstuff/Makefile deleted file mode 100644 index 22bc486094fd..000000000000 --- a/usr.sbin/xntpd/clockstuff/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# -# $FreeBSD$ -# - -PROG= propdelay -DPADD= ${LIBNTP} ${LIBM} -LDADD= ${LIBNTP} -lm - -SRCS= propdelay.c -NOMAN= - -install: - -CLEANFILES+= chutest clktest chutest.o clktest.o - -.include <bsd.prog.mk> diff --git a/usr.sbin/xntpd/clockstuff/README b/usr.sbin/xntpd/clockstuff/README deleted file mode 100644 index 3714ab3b4767..000000000000 --- a/usr.sbin/xntpd/clockstuff/README +++ /dev/null @@ -1,31 +0,0 @@ -README file for directory ./clockstuff of the NTP Version 3 distribution - -This directory contains the sources for utility programs designed to -support radio clocks. The chutest.c and clktest.c are desgined to -test the chu_clk and tty_clk line disciplines and STREAMS modules in -the ../kernel directory. - -These files have been modified to work with either the line disciplines -or the STREAMS modules. Be sure to define -DSTREAM if appropriate. - -These are random bits of things written to help with clocks. You can -make things in here by typing one or more of: - - make propdelay (or `make') - make chutest - make clktest - -Propdelay computes high frequency propagation delays, given the -longitude and latitude of the transmitter and receiver. Use -this for WWV/H and CHU. Don't use it for WWVB (the computation -is easier for that). - -Chutest can be used to input and process data from a CHU modem -attached to a serial port. It will use the CHU line discipline -(if installed), or raw mode otherwise. This was used to test -out the initial reduction algorithms, and may not be up to date. - -Clktest can be used to test the clock line discipline (CLKLDISC, -it must be available), and to take a look at radio clocks attached to a -serial port. - diff --git a/usr.sbin/xntpd/clockstuff/chutest.c b/usr.sbin/xntpd/clockstuff/chutest.c deleted file mode 100644 index d8b804ad5b78..000000000000 --- a/usr.sbin/xntpd/clockstuff/chutest.c +++ /dev/null @@ -1,798 +0,0 @@ -/* chutest.c,v 3.1 1993/07/06 01:05:21 jbj Exp - * chutest - test the CHU clock - */ - -#include <stdio.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/file.h> -#include <sgtty.h> - -#include "../include/ntp_fp.h" -#include "../include/ntp.h" -#include "../include/ntp_unixtime.h" - -#ifdef STREAM -#include <sys/chudefs.h> -#include <stropts.h> -#endif - -#ifdef CHULDISC -#include <sys/chudefs.h> -#endif - -#ifndef CHULDISC -#ifndef STREAM -#define NCHUCHARS (10) - -struct chucode { - u_char codechars[NCHUCHARS]; /* code characters */ - u_char ncodechars; /* number of code characters */ - u_char chustatus; /* not used currently */ - struct timeval codetimes[NCHUCHARS]; /* arrival times */ -}; -#endif -#endif - -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -char *progname; -int debug; - -int dofilter = 0; /* set to 1 when we should run filter algorithm */ -int showtimes = 0; /* set to 1 when we should show char arrival times */ -int doprocess = 0; /* set to 1 when we do processing analogous to driver */ -#ifdef CHULDISC -int usechuldisc = 0; /* set to 1 when CHU line discipline should be used */ -#endif -#ifdef STREAM -int usechuldisc = 0; /* set to 1 when CHU line discipline should be used */ -#endif - -struct timeval lasttv; -struct chucode chudata; - -extern u_long ustotslo[]; -extern u_long ustotsmid[]; -extern u_long ustotshi[]; - -/* - * main - parse arguments and handle options - */ -main(argc, argv) -int argc; -char *argv[]; -{ - int c; - int errflg = 0; - extern int ntp_optind; - extern char *ntp_optarg; - void init_chu(); - - progname = argv[0]; - while ((c = ntp_getopt(argc, argv, "cdfpt")) != EOF) - switch (c) { - case 'c': -#ifdef STREAM - usechuldisc = 1; - break; -#endif -#ifdef CHULDISC - usechuldisc = 1; - break; -#endif -#ifndef STREAM -#ifndef CHULDISC - (void) fprintf(stderr, - "%s: CHU line discipline not available on this machine\n", - progname); - exit(2); -#endif -#endif - case 'd': - ++debug; - break; - case 'f': - dofilter = 1; - break; - case 'p': - doprocess = 1; - case 't': - showtimes = 1; - break; - default: - errflg++; - break; - } - if (errflg || ntp_optind+1 != argc) { -#ifdef STREAM - (void) fprintf(stderr, "usage: %s [-dft] tty_device\n", - progname); -#endif -#ifdef CHULDISC - (void) fprintf(stderr, "usage: %s [-dft] tty_device\n", - progname); -#endif -#ifndef STREAM -#ifndef CHULDISC - (void) fprintf(stderr, "usage: %s [-cdft] tty_device\n", - progname); -#endif -#endif - exit(2); - } - - (void) gettimeofday(&lasttv, (struct timezone *)0); - c = openterm(argv[ntp_optind]); - init_chu(); -#ifdef STREAM - if (usechuldisc) - process_ldisc(c); - else -#endif -#ifdef CHULDISC - if (usechuldisc) - process_ldisc(c); - else -#endif - process_raw(c); - /*NOTREACHED*/ -} - - -/* - * openterm - open a port to the CHU clock - */ -int -openterm(dev) - char *dev; -{ - int s; - struct sgttyb ttyb; - - if (debug) - (void) fprintf(stderr, "Doing open..."); - if ((s = open(dev, O_RDONLY, 0777)) < 0) - error("open(%s)", dev, ""); - if (debug) - (void) fprintf(stderr, "open okay\n"); - - if (debug) - (void) fprintf(stderr, "Setting exclusive use..."); - if (ioctl(s, TIOCEXCL, (char *)0) < 0) - error("ioctl(TIOCEXCL)", "", ""); - if (debug) - (void) fprintf(stderr, "done\n"); - - ttyb.sg_ispeed = ttyb.sg_ospeed = B300; - ttyb.sg_erase = ttyb.sg_kill = 0; - ttyb.sg_flags = EVENP|ODDP|RAW; - if (debug) - (void) fprintf(stderr, "Setting baud rate et al..."); - if (ioctl(s, TIOCSETP, (char *)&ttyb) < 0) - error("ioctl(TIOCSETP, raw)", "", ""); - if (debug) - (void) fprintf(stderr, "done\n"); - -#ifdef CHULDISC - if (usechuldisc) { - int ldisc; - - if (debug) - (void) fprintf(stderr, "Switching to CHU ldisc..."); - ldisc = CHULDISC; - if (ioctl(s, TIOCSETD, (char *)&ldisc) < 0) - error("ioctl(TIOCSETD, CHULDISC)", "", ""); - if (debug) - (void) fprintf(stderr, "okay\n"); - } -#endif -#ifdef STREAM - if (usechuldisc) { - - if (debug) - (void) fprintf(stderr, "Poping off streams..."); - while (ioctl(s, I_POP, 0) >=0) ; - if (debug) - (void) fprintf(stderr, "okay\n"); - if (debug) - (void) fprintf(stderr, "Pushing CHU stream..."); - if (ioctl(s, I_PUSH, "chu") < 0) - error("ioctl(I_PUSH, \"chu\")", "", ""); - if (debug) - (void) fprintf(stderr, "okay\n"); - } -#endif - return s; -} - - -/* - * process_raw - process characters in raw mode - */ -process_raw(s) - int s; -{ - u_char c; - int n; - struct timeval tv; - struct timeval difftv; - - while ((n = read(s, &c, sizeof(char))) > 0) { - (void) gettimeofday(&tv, (struct timezone *)0); - if (dofilter) - raw_filter((unsigned int)c, &tv); - else { - difftv.tv_sec = tv.tv_sec - lasttv.tv_sec; - difftv.tv_usec = tv.tv_usec - lasttv.tv_usec; - if (difftv.tv_usec < 0) { - difftv.tv_sec--; - difftv.tv_usec += 1000000; - } - (void) printf("%02x\t%lu.%06lu\t%lu.%06lu\n", - c, tv.tv_sec, tv.tv_usec, difftv.tv_sec, - difftv.tv_usec); - lasttv = tv; - } - } - - if (n == 0) { - (void) fprintf(stderr, "%s: zero returned on read\n", progname); - exit(1); - } else - error("read()", "", ""); -} - - -/* - * raw_filter - run the line discipline filter over raw data - */ -raw_filter(c, tv) - unsigned int c; - struct timeval *tv; -{ - static struct timeval diffs[10] = { 0 }; - struct timeval diff; - l_fp ts; - void chufilter(); - - if ((c & 0xf) > 9 || ((c>>4)&0xf) > 9) { - if (debug) - (void) fprintf(stderr, - "character %02x failed BCD test\n"); - chudata.ncodechars = 0; - return; - } - - if (chudata.ncodechars > 0) { - diff.tv_sec = tv->tv_sec - - chudata.codetimes[chudata.ncodechars].tv_sec; - diff.tv_usec = tv->tv_usec - - chudata.codetimes[chudata.ncodechars].tv_usec; - if (diff.tv_usec < 0) { - diff.tv_sec--; - diff.tv_usec += 1000000; - } /* - if (diff.tv_sec != 0 || diff.tv_usec > 900000) { - if (debug) - (void) fprintf(stderr, - "character %02x failed time test\n"); - chudata.ncodechars = 0; - return; - } */ - } - - chudata.codechars[chudata.ncodechars] = c; - chudata.codetimes[chudata.ncodechars] = *tv; - if (chudata.ncodechars > 0) - diffs[chudata.ncodechars] = diff; - if (++chudata.ncodechars == 10) { - if (doprocess) { - TVTOTS(&chudata.codetimes[NCHUCHARS-1], &ts); - ts.l_ui += JAN_1970; - chufilter(&chudata, &chudata.codetimes[NCHUCHARS-1]); - } else { - register int i; - - for (i = 0; i < chudata.ncodechars; i++) { - (void) printf("%x%x\t%lu.%06lu\t%lu.%06lu\n", - chudata.codechars[i] & 0xf, - (chudata.codechars[i] >>4 ) & 0xf, - chudata.codetimes[i].tv_sec, - chudata.codetimes[i].tv_usec, - diffs[i].tv_sec, diffs[i].tv_usec); - } - } - chudata.ncodechars = 0; - } -} - - -/* #ifdef CHULDISC*/ -/* - * process_ldisc - process line discipline - */ -process_ldisc(s) - int s; -{ - struct chucode chu; - int n; - register int i; - struct timeval diff; - l_fp ts; - void chufilter(); - - while ((n = read(s, (char *)&chu, sizeof chu)) > 0) { - if (n != sizeof chu) { - (void) fprintf(stderr, "Expected %d, got %d\n", - sizeof chu, n); - continue; - } - - if (doprocess) { - TVTOTS(&chu.codetimes[NCHUCHARS-1], &ts); - ts.l_ui += JAN_1970; - chufilter(&chu, &ts); - } else { - for (i = 0; i < NCHUCHARS; i++) { - if (i == 0) - diff.tv_sec = diff.tv_usec = 0; - else { - diff.tv_sec = chu.codetimes[i].tv_sec - - chu.codetimes[i-1].tv_sec; - diff.tv_usec = chu.codetimes[i].tv_usec - - chu.codetimes[i-1].tv_usec; - if (diff.tv_usec < 0) { - diff.tv_sec--; - diff.tv_usec += 1000000; - } - } - (void) printf("%x%x\t%lu.%06lu\t%lu.%06lu\n", - chu.codechars[i] & 0xf, (chu.codechars[i]>>4)&0xf, - chu.codetimes[i].tv_sec, chu.codetimes[i].tv_usec, - diff.tv_sec, diff.tv_usec); - } - } - } - if (n == 0) { - (void) fprintf(stderr, "%s: zero returned on read\n", progname); - exit(1); - } else - error("read()", "", ""); -} -/*#endif*/ - - -/* - * error - print an error message - */ -error(fmt, s1, s2) - char *fmt; - char *s1; - char *s2; -{ - (void) fprintf(stderr, "%s: ", progname); - (void) fprintf(stderr, fmt, s1, s2); - (void) fprintf(stderr, ": "); - perror(""); - exit(1); -} - -/* - * Definitions - */ -#define MAXUNITS 4 /* maximum number of CHU units permitted */ -#define CHUDEV "/dev/chu%d" /* device we open. %d is unit number */ -#define NCHUCODES 9 /* expect 9 CHU codes per minute */ - -/* - * When CHU is operating optimally we want the primary clock distance - * to come out at 300 ms. Thus, peer.distance in the CHU peer structure - * is set to 290 ms and we compute delays which are at least 10 ms long. - * The following are 290 ms and 10 ms expressed in u_fp format - */ -#define CHUDISTANCE 0x00004a3d -#define CHUBASEDELAY 0x0000028f - -/* - * To compute a quality for the estimate (a pseudo delay) we add a - * fixed 10 ms for each missing code in the minute and add to this - * the sum of the differences between the remaining offsets and the - * estimated sample offset. - */ -#define CHUDELAYPENALTY 0x0000028f - -/* - * Other constant stuff - */ -#define CHUPRECISION (-9) /* what the heck */ -#define CHUREFID "CHU\0" - -/* - * Default fudge factors - */ -#define DEFPROPDELAY 0x00624dd3 /* 0.0015 seconds, 1.5 ms */ -#define DEFFILTFUDGE 0x000d1b71 /* 0.0002 seconds, 200 us */ - -/* - * Hacks to avoid excercising the multiplier. I have no pride. - */ -#define MULBY10(x) (((x)<<3) + ((x)<<1)) -#define MULBY60(x) (((x)<<6) - ((x)<<2)) /* watch overflow */ -#define MULBY24(x) (((x)<<4) + ((x)<<3)) - -/* - * Constants for use when multiplying by 0.1. ZEROPTONE is 0.1 - * as an l_fp fraction, NZPOBITS is the number of significant bits - * in ZEROPTONE. - */ -#define ZEROPTONE 0x1999999a -#define NZPOBITS 29 - -/* - * The CHU table. This gives the expected time of arrival of each - * character after the on-time second and is computed as follows: - * The CHU time code is sent at 300 bps. Your average UART will - * synchronize at the edge of the start bit and will consider the - * character complete at the center of the first stop bit, i.e. - * 0.031667 ms later. Thus the expected time of each interrupt - * is the start bit time plus 0.031667 seconds. These times are - * in chutable[]. To this we add such things as propagation delay - * and delay fudge factor. - */ -#define CHARDELAY 0x081b4e80 - -static u_long chutable[NCHUCHARS] = { - 0x2147ae14 + CHARDELAY, /* 0.130 (exactly) */ - 0x2ac08312 + CHARDELAY, /* 0.167 (exactly) */ - 0x34395810 + CHARDELAY, /* 0.204 (exactly) */ - 0x3db22d0e + CHARDELAY, /* 0.241 (exactly) */ - 0x472b020c + CHARDELAY, /* 0.278 (exactly) */ - 0x50a3d70a + CHARDELAY, /* 0.315 (exactly) */ - 0x5a1cac08 + CHARDELAY, /* 0.352 (exactly) */ - 0x63958106 + CHARDELAY, /* 0.389 (exactly) */ - 0x6d0e5604 + CHARDELAY, /* 0.426 (exactly) */ - 0x76872b02 + CHARDELAY, /* 0.463 (exactly) */ -}; - -/* - * Keep the fudge factors separately so they can be set even - * when no clock is configured. - */ -static l_fp propagation_delay; -static l_fp fudgefactor; -static l_fp offset_fudge; - -/* - * We keep track of the start of the year, watching for changes. - * We also keep track of whether the year is a leap year or not. - * All because stupid CHU doesn't include the year in the time code. - */ -static u_long yearstart; - -/* - * Imported from the timer module - */ -extern u_long current_time; -extern struct event timerqueue[]; - -/* - * Time conversion tables imported from the library - */ -extern u_long ustotslo[]; -extern u_long ustotsmid[]; -extern u_long ustotshi[]; - - -/* - * init_chu - initialize internal chu driver data - */ -void -init_chu() -{ - - /* - * Initialize fudge factors to default. - */ - propagation_delay.l_ui = 0; - propagation_delay.l_uf = DEFPROPDELAY; - fudgefactor.l_ui = 0; - fudgefactor.l_uf = DEFFILTFUDGE; - offset_fudge = propagation_delay; - L_ADD(&offset_fudge, &fudgefactor); - - yearstart = 0; -} - - -void -chufilter(chuc, rtime) - struct chucode *chuc; - l_fp *rtime; -{ - register int i; - register u_long date_ui; - register u_long tmp; - register u_char *code; - int isneg; - int imin; - int imax; - u_long reftime; - l_fp off[NCHUCHARS]; - l_fp ts; - int day, hour, minute, second; - static u_char lastcode[NCHUCHARS]; - extern u_long calyearstart(); - extern char *mfptoa(); - void chu_process(); - extern char *prettydate(); - - /* - * We'll skip the checks made in the kernel, but assume they've - * been done. This means that all characters are BCD and - * the intercharacter spacing isn't unreasonable. - */ - - /* - * print the code - */ - for (i = 0; i < NCHUCHARS; i++) - printf("%c%c", (chuc->codechars[i] & 0xf) + '0', - ((chuc->codechars[i]>>4) & 0xf) + '0'); - printf("\n"); - - /* - * Format check. Make sure the two halves match. - */ - for (i = 0; i < NCHUCHARS/2; i++) - if (chuc->codechars[i] != chuc->codechars[i+(NCHUCHARS/2)]) { - (void) printf("Bad format, halves don't match\n"); - return; - } - - /* - * Break out the code into the BCD nibbles. Only need to fiddle - * with the first half since both are identical. Note the first - * BCD character is the low order nibble, the second the high order. - */ - code = lastcode; - for (i = 0; i < NCHUCHARS/2; i++) { - *code++ = chuc->codechars[i] & 0xf; - *code++ = (chuc->codechars[i] >> 4) & 0xf; - } - - /* - * If the first nibble isn't a 6, we're up the creek - */ - code = lastcode; - if (*code++ != 6) { - (void) printf("Bad format, no 6 at start\n"); - return; - } - - /* - * Collect the day, the hour, the minute and the second. - */ - day = *code++; - day = MULBY10(day) + *code++; - day = MULBY10(day) + *code++; - hour = *code++; - hour = MULBY10(hour) + *code++; - minute = *code++; - minute = MULBY10(minute) + *code++; - second = *code++; - second = MULBY10(second) + *code++; - - /* - * Sanity check the day and time. Note that this - * only occurs on the 31st through the 39th second - * of the minute. - */ - if (day < 1 || day > 366 - || hour > 23 || minute > 59 - || second < 31 || second > 39) { - (void) printf("Failed date sanity check: %d %d %d %d\n", - day, hour, minute, second); - return; - } - - /* - * Compute seconds into the year. - */ - tmp = (u_long)(MULBY24((day-1)) + hour); /* hours */ - tmp = MULBY60(tmp) + (u_long)minute; /* minutes */ - tmp = MULBY60(tmp) + (u_long)second; /* seconds */ - - /* - * Now the fun begins. We demand that the received time code - * be within CLOCK_WAYTOOBIG of the receive timestamp, but - * there is uncertainty about the year the timestamp is in. - * Use the current year start for the first check, this should - * work most of the time. - */ - date_ui = tmp + yearstart; - if (date_ui < (rtime->l_ui + CLOCK_WAYTOOBIG) - && date_ui > (rtime->l_ui - CLOCK_WAYTOOBIG)) - goto codeokay; /* looks good */ - - /* - * Trouble. Next check is to see if the year rolled over and, if - * so, try again with the new year's start. - */ - date_ui = calyearstart(rtime->l_ui); - if (date_ui != yearstart) { - yearstart = date_ui; - date_ui += tmp; - (void) printf("time %u, code %u, difference %d\n", - date_ui, rtime->l_ui, (long)date_ui-(long)rtime->l_ui); - if (date_ui < (rtime->l_ui + CLOCK_WAYTOOBIG) - && date_ui > (rtime->l_ui - CLOCK_WAYTOOBIG)) - goto codeokay; /* okay this time */ - } - - ts.l_uf = 0; - ts.l_ui = yearstart; - printf("yearstart %s\n", prettydate(&ts)); - printf("received %s\n", prettydate(rtime)); - ts.l_ui = date_ui; - printf("date_ui %s\n", prettydate(&ts)); - - /* - * Here we know the year start matches the current system - * time. One remaining possibility is that the time code - * is in the year previous to that of the system time. This - * is only worth checking if the receive timestamp is less - * than CLOCK_WAYTOOBIG seconds into the new year. - */ - if ((rtime->l_ui - yearstart) < CLOCK_WAYTOOBIG) { - date_ui = tmp + calyearstart(yearstart - CLOCK_WAYTOOBIG); - if ((rtime->l_ui - date_ui) < CLOCK_WAYTOOBIG) - goto codeokay; - } - - /* - * One last possibility is that the time stamp is in the year - * following the year the system is in. Try this one before - * giving up. - */ - date_ui = tmp + calyearstart(yearstart + (400*24*60*60)); /* 400 days */ - if ((date_ui - rtime->l_ui) >= CLOCK_WAYTOOBIG) { - printf("Date hopelessly off\n"); - return; /* hopeless, let it sync to other peers */ - } - -codeokay: - reftime = date_ui; - /* - * We've now got the integral seconds part of the time code (we hope). - * The fractional part comes from the table. We next compute - * the offsets for each character. - */ - for (i = 0; i < NCHUCHARS; i++) { - register u_long tmp2; - - off[i].l_ui = date_ui; - off[i].l_uf = chutable[i]; - tmp = chuc->codetimes[i].tv_sec + JAN_1970; - TVUTOTSF(chuc->codetimes[i].tv_usec, tmp2); - M_SUB(off[i].l_ui, off[i].l_uf, tmp, tmp2); - } - - /* - * Here is a *big* problem. What one would normally - * do here on a machine with lots of clock bits (say - * a Vax or the gizmo board) is pick the most positive - * offset and the estimate, since this is the one that - * is most likely suffered the smallest interrupt delay. - * The trouble is that the low order clock bit on an IBM - * RT, which is the machine I had in mind when doing this, - * ticks at just under the millisecond mark. This isn't - * precise enough. What we can do to improve this is to - * average all 10 samples and rely on the second level - * filtering to pick the least delayed estimate. Trouble - * is, this means we have to divide a 64 bit fixed point - * number by 10, a procedure which really sucks. Oh, well. - * First compute the sum. - */ - date_ui = 0; - tmp = 0; - for (i = 0; i < NCHUCHARS; i++) - M_ADD(date_ui, tmp, off[i].l_ui, off[i].l_uf); - if (M_ISNEG(date_ui, tmp)) - isneg = 1; - else - isneg = 0; - - /* - * Here is a multiply-by-0.1 optimization that should apply - * just about everywhere. If the magnitude of the sum - * is less than 9 we don't have to worry about overflow - * out of a 64 bit product, even after rounding. - */ - if (date_ui < 9 || date_ui > 0xfffffff7) { - register u_long prod_ui; - register u_long prod_uf; - - prod_ui = prod_uf = 0; - /* - * This code knows the low order bit in 0.1 is zero - */ - for (i = 1; i < NZPOBITS; i++) { - M_LSHIFT(date_ui, tmp); - if (ZEROPTONE & (1<<i)) - M_ADD(prod_ui, prod_uf, date_ui, tmp); - } - - /* - * Done, round it correctly. Prod_ui contains the - * fraction. - */ - if (prod_uf & 0x80000000) - prod_ui++; - if (isneg) - date_ui = 0xffffffff; - else - date_ui = 0; - tmp = prod_ui; - /* - * date_ui is integral part, tmp is fraction. - */ - } else { - register u_long prod_ovr; - register u_long prod_ui; - register u_long prod_uf; - register u_long highbits; - - prod_ovr = prod_ui = prod_uf = 0; - if (isneg) - highbits = 0xffffffff; /* sign extend */ - else - highbits = 0; - /* - * This code knows the low order bit in 0.1 is zero - */ - for (i = 1; i < NZPOBITS; i++) { - M_LSHIFT3(highbits, date_ui, tmp); - if (ZEROPTONE & (1<<i)) - M_ADD3(prod_ovr, prod_uf, prod_ui, - highbits, date_ui, tmp); - } - - if (prod_uf & 0x80000000) - M_ADDUF(prod_ovr, prod_ui, (u_long)1); - date_ui = prod_ovr; - tmp = prod_ui; - } - - /* - * At this point we have the mean offset, with the integral - * part in date_ui and the fractional part in tmp. Store - * it in the structure. - */ - /* - * Add in fudge factor. - */ - M_ADD(date_ui, tmp, offset_fudge.l_ui, offset_fudge.l_uf); - - /* - * Find the minimun and maximum offset - */ - imin = imax = 0; - for (i = 1; i < NCHUCHARS; i++) { - if (L_ISGEQ(&off[i], &off[imax])) { - imax = i; - } else if (L_ISGEQ(&off[imin], &off[i])) { - imin = i; - } - } - - L_ADD(&off[imin], &offset_fudge); - if (imin != imax) - L_ADD(&off[imax], &offset_fudge); - (void) printf("mean %s, min %s, max %s\n", - mfptoa(date_ui, tmp, 8), lfptoa(&off[imin], 8), - lfptoa(&off[imax], 8)); -} diff --git a/usr.sbin/xntpd/clockstuff/clktest.c b/usr.sbin/xntpd/clockstuff/clktest.c deleted file mode 100644 index b54048576c41..000000000000 --- a/usr.sbin/xntpd/clockstuff/clktest.c +++ /dev/null @@ -1,511 +0,0 @@ -/* clktest.c,v 3.1 1993/07/06 01:05:23 jbj Exp - * clktest - test the clock line discipline - * - * usage: clktest -b bps -f -t timeo -s cmd -c char1 -a char2 /dev/whatever - */ - -#include <stdio.h> -#include <ctype.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <signal.h> -#include <netinet/in.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/file.h> -#include <sgtty.h> - -#include "../include/ntp_fp.h" -#include "../include/ntp.h" -#include "../include/ntp_unixtime.h" - -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -#if defined(ULT_2_0_SUCKS) -#ifndef sigmask -#define sigmask(m) (1<<(m)) -#endif -#endif - -#ifndef STREAM -#ifndef CLKLDISC - CLOCK_LINE_DISCIPLINE_NEEDED_BY_THIS_PROGRAM; -#endif -#endif - -/* - * Mask for blocking SIGIO and SIGALRM - */ -#define BLOCKSIGMASK (sigmask(SIGIO)|sigmask(SIGALRM)) - -/* - * speed table - */ -struct speeds { - int bps; - int rate; -} speedtab[] = { - { 300, B300 }, - { 1200, B1200 }, - { 2400, B2400 }, - { 4800, B4800 }, - { 9600, B9600 }, - { 19200, EXTA }, - { 38400, EXTB }, - { 0, 0 } -}; - -char *progname; -int debug; - -#ifdef CLKLDISC -#define DEFMAGIC '\r' -#endif - -#ifdef STREAM -#include <stropts.h> -#include <sys/clkdefs.h> -#define DEFMAGIC "\r" -#endif - -struct timeval timeout = { 0 }; -char *cmd = NULL; -int cmdlen; -int docmd = 0; -#ifdef CLKLDISC -u_long magic1 = DEFMAGIC; -u_long magic2 = DEFMAGIC; -#endif -#ifdef STREAM -char magic[32]; -#endif -int speed = B9600; -int ttflags = RAW|EVENP|ODDP; - -int wasalarmed; -int iosig; - -struct timeval lasttv; - -extern u_long ustotslo[]; -extern u_long ustotsmid[]; -extern u_long ustotshi[]; - -/* - * main - parse arguments and handle options - */ -main(argc, argv) -int argc; -char *argv[]; -{ - int c; - int errflg = 0; - struct speeds *spd; - u_long tmp; - int fd; - struct sgttyb ttyb; - struct itimerval itimer; - extern int ntp_optind; - extern char *ntp_optarg; - int alarming(); - int ioready(); - - progname = argv[0]; -#ifdef STREAM - magic[0] = 0; -#endif - while ((c = ntp_getopt(argc, argv, "a:b:c:dfs:t:")) != EOF) - switch (c) { -#ifdef CLKLDISC - case 'a': -#endif - case 'c': - if (!atouint(ntp_optarg, &tmp)) { - (void) fprintf(stderr, - "%s: argument for -%c must be integer\n", - progname, c); - errflg++; - break; - } -#ifdef CLKLDISC - if (c == 'c') - magic1 = tmp; - else - magic2 = tmp; -#endif -#ifdef STREAM - magic[strlen(magic)+1] = '\0'; - magic[strlen(magic)] = tmp; -#endif - break; - case 'b': - if (!atouint(ntp_optarg, &tmp)) { - errflg++; - break; - } - spd = speedtab; - while (spd->bps != 0) - if ((int)tmp == spd->bps) - break; - if (spd->bps == 0) { - (void) fprintf(stderr, - "%s: speed %lu is unsupported\n", - progname, tmp); - errflg++; - } else { - speed = spd->rate; - } - break; - case 'd': - ++debug; - break; - case 'f': - ttflags |= CRMOD; - break; - case 's': - cmdlen = strlen(ntp_optarg); - if (cmdlen == 0) - errflg++; - else - cmd = ntp_optarg; - break; - case 't': - if (!atouint(ntp_optarg, &tmp)) - errflg++; - else { - timeout.tv_sec = (long)tmp; - docmd = 1; - } - break; - default: - errflg++; - break; - } - if (errflg || ntp_optind+1 != argc) { - (void) fprintf(stderr, -#ifdef CLKLDISC -"usage: %s [-b bps] [-c magic1] [-a magic2] [-f] [-s cmd] [-t timeo] tty_device\n", -#endif -#ifdef STREAM -"usage: %s [-b bps] [-c magic1] [-c magic2]... [-f] [-s cmd] [-t timeo] tty_device\n", -#endif - progname); - exit(2); - } - -#ifdef STREAM - if (!strlen(magic)) - strcpy(magic,DEFMAGIC); -#endif - - if (docmd) - fd = open(argv[ntp_optind], O_RDWR, 0777); - else - fd = open(argv[ntp_optind], O_RDONLY, 0777); - if (fd == -1) { - (void) fprintf(stderr, "%s: open(%s): ", progname, - argv[ntp_optind]); - perror(""); - exit(1); - } - - if (ioctl(fd, TIOCEXCL, (char *)0) < 0) { - (void) fprintf(stderr, "%s: ioctl(TIOCEXCL): ", progname); - perror(""); - exit(1); - } - - /* - * If we have the clock discipline, set the port to raw. Otherwise - * we run cooked. - */ - ttyb.sg_ispeed = ttyb.sg_ospeed = speed; -#ifdef CLKLDISC - ttyb.sg_erase = (char)magic1; - ttyb.sg_kill = (char)magic2; -#endif - ttyb.sg_flags = (short)ttflags; - if (ioctl(fd, TIOCSETP, (char *)&ttyb) < 0) { - (void) fprintf(stderr, "%s: ioctl(TIOCSETP): ", progname); - perror(""); - exit(1); - } - - if (fcntl(fd, F_SETOWN, getpid()) == -1) { - (void) fprintf(stderr, "%s: fcntl(F_SETOWN): ", progname); - perror(""); - exit(1); - } - -#ifdef CLKLDISC - { - int ldisc; - ldisc = CLKLDISC; - if (ioctl(fd, TIOCSETD, (char *)&ldisc) < 0) { - (void) fprintf(stderr, "%s: ioctl(TIOCSETD): ", progname); - perror(""); - exit(1); - } - } -#endif -#ifdef STREAM - if (ioctl(fd, I_POP, 0) >=0 ) ; - if (ioctl(fd, I_PUSH, "clk") < 0) { - (void) fprintf(stderr, "%s: ioctl(I_PUSH): ", progname); - perror(""); - exit(1); - } - if (ioctl(fd, CLK_SETSTR, magic) < 0) { - (void) fprintf(stderr, "%s: ioctl(CLK_SETSTR): ", progname); - perror(""); - exit(1); - } -#endif - - - (void) gettimeofday(&lasttv, (struct timezone *)0); - if (docmd) { - /* - * set non-blocking, async I/O on the descriptor - */ - iosig = 0; - (void) signal(SIGIO, ioready); - if (fcntl(fd, F_SETFL, FNDELAY|FASYNC) < 0) { - (void) fprintf(stderr, "%s: fcntl(F_SETFL): ", - progname); - perror(""); - exit(1); - } - - /* - * Set up the alarm interrupt. - */ - wasalarmed = 0; - (void) signal(SIGALRM, alarming); - itimer.it_interval = itimer.it_value = timeout; - setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0); - doboth(fd); - } - doioonly(fd); -} - - -/* - * doboth - handle both I/O and alarms via SIGIO - */ -doboth(fd) - int fd; -{ - int n; - int sawalarm; - int sawiosig; - int omask; - fd_set fds; - struct timeval tvzero; - - sawalarm = 0; - sawiosig = 0; - FD_ZERO(&fds); - for (;;) { - omask = sigblock(BLOCKSIGMASK); - if (wasalarmed) { /* alarmed? */ - sawalarm = 1; - wasalarmed = 0; - } - if (iosig) { - sawiosig = 1; - iosig = 0; - } - - if (!sawalarm && !sawiosig) { - /* - * Nothing to do. Wait for something. - */ - sigpause(omask); - if (wasalarmed) { /* alarmed? */ - sawalarm = 1; - wasalarmed = 0; - } - if (iosig) { - sawiosig = 1; - iosig = 0; - } - } - (void)sigsetmask(omask); - - if (sawiosig) { - - do { - tvzero.tv_sec = tvzero.tv_usec = 0; - FD_SET(fd, &fds); - n = select(fd+1, &fds, (fd_set *)0, - (fd_set *)0, &tvzero); - if (n > 0) - doio(fd); - } while (n > 0); - - if (n == -1) { - (void) fprintf(stderr, "%s: select: ", - progname); - perror(""); - exit(1); - } - sawiosig = 0; - } - if (sawalarm) { - doalarm(fd); - sawalarm = 0; - } - } -} - - -/* - * doioonly - do I/O. This avoids the use of signals - */ -doioonly(fd) - int fd; -{ - int n; - fd_set fds; - - FD_ZERO(&fds); - for (;;) { - FD_SET(fd, &fds); - n = select(fd+1, &fds, (fd_set *)0, (fd_set *)0, - (struct timeval *)0); - if (n > 0) - doio(fd); - } -} - - -/* - * doio - read a buffer full of stuff and print it out - */ -doio(fd) - int fd; -{ - register char *rp, *rpend; - register char *cp; - register int i; - char raw[512]; - struct timeval tv, tvd; - int rlen; - int ind; - char cooked[2049]; - static char *digits = "0123456789abcdef"; - - rlen = read(fd, raw, sizeof(raw)); - if (rlen < 0) { - (void) fprintf(stderr, "%s: read(): ", progname); - perror(""); - return; - } - if (rlen == 0) { - (void) printf("Zero length read\n"); - return; - } - - cp = cooked; - rp = raw; - rpend = &raw[rlen]; - ind = 0; - - while (rp < rpend) { - ind = 1; - if (isprint(*rp)) - *cp++ = *rp; - else { - *cp++ = '<'; - *cp++ = digits[((*rp)>>4) & 0xf]; - *cp++ = digits[*rp & 0xf]; - *cp++ = '>'; - } -#ifdef CLKLDISC - if (*rp == (char)magic1 || *rp == (char)magic2) { -#else - if ( strchr( magic, *rp) != NULL ) { -#endif - rp++; - ind = 0; - *cp = '\0'; - if ((rpend - rp) < sizeof(struct timeval)) { - (void)printf( - "Too little data (%d): %s\n", - rpend-rp, cooked); - return; - } - - tv.tv_sec = 0; - for (i = 0; i < 4; i++) { - tv.tv_sec <<= 8; - tv.tv_sec |= ((long)*rp++) & 0xff; - } - tv.tv_usec = 0; - for (i = 0; i < 4; i++) { - tv.tv_usec <<= 8; - tv.tv_usec |= ((long)*rp++) & 0xff; - } - - tvd.tv_sec = tv.tv_sec - lasttv.tv_sec; - tvd.tv_usec = tv.tv_usec - lasttv.tv_usec; - if (tvd.tv_usec < 0) { - tvd.tv_usec += 1000000; - tvd.tv_sec--; - } - - (void)printf("%lu.%06lu %lu.%06lu %s\n", - tv.tv_sec, tv.tv_usec, tvd.tv_sec, tvd.tv_usec, - cooked); - lasttv = tv; - } else { - rp++; - } - } - - if (ind) { - *cp = '\0'; - (void)printf("Incomplete data: %s\n", cooked); - } -} - - -/* - * doalarm - send a string out the port, if we have one. - */ -doalarm(fd) - int fd; -{ - int n; - - if (cmd == NULL || cmdlen <= 0) - return; - - n = write(fd, cmd, cmdlen); - - if (n < 0) { - (void) fprintf(stderr, "%s: write(): ", progname); - perror(""); - } else if (n < cmdlen) { - (void) printf("Short write (%d bytes, should be %d)\n", - n, cmdlen); - } -} - - -/* - * alarming - receive alarm interupt - */ -alarming() -{ - wasalarmed = 1; -} - -/* - * ioready - handle SIGIO interrupt - */ -ioready() -{ - iosig = 1; -} diff --git a/usr.sbin/xntpd/clockstuff/propdelay.c b/usr.sbin/xntpd/clockstuff/propdelay.c deleted file mode 100644 index 507bc08b4070..000000000000 --- a/usr.sbin/xntpd/clockstuff/propdelay.c +++ /dev/null @@ -1,536 +0,0 @@ -/* propdelay.c,v 3.1 1993/07/06 01:05:24 jbj Exp - * propdelay - compute propagation delays - * - * cc -o propdelay propdelay.c -lm - * - * "Time and Frequency Users' Manual", NBS Technical Note 695 (1977). - */ - -/* - * This can be used to get a rough idea of the HF propagation delay - * between two points (usually between you and the radio station). - * The usage is - * - * propdelay latitudeA longitudeA latitudeB longitudeB - * - * where points A and B are the locations in question. You obviously - * need to know the latitude and longitude of each of the places. - * The program expects the latitude to be preceded by an 'n' or 's' - * and the longitude to be preceded by an 'e' or 'w'. It understands - * either decimal degrees or degrees:minutes:seconds. Thus to compute - * the delay between the WWVH (21:59:26N, 159:46:00W) and WWV (40:40:49N, - * 105:02:27W) you could use: - * - * propdelay n21:59:26 w159:46 n40:40:49 w105:02:27 - * - * By default it prints out a summer (F2 average virtual height 350 km) and - * winter (F2 average virtual height 250 km) number. The results will be - * quite approximate but are about as good as you can do with HF time anyway. - * You might pick a number between the values to use, or use the summer - * value in the summer and switch to the winter value when the static - * above 10 MHz starts to drop off in the fall. You can also use the - * -h switch if you want to specify your own virtual height. - * - * You can also do a - * - * propdelay -W n45:17:47 w75:45:22 - * - * to find the propagation delays to WWV and WWVH (from CHU in this - * case), a - * - * propdelay -C n40:40:49 w105:02:27 - * - * to find the delays to CHU, and a - * - * propdelay -G n52:03:17 w98:34:18 - * - * to find delays to GOES via each of the three satellites. - */ - -#include <stdio.h> -#include <string.h> - -#include "ntp_stdlib.h" - -extern double sin P((double)); -extern double cos P((double)); -extern double acos P((double)); -extern double tan P((double)); -extern double atan P((double)); -extern double sqrt P((double)); - -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -/* - * Program constants - */ -#define EARTHRADIUS (6370.0) /* raduis of earth (km) */ -#define LIGHTSPEED (299800.0) /* speed of light, km/s */ -#define PI (3.1415926536) -#define RADPERDEG (PI/180.0) /* radians per degree */ -#define MILE (1.609344) /* km in a mile */ - -#define SUMMERHEIGHT (350.0) /* summer height in km */ -#define WINTERHEIGHT (250.0) /* winter height in km */ - -#define SATHEIGHT (6.6110 * 6378.0) /* geosync satellite height in km - from centre of earth */ - -#define WWVLAT "n40:40:49" -#define WWVLONG "w105:02:27" - -#define WWVHLAT "n21:59:26" -#define WWVHLONG "w159:46:00" - -#define CHULAT "n45:17:47" -#define CHULONG "w75:45:22" - -#define GOES_UP_LAT "n37:52:00" -#define GOES_UP_LONG "w75:27:00" -#define GOES_EAST_LONG "w75:00:00" -#define GOES_STBY_LONG "w105:00:00" -#define GOES_WEST_LONG "w135:00:00" -#define GOES_SAT_LAT "n00:00:00" - -char *wwvlat = WWVLAT; -char *wwvlong = WWVLONG; - -char *wwvhlat = WWVHLAT; -char *wwvhlong = WWVHLONG; - -char *chulat = CHULAT; -char *chulong = CHULONG; - -char *goes_up_lat = GOES_UP_LAT; -char *goes_up_long = GOES_UP_LONG; -char *goes_east_long = GOES_EAST_LONG; -char *goes_stby_long = GOES_STBY_LONG; -char *goes_west_long = GOES_WEST_LONG; -char *goes_sat_lat = GOES_SAT_LAT; - -int hflag = 0; -int Wflag = 0; -int Cflag = 0; -int Gflag = 0; -int height; - -char *progname; -int debug; - -static void doit P((double, double, double, double, double, char *)); -static double latlong P((char *, int)); -static double greatcircle P((double, double, double, double)); -static double waveangle P((double, double, int)); -static double propdelay P((double, double, int)); -static int finddelay P((double, double, double, double, double, double *)); -static void satdoit P((double, double, double, double, double, double, char *)); -static void satfinddelay P((double, double, double, double, double *)); -static double satpropdelay P((double)); - -/* - * main - parse arguments and handle options - */ -void -main(argc, argv) -int argc; -char *argv[]; -{ - int c; - int errflg = 0; - double lat1, long1; - double lat2, long2; - double lat3, long3; - extern int ntp_optind; - extern char *ntp_optarg; - - progname = argv[0]; - while ((c = ntp_getopt(argc, argv, "dh:CWG")) != EOF) - switch (c) { - case 'd': - ++debug; - break; - case 'h': - hflag++; - height = atof(ntp_optarg); - if (height <= 0.0) { - (void) fprintf(stderr, "height %s unlikely\n", - ntp_optarg); - errflg++; - } - break; - case 'C': - Cflag++; - break; - case 'W': - Wflag++; - break; - case 'G': - Gflag++; - break; - default: - errflg++; - break; - } - if (errflg || (!(Cflag || Wflag || Gflag) && ntp_optind+4 != argc) || - ((Cflag || Wflag || Gflag) && ntp_optind+2 != argc)) { - (void) fprintf(stderr, - "usage: %s [-d] [-h height] lat1 long1 lat2 long2\n", - progname); - (void) fprintf(stderr," - or -\n"); - (void) fprintf(stderr, - "usage: %s -CWG [-d] lat long\n", - progname); - exit(2); - } - - - if (!(Cflag || Wflag || Gflag)) { - lat1 = latlong(argv[ntp_optind], 1); - long1 = latlong(argv[ntp_optind + 1], 0); - lat2 = latlong(argv[ntp_optind + 2], 1); - long2 = latlong(argv[ntp_optind + 3], 0); - if (hflag) { - doit(lat1, long1, lat2, long2, height, ""); - } else { - doit(lat1, long1, lat2, long2, (double)SUMMERHEIGHT, - "summer propagation, "); - doit(lat1, long1, lat2, long2, (double)WINTERHEIGHT, - "winter propagation, "); - } - } else if (Wflag) { - /* - * Compute delay from WWV - */ - lat1 = latlong(argv[ntp_optind], 1); - long1 = latlong(argv[ntp_optind + 1], 0); - lat2 = latlong(wwvlat, 1); - long2 = latlong(wwvlong, 0); - if (hflag) { - doit(lat1, long1, lat2, long2, height, "WWV "); - } else { - doit(lat1, long1, lat2, long2, (double)SUMMERHEIGHT, - "WWV summer propagation, "); - doit(lat1, long1, lat2, long2, (double)WINTERHEIGHT, - "WWV winter propagation, "); - } - - /* - * Compute delay from WWVH - */ - lat2 = latlong(wwvhlat, 1); - long2 = latlong(wwvhlong, 0); - if (hflag) { - doit(lat1, long1, lat2, long2, height, "WWVH "); - } else { - doit(lat1, long1, lat2, long2, (double)SUMMERHEIGHT, - "WWVH summer propagation, "); - doit(lat1, long1, lat2, long2, (double)WINTERHEIGHT, - "WWVH winter propagation, "); - } - } else if (Cflag) { - lat1 = latlong(argv[ntp_optind], 1); - long1 = latlong(argv[ntp_optind + 1], 0); - lat2 = latlong(chulat, 1); - long2 = latlong(chulong, 0); - if (hflag) { - doit(lat1, long1, lat2, long2, height, "CHU "); - } else { - doit(lat1, long1, lat2, long2, (double)SUMMERHEIGHT, - "CHU summer propagation, "); - doit(lat1, long1, lat2, long2, (double)WINTERHEIGHT, - "CHU winter propagation, "); - } - } else if (Gflag) { - lat1 = latlong(goes_up_lat, 1); - long1 = latlong(goes_up_long, 0); - lat3 = latlong(argv[ntp_optind], 1); - long3 = latlong(argv[ntp_optind + 1], 0); - - lat2 = latlong(goes_sat_lat, 1); - - long2 = latlong(goes_west_long, 0); - satdoit(lat1, long1, lat2, long2, lat3, long3, - "GOES Delay via WEST"); - - long2 = latlong(goes_stby_long, 0); - satdoit(lat1, long1, lat2, long2, lat3, long3, - "GOES Delay via STBY"); - - long2 = latlong(goes_east_long, 0); - satdoit(lat1, long1, lat2, long2, lat3, long3, - "GOES Delay via EAST"); - - } - exit(0); -} - - -/* - * doit - compute a delay and print it - */ -static void -doit(lat1, long1, lat2, long2, h, str) - double lat1; - double long1; - double lat2; - double long2; - double h; - char *str; -{ - int hops; - double delay; - - hops = finddelay(lat1, long1, lat2, long2, h, &delay); - printf("%sheight %g km, hops %d, delay %g seconds\n", - str, h, hops, delay); -} - - -/* - * latlong - decode a latitude/longitude value - */ -static double -latlong(str, islat) - char *str; - int islat; -{ - register char *cp; - register char *bp; - double arg; - double div; - int isneg; - char buf[32]; - char *colon; - - if (islat) { - /* - * Must be north or south - */ - if (*str == 'N' || *str == 'n') - isneg = 0; - else if (*str == 'S' || *str == 's') - isneg = 1; - else - isneg = -1; - } else { - /* - * East is positive, west is negative - */ - if (*str == 'E' || *str == 'e') - isneg = 0; - else if (*str == 'W' || *str == 'w') - isneg = 1; - else - isneg = -1; - } - - if (isneg >= 0) - str++; - - colon = strchr(str, ':'); - if (colon != NULL) { - /* - * in hhh:mm:ss form - */ - cp = str; - bp = buf; - while (cp < colon) - *bp++ = *cp++; - *bp = '\0'; - cp++; - arg = atof(buf); - div = 60.0; - colon = strchr(cp, ':'); - if (colon != NULL) { - bp = buf; - while (cp < colon) - *bp++ = *cp++; - *bp = '\0'; - cp++; - arg += atof(buf) / div; - div = 3600.0; - } - if (*cp != '\0') - arg += atof(cp) / div; - } else { - arg = atof(str); - } - - if (isneg == 1) - arg = -arg; - - if (debug > 2) - (void) printf("latitude/longitude %s = %g\n", str, arg); - - return arg; -} - - -/* - * greatcircle - compute the great circle distance in kilometers - */ -static double -greatcircle(lat1, long1, lat2, long2) - double lat1; - double long1; - double lat2; - double long2; -{ - double dg; - double l1r, l2r; - - l1r = lat1 * RADPERDEG; - l2r = lat2 * RADPERDEG; - dg = EARTHRADIUS * acos( - (cos(l1r) * cos(l2r) * cos((long2-long1)*RADPERDEG)) - + (sin(l1r) * sin(l2r))); - if (debug >= 2) - printf( - "greatcircle lat1 %g long1 %g lat2 %g long2 %g dist %g\n", - lat1, long1, lat2, long2, dg); - return dg; -} - - -/* - * waveangle - compute the wave angle for the given distance, virtual - * height and number of hops. - */ -static double -waveangle(dg, h, n) - double dg; - double h; - int n; -{ - double theta; - double delta; - - theta = dg / (EARTHRADIUS * (double)(2 * n)); - delta = atan((h / (EARTHRADIUS * sin(theta))) + tan(theta/2)) - theta; - if (debug >= 2) - printf("waveangle dist %g height %g hops %d angle %g\n", - dg, h, n, delta / RADPERDEG); - return delta; -} - - -/* - * propdelay - compute the propagation delay - */ -static double -propdelay(dg, h, n) - double dg; - double h; - int n; -{ - double phi; - double theta; - double td; - - theta = dg / (EARTHRADIUS * (double)(2 * n)); - phi = (PI/2.0) - atan((h / (EARTHRADIUS * sin(theta))) + tan(theta/2)); - td = dg / (LIGHTSPEED * sin(phi)); - if (debug >= 2) - printf("propdelay dist %g height %g hops %d time %g\n", - dg, h, n, td); - return td; -} - - -/* - * finddelay - find the propagation delay - */ -static int -finddelay(lat1, long1, lat2, long2, h, delay) - double lat1; - double long1; - double lat2; - double long2; - double h; - double *delay; -{ - double dg; /* great circle distance */ - double delta; /* wave angle */ - int n; /* number of hops */ - - dg = greatcircle(lat1, long1, lat2, long2); - if (debug) - printf("great circle distance %g km %g miles\n", dg, dg/MILE); - - n = 1; - while ((delta = waveangle(dg, h, n)) < 0.0) { - if (debug) - printf("tried %d hop%s, no good\n", n, n>1?"s":""); - n++; - } - if (debug) - printf("%d hop%s okay, wave angle is %g\n", n, n>1?"s":"", - delta / RADPERDEG); - - *delay = propdelay(dg, h, n); - return n; -} - -/* - * satdoit - compute a delay and print it - */ -static void -satdoit(lat1, long1, lat2, long2, lat3, long3, str) - double lat1; - double long1; - double lat2; - double long2; - double lat3; - double long3; - char *str; -{ - double up_delay,down_delay; - - satfinddelay(lat1, long1, lat2, long2, &up_delay); - satfinddelay(lat3, long3, lat2, long2, &down_delay); - - printf("%s, delay %g seconds\n", str, up_delay + down_delay); -} - -/* - * satfinddelay - calculate the one-way delay time between a ground station - * and a satellite - */ -static void -satfinddelay(lat1, long1, lat2, long2, delay) - double lat1; - double long1; - double lat2; - double long2; - double *delay; -{ - double dg; /* great circle distance */ - - dg = greatcircle(lat1, long1, lat2, long2); - - *delay = satpropdelay(dg); -} - -/* - * satpropdelay - calculate the one-way delay time between a ground station - * and a satellite - */ -static double -satpropdelay(dg) - double dg; -{ - double k1, k2, dist; - double theta; - double td; - - theta = dg / (EARTHRADIUS); - k1 = EARTHRADIUS * sin(theta); - k2 = SATHEIGHT - (EARTHRADIUS * cos(theta)); - if (debug >= 2) - printf("Theta %g k1 %g k2 %g\n", theta, k1, k2); - dist = sqrt(k1*k1 + k2*k2); - td = dist / LIGHTSPEED; - if (debug >= 2) - printf("propdelay dist %g height %g time %g\n", dg, dist, td); - return td; -} diff --git a/usr.sbin/xntpd/conf/Config.CHATHAM b/usr.sbin/xntpd/conf/Config.CHATHAM deleted file mode 100644 index b1f980be477b..000000000000 --- a/usr.sbin/xntpd/conf/Config.CHATHAM +++ /dev/null @@ -1,211 +0,0 @@ -# Edit this file to reflect information specific to your installation. -# Then run 'make makeconfig' to propagate the information to all the makefiles, -# Config.CHATHAM,v 3.1 1993/07/06 01:03:42 jbj Exp - -# -# Definitions for the library: -# -# You must define one of -DXNTP_BIG_ENDIAN, -DXNTP_LITTLE_ENDIAN -# or -DXNTP_AUTO_ENDIAN depending on which way your machine's -# bytes go for the benefit of the DES routine. Most things -# sold by DEC, the NS32x32 and the 80386 deserve a -# -DXNTP_LITTLE_ENDIAN. Most of the rest of the world does -# it the other way. If in doubt, pick one, compile -# everything and run authstuff/authcert < authstuff/certdata. -# If everything fails, do it the other way. -# -# Under BSD, you may define -DXNTP_NETINET_ENDIAN to use -# netinet/in.h to determine which of -DXNTP_BIG_ENDIAN and -# XNTP_LITTLE_ENDIAN should be used. -# -LIBDEFS= -DWORDS_BIGENDIAN - -# -# Library loading: -# -# If you don't want your library ranlib'ed, chose the second line -# -RANLIB= ranlib -#RANLIB= : # ar does the work of ranlib under System V - -# -# Definitions for programs: -# -# If your compiler doesn't understand the declaration `signed char', -# add -DNO_SIGNED_CHAR_DECL. Your `char' data type had better be -# signed. If you don't know what the compiler knows, try it -# without the flag. If you get a syntax error on line 13 of -# ntp.h, add it. Note that `signed char' is an ANSIism. Most -# older, pcc-derived compilers will need this flag. -# -# If your library already has 's_char' defined, add -DS_CHAR_DEFINED. -# -# For SunOS 3.x, add -DSUN_3_3_STINKS (otherwise it will complain -# about broadaddr and will hang if you run without a -d flag -# on the command line. I actually can't believe the latter -# bug. If it hangs on your system with the flag defined, peruse -# xntpd/ntp_io.c for some rude comments about SunOS 3.5 and try it -# the other way). This flag affects xntpd only. -# -# For Ultrix 2.0, add -DULT_2_0_SUCKS. This OS has the same hanging -# bug as SunOS 3.5 (is this an original 4.2 bug?) and in addition -# has some strangeness concerning signal masks. Ultrix 2.3 doesn't -# have these problems. If you're running something in between -# you're on your own. This flag affects xntpd only. -# -# For SunOS 4.x, add -DDOSYNCTODR_SUCKS to include the code in ntp_util.c -# that sets the battery clock at the same time that it updates -# the driftfile. It does this by revving up the niceness, then -# sets the time of day to the current time of day. Ordinarily, -# you would need this only on non-networked machines. -# -# For some machines, settimeofday does not set the sub-second component -# of the time correctly. For these machines add -DSETTIMEOFDAY_BROKEN. -# If xntpd keeps STEPPING the clock by small amounts, then it is -# possible that you are suffering from this problem. -# -# There are three ways to pry loose the kernel variables tick and tickadj -# needed by ntp_unixclock.c. One reads kmem and and is enabled -# with -DREADKMEM. One uses Sun's libkvm and is enabled with -# -DUSELIBKVM. The last one uses builtin defaults and is enabled -# with -DNOKMEM. Therefore, one of -DUSELIBKVM, -DREADKMEM or -# -DNOKMEM must be defined. Suns and recent BSD should use -# -DUSELIBKVM; others should use -DREADKMEM. If -DUSELIBKVM, use -# the DAEMONLIBS below to get the kernel routines. -# -# If your gethostbyname() routine isn't based on the DNS resolver (and, -# in particular, h_errno doesn't exist) add a -DNODNS. There -# doesn't seem to be a good way to detect this automatically which -# works in all cases. This flag affects xntpres only. -# -# Adding -DLOCK_PROCESS to the compilation flags will prevent -# xntpd from being swapped out on systems where the plock(3) call -# is available. -# -# The flag -DDEBUG includes some debugging code. -# -# The flag -DREFCLOCK causes the basic reference clock support to be -# compiled into the daemon. If you set this you will also want -# to configure the particular clock drivers you want in the -# CLOCKDEFS= line below. This flag affects xntpd only. -# -# To change the location of the configuration file, use a -# -DCONFIG_FILE=\\"/local/etc/ntp.conf\\" or something similar. -# -# Under HP-UX, you must use either -Dhpux70 or -Dhpux80 as, -# well as -DNOKMEM -# -# If your library doesn't include the vsprintf() routine, define -# NEED_VSPRINTF. -# -# There are three ways to utilize external 1-pps signals. Define -DPPS to -# include just the pps routine, such as used by the DCF77 reference clock -# driver. Define -DPPSDEV ito include a serial device driver. This -# requires a serial port and either a line discipline or STREAMS module. -# Define -DPPSCD to include the driver and a special kernal hack -# (for SunOS 4.1.1) that intercepts carrier-detect transitions -# generated by the pps signal. Only one of these flags should be defined. -# -DEFS= -DUSELIBKVM -DDEBUG -DSTREAM -DREFCLOCK -DNO_SIGNED_CHAR_DECL -DPPS -DPPSDEV -DXNTP_RETROFIT_STDLIB -DNTP_POSIX_SOURCE - -# -# Authentication types supported. Choose from DES and MD5. If you -# have a 680x0 type CPU and GNU-C, also choose -DFASTMD5 -# -AUTHDEFS=-DDES -DMD5 - -# -# Clock support definitions (these only make sense if -DREFCLOCK used): -# -# Define -DLOCAL_CLOCK to include local pseudo-clock support -# -# Define -DPST to include support for the PST 1020 WWV/H receiver. -# -# Define -DWWVB to include support for the Spectracom 8170 WWVB receiver. -# Define -DWWVBPPS for PPS support via the WWVB receiver; also, -# define -DPPSCD in the DEFS above. This requires the ppsclock -# streams module under SunOS 4.2. -# -# Define -DCHU to include support for a driver to receive the CHU -# timecode. Note that to compile in CHU support you must -# previously have installed the CHU serial line discipline in -# the kernel of the machine you are doing the compile on. -# -# Define -DDCF to include support for the DCF77 receiver. This code -# requires a special STREAMS module found in the kernel directory. -# Define -DDCFPPS for PPS support via the DCF77 receiver; also, -# devine -DPPS in the DEFS above. -# -# Define -DMX4200 to support a Magnavox 4200 GPS receiver. Define -DPPSCD -# in the DEFS above for PPS support via this receiver. This requires -# the ppsclock streams module under SunOS 4.2. -# -# Define -DAS2201 to include support for the Austron 2201 GPS Timing -# Receiver. Define -DPPSCD in the DEFS above for PPS support via this -# receiver. This requires the ppsclock streams module under SunOS 4.2. -# -# Define -DGOES to support a Kinemetrics TrueTime 468-DC GOES receiver. This -# driver may work with other True-Time products as well. -# -# Define -DOMEGA to support a Kinemetrics TrueTime OM-DC OMEGA receiver. -# -# Define -DTPRO to support a KSI/Odetics TPRO-S IRIG-B timecode reader. This -# requires the Sun interface driver available from KSI. -# -# Define -DLEITCH to support a Leitch CSD 5300 Master Clock System Driver -# for the HP 5061B Cesium Clock. -# -CLOCKDEFS= -DLOCAL_CLOCK -DPST -DWWVB -DWWVBPPS -DCHU -DDCF -DMX4200 -DAS2201 -DGOES -DOMEGA -DTPRO -DLEITCH -DIRIG - -# -# For MIPS 4.3BSD or RISCos 4.0, include a -lmld to get the nlist() routine. -# If USELIBKVM is defined above, include a -lkvm to get the kernel -# routines. -# -#DAEMONLIBS= -lmld -DAEMONLIBS= -lkvm -#DAEMONLIBS= - -# -# Name resolver library. Included when loading xntpres, which calls -# gethostbyname(). Define this if you would rather use a different -# version of the routine than the one in libc.a -# -#RESLIB= -lresolv -RESLIB= - -# -# Option flags for the C compiler. A -g if you are uncomfortable -# -COPTS= -O - -# -# C compiler to use. gcc will work, but avoid the -fstrength-reduce option -# if the version is 1.35 or earlier (using this option caused incorrect -# code to be generated in the DES key permutation code, and perhaps -# elsewhere). -# -COMPILER= gcc -pipe -Wall -g -O2 -finline-functions -fdelayed-branch -fomit-frame-pointer -#COMPILER= cc -pipe - -# -# Directory into which binaries should be installed -# -BINDIR= /usr/local/bin - -# -# Special library for adjtime emulation. Used under HP-UX -# (remember to run make in the adjtime directory) -# -#ADJLIB= ../adjtime/libadjtime.a -ADJLIB= - -# -# BSD emulation library. In theory, this fixes signal semantics under -# HP-UX, but it doesn't work with 8.0 on a 9000s340, so there is now -# a work-around in the code (compiled when hpux80 is defined). In other -# words, use this for HP-UX prior to 8.0. -# -#COMPAT= -lBSD -COMPAT= - diff --git a/usr.sbin/xntpd/conf/Config.HP-UX b/usr.sbin/xntpd/conf/Config.HP-UX deleted file mode 100644 index ef4fa302cb2c..000000000000 --- a/usr.sbin/xntpd/conf/Config.HP-UX +++ /dev/null @@ -1,7 +0,0 @@ -# -# Test suite for HPUX 9 (no multicast, kernel mods, disciplines, modem control) -# -DEFS_OPT=-DDEBUG -DEFS_LOCAL= $(DEFS_OPT) -DREFCLOCK -CLOCKDEFS= -DATOM -DAS2201 -DCHU -DGOES -DGPSTM -DIRIG -DLEITCH -DLOCAL_CLOCK -DMSFEES -DMX4200 -DNMEA -DOMEGA -DPST -DTPRO -DTRAK -DWWVB -BINDIR= /usr/local/bin diff --git a/usr.sbin/xntpd/conf/Config.MONOMOY b/usr.sbin/xntpd/conf/Config.MONOMOY deleted file mode 100644 index 18dddffe6ff1..000000000000 --- a/usr.sbin/xntpd/conf/Config.MONOMOY +++ /dev/null @@ -1,186 +0,0 @@ -# Edit this file to reflect information specific to your installation. -# Then run 'make makeconfig' to propagate the information to all the makefiles, -# Config.MONOMOY,v 3.1 1993/07/06 01:03:43 jbj Exp - -# Config.bsdi by Bdale Garbee, N3EUA, bdale@gag.com -# -# Tested with the BSDI BSD/386 0.9.3 "gamma 4" revision. It should -# work fine with this or later revs of BSD/386. -# -# Definitions for the library: -# -# You must define one of -DXNTP_BIG_ENDIAN, -DXNTP_LITTLE_ENDIAN -# or -DXNTP_AUTO_ENDIAN depending on which way your machine's -# bytes go for the benefit of the DES routine. Most things -# sold by DEC, the NS32x32 and the 80386 deserve a -# -DXNTP_LITTLE_ENDIAN. Most of the rest of the world does -# it the other way. If in doubt, pick one, compile -# everything and run authstuff/authcert < authstuff/certdata. -# If everything fails, do it the other way. -# -# Under BSD, you may define -DXNTP_NETINET_ENDIAN to use -# netinet/in.h to determine which of -DXNTP_BIG_ENDIAN and -# XNTP_LITTLE_ENDIAN should be used. -# -LIBDEFS= -DXNTP_LITTLE_ENDIAN - -# -# Library loading: -# -# If you don't want your library ranlib'ed, chose the second line -# -RANLIB= ranlib -#RANLIB= : # ar does the work of ranlib under System V - -# -# Definitions for programs: -# -# If your compiler doesn't understand the declaration `signed char', -# add -DNO_SIGNED_CHAR_DECL. Your `char' data type had better be -# signed. If you don't know what the compiler knows, try it -# without the flag. If you get a syntax error on line 13 of -# ntp.h, add it. Note that `signed char' is an ANSIism. Most -# older, pcc-derived compilers will need this flag. -# -# If your library already has 's_char' defined, add -DS_CHAR_DEFINED. -# -# For SunOS 3.x, add -DSUN_3_3_STINKS (otherwise it will complain -# about broadaddr and will hang if you run without a -d flag -# on the command line. I actually can't believe the latter -# bug. If it hangs on your system with the flag defined, peruse -# xntpd/ntp_io.c for some rude comments about SunOS 3.5 and try it -# the other way). This flag affects xntpd only. -# -# For Ultrix 2.0, add -DULT_2_0_SUCKS. This OS has the same hanging -# bug as SunOS 3.5 (is this an original 4.2 bug?) and in addition -# has some strangeness concerning signal masks. Ultrix 2.3 doesn't -# have these problems. If you're running something in between -# you're on your own. This flag affects xntpd only. -# -# For SunOS 4.x, add -DDOSYNCTODR_SUCKS to include the code in ntp_util.c -# that sets the battery clock at the same time that it updates -# the driftfile. It does this by revving up the niceness, then -# sets the time of day to the current time of day. Ordinarily, -# you would need this only on non-networked machines. -# -# There are three ways to pry loose the kernel variables tick and tickadj -# needed by ntp_unixclock.c. One reads kmem and and is enabled -# with -DREADKMEM. One uses Sun's libkvm and is enabled with -# -DUSELIBKVM. The last one uses builtin defaults and is enabled -# with -DNOKMEM. Therefore, one of -DUSELIBKVM, -DREADKMEM or -# -DNOKMEM must be defined. Suns and recent BSD should use -# -DUSELIBKVM; others should use -DREADKMEM. If -DUSELIBKVM, use -# the DAEMONLIBS below to get the kernel routines. -# -# If your gethostbyname() routine isn't based on the DNS resolver (and, -# in particular, h_errno doesn't exist) add a -DNODNS. There -# doesn't seem to be a good way to detect this automatically which -# works in all cases. This flag affects xntpres only. -# -# The flag -DDEBUG includes some debugging code. -# -# The flag -DREFCLOCK causes the basic reference clock support to be -# compiled into the daemon. If you set this you will also want -# to configure the particular clock drivers you want in the -# CLOCKDEFS= line below. This flag affects xntpd only. -# -# To change the location of the configuration file, use a -# -DCONFIG_FILE=\\"/local/etc/ntp.conf\\" or something similar. -# -# Under HP-UX, you must use either -Dhpux70 or -Dhpux80 as, -# well as -DNOKMEM -# -# If your library doesn't include the vsprintf() routine, define -# NEED_VSPRINTF. -# -# Define -DPPS to include support for a 1-pps signal. Define -DPPSDEV -# to include a device driver for it. The latter requires a -# serial port and either a line discipline or STREAMS module. -# The PPS signal may also be generated via a reference clock -# module like DCF77. In that case a special define is required for -# the reference clock module (only one source of PPS signal should -# be used) -# -DEFS= -DBSDI -DUSELIBKVM -DDEBUG -DREFCLOCK -DPPS -DCONFIG_FILE=\\"/usr/local/etc/xntp.conf\\" -DNTP_POSIX_SOURCE - -# -# Authentication types supported. Choose from DES and MD5. If you -# have a 680x0 type CPU and GNU-C, also choose -DFASTMD5 -# -AUTHDEFS=-DDES -DMD5 - -# -# Clock support definitions (these only make sense if -DREFCLOCK used): -# -# Define -DLOCAL_CLOCK to include local pseudo-clock support -# -# Define -DPST to include support for the PST 1020 WWV/H receiver. -# -# Define -DWWVB to include support for the Spectracom 8170 WWVB receiver. -# -# Define -DCHU to include support for a driver to receive the CHU -# timecode. Note that to compile in CHU support you must -# previously have installed the CHU serial line discipline in -# the kernel of the machine you are doing the compile on. -# -# Define -DDCF to include support for the DCF77 receiver. This code -# requires a special STREAMS module found in the kernel directory. -# Define -DDCFPPS for PPS support via the DCF77 receiver -# (see also: -DPPS) -# -# Define -DGOES to support a Kinemetrics TrueTime 468-DC GOES receiver. -# -CLOCKDEFS= -DLOCAL_CLOCK -DPST -DWWVB -DCHU -DGOES # -DMX4200 -DAS2201 - -# -# For MIPS 4.3BSD or RISCos 4.0, include a -lmld to get the nlist() routine. -# If USELIBKVM is defined above, include a -lkvm to get the kernel -# routines. -# -#DAEMONLIBS= -lmld -DAEMONLIBS= -lkvm -#DAEMONLIBS= - -# -# Name resolver library. Included when loading xntpres, which calls -# gethostbyname(). Define this if you would rather use a different -# version of the routine than the one in libc.a -# -#RESLIB= -lresolv -RESLIB= - -# -# Option flags for the C compiler. A -g if you are uncomfortable -# -COPTS= -O - -# -# C compiler to use. gcc will work, but avoid the -fstrength-reduce option -# if the version is 1.35 or earlier (using this option caused incorrect -# code to be generated in the DES key permutation code, and perhaps -# elsewhere). -# -COMPILER= gcc -pipe -Wall -g -O -finline-functions -fdelayed-branch -fomit-frame-pointer -#COMPILER= cc -pipe -g - -# -# Directory into which binaries should be installed -# -BINDIR= /usr/local/bin - -# -# Special library for adjtime emulation. Used under HP-UX -# (remember to run make in the adjtime directory) -# -#ADJLIB= ../adjtime/libadjtime.a -ADJLIB= - -# -# BSD emulation library. In theory, this fixes signal semantics under -# HP-UX, but it doesn't work with 8.0 on a 9000s340, so there is now -# a work-around in the code (compiled when hpux80 is defined). In other -# words, use this for HP-UX prior to 8.0. -# -#COMPAT= -lBSD -COMPAT= - diff --git a/usr.sbin/xntpd/conf/Config.OSF1 b/usr.sbin/xntpd/conf/Config.OSF1 deleted file mode 100644 index f460e9f934a7..000000000000 --- a/usr.sbin/xntpd/conf/Config.OSF1 +++ /dev/null @@ -1,7 +0,0 @@ -# -# Test suite for DEC OSF/1 V1.x (no disciplines) -# -DEFS_OPT=-DDEBUG -DEFS_LOCAL= $(DEFS_OPT) -DREFCLOCK -DKERNEL_PLL -DMCAST -CLOCKDEFS= -DACTS -DATOM -DAS2201 -DCHU -DDATUM -DGOES -DGPSTM -DHEATH -DIRIG -DLEITCH -DLOCAL_CLOCK -DMSFEES -DMX4200 -DNMEA -DOMEGA -DPST -DTPRO -DTRAK -DWWVB -BINDIR= /usr/local/bin diff --git a/usr.sbin/xntpd/conf/Config.SunOS b/usr.sbin/xntpd/conf/Config.SunOS deleted file mode 100644 index 42fd1a5cee6f..000000000000 --- a/usr.sbin/xntpd/conf/Config.SunOS +++ /dev/null @@ -1,7 +0,0 @@ -# -# Test suite for SunOS 4.1.x (kitchen sink) -# -DEFS_OPT=-DDEBUG -DEFS_LOCAL= $(DEFS_OPT) -DREFCLOCK -DMCAST -DKERNEL_PLL -DCLK -DCHU -DPPS -CLOCKDEFS= -DACTS -DATOM -DAS2201 -DCHU -DDATUM -DGOES -DGPSTM -DHEATH -DIRIG -DLEITCH -DLOCAL_CLOCK -DMSFEES -DMX4200 -DNMEA -DOMEGA -DPST -DTPRO -DTRAK -DWWVB -BINDIR= /usr/local/bin diff --git a/usr.sbin/xntpd/conf/Config.TIGER b/usr.sbin/xntpd/conf/Config.TIGER deleted file mode 100644 index 29c6cbd28cbe..000000000000 --- a/usr.sbin/xntpd/conf/Config.TIGER +++ /dev/null @@ -1,182 +0,0 @@ -# Edit this file to reflect information specific to your installation. -# Then run 'make makeconfig' to propagate the information to all the makefiles, -# Config.TIGER,v 3.1 1993/07/06 01:03:45 jbj Exp - -# -# Definitions for the library: -# -# You must define one of -DXNTP_BIG_ENDIAN, -DXNTP_LITTLE_ENDIAN -# or -DXNTP_AUTO_ENDIAN depending on which way your machine's -# bytes go for the benefit of the DES routine. Most things -# sold by DEC, the NS32x32 and the 80386 deserve a -# -DXNTP_LITTLE_ENDIAN. Most of the rest of the world does -# it the other way. If in doubt, pick one, compile -# everything and run authstuff/authcert < authstuff/certdata. -# If everything fails, do it the other way. -# -# Under BSD, you may define -DXNTP_NETINET_ENDIAN to use -# netinet/in.h to determine which of -DXNTP_BIG_ENDIAN and -# XNTP_LITTLE_ENDIAN should be used. -# -LIBDEFS= -DXNTP_LITTLE_ENDIAN - -# -# Library loading: -# -# If you don't want your library ranlib'ed, chose the second line -# -RANLIB= ranlib -#RANLIB= : # ar does the work of ranlib under System V - -# -# Definitions for programs: -# -# If your compiler doesn't understand the declaration `signed char', -# add -DNO_SIGNED_CHAR_DECL. Your `char' data type had better be -# signed. If you don't know what the compiler knows, try it -# without the flag. If you get a syntax error on line 13 of -# ntp.h, add it. Note that `signed char' is an ANSIism. Most -# older, pcc-derived compilers will need this flag. -# -# If your library already has 's_char' defined, add -DS_CHAR_DEFINED. -# -# For SunOS 3.x, add -DSUN_3_3_STINKS (otherwise it will complain -# about broadaddr and will hang if you run without a -d flag -# on the command line. I actually can't believe the latter -# bug. If it hangs on your system with the flag defined, peruse -# xntpd/ntp_io.c for some rude comments about SunOS 3.5 and try it -# the other way). This flag affects xntpd only. -# -# For Ultrix 2.0, add -DULT_2_0_SUCKS. This OS has the same hanging -# bug as SunOS 3.5 (is this an original 4.2 bug?) and in addition -# has some strangeness concerning signal masks. Ultrix 2.3 doesn't -# have these problems. If you're running something in between -# you're on your own. This flag affects xntpd only. -# -# For SunOS 4.x, add -DDOSYNCTODR_SUCKS to include the code in ntp_util.c -# that sets the battery clock at the same time that it updates -# the driftfile. It does this by revving up the niceness, then -# sets the time of day to the current time of day. Ordinarily, -# you would need this only on non-networked machines. -# -# There are three ways to pry loose the kernel variables tick and tickadj -# needed by ntp_unixclock.c. One reads kmem and and is enabled -# with -DREADKMEM. One uses Sun's libkvm and is enabled with -# -DUSELIBKVM. The last one uses builtin defaults and is enabled -# with -DNOKMEM. Therefore, one of -DUSELIBKVM, -DREADKMEM or -# -DNOKMEM must be defined. Suns and recent BSD should use -# -DUSELIBKVM; others should use -DREADKMEM. If -DUSELIBKVM, use -# the DAEMONLIBS below to get the kernel routines. -# -# If your gethostbyname() routine isn't based on the DNS resolver (and, -# in particular, h_errno doesn't exist) add a -DNODNS. There -# doesn't seem to be a good way to detect this automatically which -# works in all cases. This flag affects xntpres only. -# -# The flag -DDEBUG includes some debugging code. -# -# The flag -DREFCLOCK causes the basic reference clock support to be -# compiled into the daemon. If you set this you will also want -# to configure the particular clock drivers you want in the -# CLOCKDEFS= line below. This flag affects xntpd only. -# -# To change the location of the configuration file, use a -# -DCONFIG_FILE=\\"/local/etc/ntp.conf\\" or something similar. -# -# Under HP-UX, you must use either -Dhpux70 or -Dhpux80 as, -# well as -DNOKMEM -# -# If your library doesn't include the vsprintf() routine, define -# NEED_VSPRINTF. -# -# Define -DPPS to include support for a 1-pps signal. Define -DPPSDEV -# to include a device driver for it. The latter requires a -# serial port and either a line discipline or STREAMS module. -# The PPS signal may also be generated via a reference clock -# module like DCF77. In that case a special define is required for -# the reference clock module (only one source of PPS signal should -# be used) -# -DEFS= -DREFCLOCK -DS_CHAR_DEFINED -DREADKMEM -DDEBUG -DPLL -DXNTP_RETROFIT_STDLIB -DNTP_POSIX_SOURCE - -# -# Authentication types supported. Choose from DES and MD5. If you -# have a 680x0 type CPU and GNU-C, also choose -DFASTMD5 -# -AUTHDEFS=-DDES -DMD5 - -# -# Clock support definitions (these only make sense if -DREFCLOCK used): -# -# Define -DLOCAL_CLOCK to include local pseudo-clock support -# -# Define -DPST to include support for the PST 1020 WWV/H receiver. -# -# Define -DWWVB to include support for the Spectracom 8170 WWVB receiver. -# -# Define -DCHU to include support for a driver to receive the CHU -# timecode. Note that to compile in CHU support you must -# previously have installed the CHU serial line discipline in -# the kernel of the machine you are doing the compile on. -# -# Define -DDCF to include support for the DCF77 receiver. This code -# requires a special STREAMS module found in the kernel directory. -# Define -DDCFPPS for PPS support via the DCF77 receiver -# (see also: -DPPS) -# -# Define -DGOES to support a Kinemetrics TrueTime 468-DC GOES receiver. -# -CLOCKDEFS= -DLOCAL_CLOCK -DPST -DWWVB -DGOES -DCHU - -# -# For MIPS 4.3BSD or RISCos 4.0, include a -lmld to get the nlist() routine. -# If USELIBKVM is defined above, include a -lkvm to get the kernel -# routines. -# -#DAEMONLIBS= -lmld -#DAEMONLIBS= -lkvm -DAEMONLIBS= - -# -# Name resolver library. Included when loading xntpres, which calls -# gethostbyname(). Define this if you would rather use a different -# version of the routine than the one in libc.a -# -#RESLIB= -lresolv -RESLIB= - -# -# Option flags for the C compiler. A -g if you are uncomfortable -# -COPTS= -O - -# -# C compiler to use. gcc will work, but avoid the -fstrength-reduce option -# if the version is 1.35 or earlier (using this option caused incorrect -# code to be generated in the DES key permutation code, and perhaps -# elsewhere). -# -COMPILER= gcc -Wall -g -O2 -finline-functions -fdelayed-branch -fomit-frame-pointer -#COMPILER= cc - -# -# Directory into which binaries should be installed -# -BINDIR= /usr/local/bin - -# -# Special library for adjtime emulation. Used under HP-UX -# (remember to run make in the adjtime directory) -# -#ADJLIB= ../adjtime/libadjtime.a -ADJLIB= - -# -# BSD emulation library. In theory, this fixes signal semantics under -# HP-UX, but it doesn't work with 8.0 on a 9000s340, so there is now -# a work-around in the code (compiled when hpux80 is defined). In other -# words, use this for HP-UX prior to 8.0. -# -#COMPAT= -lBSD -COMPAT= - diff --git a/usr.sbin/xntpd/conf/Config.TRURO b/usr.sbin/xntpd/conf/Config.TRURO deleted file mode 100644 index 2fc258002096..000000000000 --- a/usr.sbin/xntpd/conf/Config.TRURO +++ /dev/null @@ -1,202 +0,0 @@ -# Edit this file to reflect information specific to your installation. -# Then run 'make makeconfig' to propagate the information to all the makefiles, -# Config.TRURO,v 3.1 1993/07/06 01:03:46 jbj Exp - -# -# Definitions for the library: -# -# You must define one of -DXNTP_BIG_ENDIAN, -DXNTP_LITTLE_ENDIAN -# or -DXNTP_AUTO_ENDIAN depending on which way your machine's -# bytes go for the benefit of the DES routine. Most things -# sold by DEC, the NS32x32 and the 80386 deserve a -# -DXNTP_LITTLE_ENDIAN. Most of the rest of the world does -# it the other way. If in doubt, pick one, compile -# everything and run authstuff/authcert < authstuff/certdata. -# If everything fails, do it the other way. -# -# Under BSD, you may define -DXNTP_NETINET_ENDIAN to use -# netinet/in.h to determine which of -DXNTP_BIG_ENDIAN and -# XNTP_LITTLE_ENDIAN should be used. -# -LIBDEFS= -DWORDS_BIGENDIAN - -# -# Library loading: -# -# If you don't want your library ranlib'ed, chose the second line -# -RANLIB= : # ar does the work of ranlib under System V - -# -# Definitions for programs: -# -# If your compiler doesn't understand the declaration `signed char', -# add -DNO_SIGNED_CHAR_DECL. Your `char' data type had better be -# signed. If you don't know what the compiler knows, try it -# without the flag. If you get a syntax error on line 13 of -# ntp.h, add it. Note that `signed char' is an ANSIism. Most -# older, pcc-derived compilers will need this flag. -# -# If your library already has 's_char' defined, add -DS_CHAR_DEFINED. -# -# For SunOS 3.x, add -DSUN_3_3_STINKS (otherwise it will complain -# about broadaddr and will hang if you run without a -d flag -# on the command line. I actually can't believe the latter -# bug. If it hangs on your system with the flag defined, peruse -# xntpd/ntp_io.c for some rude comments about SunOS 3.5 and try it -# the other way). This flag affects xntpd only. -# -# For Ultrix 2.0, add -DULT_2_0_SUCKS. This OS has the same hanging -# bug as SunOS 3.5 (is this an original 4.2 bug?) and in addition -# has some strangeness concerning signal masks. Ultrix 2.3 doesn't -# have these problems. If you're running something in between -# you're on your own. This flag affects xntpd only. -# -# For SunOS 4.x, add -DDOSYNCTODR_SUCKS to include the code in ntp_util.c -# that sets the battery clock at the same time that it updates -# the driftfile. It does this by revving up the niceness, then -# sets the time of day to the current time of day. Ordinarily, -# you would need this only on non-networked machines. -# -# For some machines, settimeofday does not set the sub-second component -# of the time correctly. For these machines add -DSETTIMEOFDAY_BROKEN. -# If xntpd keeps STEPPING the clock by small amounts, then it is -# possible that you are suffering from this problem. -# -# There are four ways to pry loose the kernel variables tick and tickadj -# needed by ntp_unixclock.c. One reads kmem and and is enabled -# with -DREADKMEM. One uses Sun's libkvm and is enabled with -# -DUSELIBKVM. The last one uses builtin defaults and is enabled -# with -DNOKMEM. Therefore, one of -DUSELIBKVM, -DREADKMEM or -# -DNOKMEM must be defined. Suns, if they are not running Solaris, -# and recent BSD should use -DUSELIBKVM; others should use -# -DREADKMEM. Soalris 2.1 should use -DSOLARIS. -# If -DUSELIBKVM, use the DAEMONLIBS below to get the -# kernel routines. -# -# If your gethostbyname() routine isn't based on the DNS resolver (and, -# in particular, h_errno doesn't exist) add a -DNODNS. There -# doesn't seem to be a good way to detect this automatically which -# works in all cases. This flag affects xntpres only. -# -# The flag -DDEBUG includes some debugging code. -# -# The flag -DREFCLOCK causes the basic reference clock support to be -# compiled into the daemon. If you set this you will also want -# to configure the particular clock drivers you want in the -# CLOCKDEFS= line below. This flag affects xntpd only. -# -# To change the location of the configuration file, use a -# -DCONFIG_FILE=\\"/local/etc/ntp.conf\\" or something similar. -# -# Under HP-UX, you must use either -Dhpux70 or -Dhpux80 as, -# well as -DNOKMEM -# -# Under Solaris 2.1, you must use -DSOLARIS and -DSLEWALWAYS. -# Don't define USELIBKVM, NOKMEM or READKMEM. -# -# If your library doesn't include the vsprintf() routine, define -# NEED_VSPRINTF. -# -# There are three ways to utilize external 1-pps signals. Define -DPPS to -# include just the pps routine, such as used by the DCF77 reference clock -# driver. Define -DPPSDEV ito include a serial device driver. This -# requires a serial port and either a line discipline or STREAMS module. -# Define -DPPSCD to include the driver and a special kernal hack -# (for SunOS 4.1.1) that intercepts carrier-detect transitions -# generated by the pps signal. Only one of these flags should be defined. -# -DEFS= -DDEBUG -DSTREAM -DREFCLOCK -DNO_SIGNED_CHAR_DECL -DSLEWALWAYS -DSOLARIS -DPPS -DSTUPID_SIGNAL -DXNTP_RETROFIT_STDLIB -DNTP_POSIX_SOURCE - -# -# Authentication types supported. Choose from DES and MD5. If you -# have a 680x0 type CPU and GNU-C, also choose -DFASTMD5 -# -AUTHDEFS=-DDES -DMD5 - -# -# Clock support definitions (these only make sense if -DREFCLOCK used): -# -# Define -DLOCAL_CLOCK to include local pseudo-clock support -# -# Define -DPST to include support for the PST 1020 WWV/H receiver. -# -# Define -DWWVB to include support for the Spectracom 8170 WWVB receiver. -# Define -DWWVBPPS for PPS support via the WWVB receiver; also, -# define -DPPSCD in the DEFS above. This requires the ppsclock -# streams module under SunOS 4.2. -# -# Define -DCHU to include support for a driver to receive the CHU -# timecode. Note that to compile in CHU support you must -# previously have installed the CHU serial line discipline in -# the kernel of the machine you are doing the compile on. -# -# Define -DDCF to include support for the DCF77 receiver. This code -# requires a special STREAMS module found in the kernel directory. -# Define -DDCFPPS for PPS support via the DCF77 receiver; also, -# devine -DPPS in the DEFS above. -# -# Define -DMX4200 to support a Magnavox 4200 GPS receiver. Define -DPPSCD -# in the DEFS above for PPS support via this receiver. This requires -# the ppsclock streams module under SunOS 4.2. -# -# Define -DAS2201 to include support for the Austron 2201 GPS Timing -# Receiver. Define -DPPSCD in the DEFS above for PPS support via this -# receiver. This requires the ppsclock streams module under SunOS 4.2. -# -# Define -DGOES to support a Kinemetrics TrueTime 468-DC GOES receiver. This -# driver may work with other True-Time products as well. -# -CLOCKDEFS= -DLOCAL_CLOCK -DPST -DWWVB -DWWVBPPS -DGOES -DCHU -DMX4200 -DAS2201 -DOMEGA -DTPRO -DLEITCH -DIRIG - -# -# For MIPS 4.3BSD or RISCos 4.0, include a -lmld to get the nlist() routine. -# If USELIBKVM is defined above, include a -lkvm to get the kernel -# routines. -# -#DAEMONLIBS= -lmld -DAEMONLIBS= - -# -# Name resolver library. Included when loading xntpres, which calls -# gethostbyname(). Define this if you would rather use a different -# version of the routine than the one in libc.a -# -#RESLIB= -lresolv -RESLIB= -lsocket -lnsl -lelf - -# -# Option flags for the C compiler. A -g if you are uncomfortable -# -COPTS= -O - -# -# C compiler to use. gcc will work, but avoid the -fstrength-reduce option -# if the version is 1.35 or earlier (using this option caused incorrect -# code to be generated in the DES key permutation code, and perhaps -# elsewhere). -# -#COMPILER= gcc -traditional -COMPILER= gcc -pipe -Wall -g -O2 -finline-functions -fdelayed-branch -fomit-frame-pointer - -# -# Directory into which binaries should be installed -# -BINDIR= /usr/local/bin - -# -# Special library for adjtime emulation. Used under HP-UX -# (remember to run make in the adjtime directory) -# -#ADJLIB= ../adjtime/libadjtime.a -ADJLIB= - -# -# BSD emulation library. In theory, this fixes signal semantics under -# HP-UX, but it doesn't work with 8.0 on a 9000s340, so there is now -# a work-around in the code (compiled when hpux80 is defined). In other -# words, use this for HP-UX prior to 8.0. -# -#COMPAT= -lBSD -COMPAT= - diff --git a/usr.sbin/xntpd/conf/Config.ULTRIX b/usr.sbin/xntpd/conf/Config.ULTRIX deleted file mode 100644 index 4ead1be017a0..000000000000 --- a/usr.sbin/xntpd/conf/Config.ULTRIX +++ /dev/null @@ -1,7 +0,0 @@ -# -# Test suite for Ultrix 4.x (no disciplines) -# -DEFS_OPT=-DDEBUG -DEFS_LOCAL= $(DEFS_OPT) -DREFCLOCK -DKERNEL_PLL -DMCAST -CLOCKDEFS= -DACTS -DATOM -DAS2201 -DCHU -DDATUM -DGOES -DGPSTM -DHEATH -DIRIG -DLEITCH -DLOCAL_CLOCK -DMSFEES -DMX4200 -DNMEA -DOMEGA -DPST -DTPRO -DTRAK -DWWVB -BINDIR= /usr/local/bin diff --git a/usr.sbin/xntpd/conf/Config.VAX b/usr.sbin/xntpd/conf/Config.VAX deleted file mode 100644 index 66b9f91007bd..000000000000 --- a/usr.sbin/xntpd/conf/Config.VAX +++ /dev/null @@ -1,7 +0,0 @@ -# -# Test suite for 4.3bsd VAX tahoe (no multicast, kernel mods, disciplines) -# -DEFS_OPT=-DDEBUG -DEFS_LOCAL= $(DEFS_OPT) -DREFCLOCK -CLOCKDEFS= -DACTS -DATOM -DAS2201 -DCHU -DDATUM -DGOES -DGPSTM -DHEATH -DIRIG -DLEITCH -DLOCAL_CLOCK -DMSFEES -DMX4200 -DNMEA -DOMEGA -DPST -DTPRO -DTRAK -DWWVB -BINDIR= /usr/local/bin diff --git a/usr.sbin/xntpd/conf/Config.dartnet b/usr.sbin/xntpd/conf/Config.dartnet deleted file mode 100644 index b591db341655..000000000000 --- a/usr.sbin/xntpd/conf/Config.dartnet +++ /dev/null @@ -1,187 +0,0 @@ -# This is the local configure file (distribution version). -# You must modify it to fit your particular configuration -# and name it Config.local -# The following configuratiions can be auto-generated: -# -# make Config.local.green -# make a Config.local that supports a local clock -# (i.e. allow fallback to use of the CPU's own clock) -# make Config.local.NO.clock -# make a Config.local that supports no clocks -# -# -# NOTE TO GREENHORNS -# -# For plug-'n-play and no radios or other complicated gadgetry, -# use "make Config.local.green" or "make Config.local.local" as above. -# -# Following defines can be set in the DEFS_OPT= define: -# -# The flag -DDEBUG includes some debugging code. To use this, include -# the define and start the daemon with one or more -d flags, depending -# on your calibration of pearannoya. The daemon will not detach your -# terminal in this case. Judicious use of grep will reduce the speaker -# volume to bearable levels. -# -# To change the location of the configuration file, use a -# -DCONFIG_FILE=\\"/local/etc/ntp.conf\\" or something similar. -# -# The -DSYSLOG_FILE defines allows logging messages that are normally -# reported via syslof() in a file. The file name can be configured using -# the configuration line "logfile <filename>" in CONFIG_FILE. -# -# There are three serial port system software interfaces, each of -# which is peculiar to one or more Unix versions. Define -# -DHAVE_SYSV_TTYS for basic System V compatibility; define -DSTREAM -# for POSIX compatibility including System V Streams, and -# HAVE_BSD_TTYS for 4.3bsd compatibility. Only one of these three -# should be defined. If none are defined, HAVE_BSD_TTYS is assumed. -# Usually these defines are already set correctly. -# -DEFS_OPT=-DDEBUG -# -# The DEFS_LOCAL define picks up all flags from DEFS_OPT (do not delete that) -# and one of the following: -# -# The flag -DREFCLOCK causes the basic reference clock support to be -# compiled into the daemon. If you set this you may also want to -# configure the particular clock drivers you want in the CLOCKDEFS= line -# below. This flag affects xntpd only. This define is included by -# default when using the "make makeconfig" script. -# -# The next two sets of defines are meaningful only when radio clock -# drivers or special 1-pps signals are to be used. For systems without -# these features, these delicious complexities can be avoided. Ordinarily, -# the "make makeconfig" script figures out which ones to use, but your -# mileage may vary. -# -# There are three ways to utilize external 1-pps signals. Define -# -DPPS to include just the pps routine, such as used by the DCF77(PARSE) -# clock driver. Define -DPPSCLK to include a serial device driver -# which avoids much of the jitter due to upper level port -# processing. This requires a dedicated serial port and either the -# tty_clock line discipline or tty_clk_streams module, both of -# which are in the ./kernel directory. Define -DPPSCD to include a -# special driver which intercepts carrier-detect transitions -# generated by the pps signal. This requires a nondedicated serial -# port and the ppsclock streams module in the ./kernel directory. -# Only one of these three flags should be defined. -# -# The flag KERNEL_PLL causes code to be compiled for a special feature of -# the kernel that (a) implements the phase-lock loop and (b) provides -# a user interface to learn time, maximum error and estimated error. -# See the file README.kern in the doc directory for further info. -# This code is activated only if the relevant kernel features have -# been configured; it does not affect operation of unmodified kernels. -# To compile it, however, requires a few header files from the -# special distribution. -# -# Note: following line must always start with DEFS_LOCAL= $(DEFS_OPT) -DEFS_LOCAL= $(DEFS_OPT) -DPPSPPS -DREFCLOCK -DKERNEL_PLL -# -# Radio clock support definitions (these only make sense if -DREFCLOCK -# used), which is normally the case. Note that a configuration can include -# no clocks, more than one type of clock and even multiple clocks of the -# same type. -# -# For most radio clocks operating with serial ports, accuracy can -# be considerably improved through use of the tty_clk line -# discipline or tty_clk_STREAMS streams module found in the -# ./kernel directory. These gizmos capture a timestamp upon -# occurrence of an intercept character and stuff it in the data -# stream for the clock driver to munch. To select this mode, -# postfix the driver name with the string CLK; that is, WWVB -# becomes WWVBCLK. If more than one clock is in use, the CLK -# postfix can be used with any or all of them. -# -# Alternatively, for the best accuracy, use the ppsclock streams -# module in the ./ppsclock directory to steal the carrier-detect -# transition and capture a precision timestamp. At present this -# works only with SunOS 4.1.1 or later. To select this mode, -# postfix the driver name with the string PPS; that is, AS2201 -# becomes AS2201PPS. If more than one clock is in use, the PPS -# postfix should be used with only one of them. If any PPS -# postfix is defined, the -DPPSPPS define should be used on the -# DEFS above. -# -# Define -DLOCAL_CLOCK for a local pseudo-clock to masquerade as a -# reference clock for those subnets without access to the real thing. -# Works in all systems and requires no hardware support. This is defined -# by default when using the "make makeconfig" script and greenhorn -# configuraiton. -# -# Define -DPST for a PST/Traconex 1020 WWV/H receiver. The driver -# supports both the CLK and PPS modes. It should work in all systems -# with a serial port. -# -# Define -DWWVB for a Spectracom 8170 or Netclock/2 WWVB receiver. It -# should work in all systems with a serial port. The driver supports -# both the CLK and PPS modes if the requisite kernel support is installed. -# -# Define -DCHU for a special CHU receiver using an ordinary shortwave -# radio. This requires the chu_clk line discipline or chu_clk_STREAMS -# module in the ./kernel directory. At present, this driver works only -# on SunOS4.1.x; operation in other systems has not been confirmed. -# Construction details for a suitable modem can be found in the ./gadget -# directory. The driver supports # neither the CLK nor PPS modes. -# -# Define -DPARSE for a DCF77/GPS(GENERIC) receiver. For best performance -# this requires a special parsestreams STREAMS (SunOS 4.x) module in the -# ./parse directory. Define -DPARSEPPS for PPS support via the -# DCF77/GPS (GENERIC) receiver; also, define -DPPS in the DEFS above. -# Define: -DCLOCK_MEINBERG for Meinberg clocks -# -DCLOCK_SCHMID for Schmid receivers -# -DCLOCK_DCF7000 for ELV DCF7000 -# -DCLOCK_RAWDCF for simple receivers (100/200ms pulses on Rx) -# -DCLOCK_TRIMSV6 for Trimble SV6 GPS receiver -# -# Define -DMX4200PPS for a Magnavox 4200 GPS receiver. At present, this -# driver works only on SunOS4.1.x with CPU serial ports only. The PPS -# mode is required. -# -# Define -DAS2201 for an Austron 2200A or 2201A GPS receiver. It should -# work in all systems with a serial port. The driver does not support the -# CLK mode, but does support the PPS mode. If the radio is connected to -# more than one machine, the PPS mode is required. -# -# Define -DGOES for a Kinemetrics/TrueTime 468-DC GOES receiver. This -# driver is known to work with some other TrueTime products as well, -# including the GPS-DC GPS receiver. It should work in all systems with -# a serial port. The driver does not support the CLK mode, but does -# support the PPS mode. -# -# Define -DOMEGA for a Kinemetrics/TrueTime OM-DC OMEGA receiver. It -# should work in all systems with a serial port. The driver does not -# support the CLK mode, but does support the PPS mode. -# -# Define -DTPRO for a KSI/Odetics TPRO-S IRIG-B timecode reader. This -# requires the SunOS interface driver available from KSI. The driver -# supports neither the CLK nor PPS modes. -# -# Define -DLEITCH for a Leitch CSD 5300 Master Clock System Driver for -# the HP 5061B Cesium Clock. It should work in all systems with a serial -# port. The driver does not support the CLK mode, but does support the -# PPS mode. -# -# Define -DMSFEESPPS for an EES M201 MSF receiver. It currently only works -# under SunOS 4.x with the PPSCD (ppsclock) STREAMS module, but the RCS -# files on cl.cam.ac.uk still has support for CLK and CBREAK modes. -# -# Define -DIRIG for a IRIG-B timecode timecode using the audio codec of -# the Sun SPARCstations. This requires a modified BSD audio driver and -# exclusive access to the audio port. A memo describing how it works and -# how to install the driver is in the README.irig file in the ./doc -# directory. -# -# Note: The following defines result in compilation of all the above radio -# clocks. This works on a Sun 4.1.x system which has tty_clk, chu_clk and -# ppsclock STREAMS modules installed. If the trailing CLK and PPS suffixes -# are removed and the IRIG, PARSE* and CLOCK* deleted, all of the rest compile -# under Ultrix 4.2a/3. If the MX4200 is removed, all the rest compile on a DEC -# OSF/1 Alpha. -# -CLOCKDEFS=-DAS2201PPS -DCHU -DGOES -DIRIG -DLEITCH -DLOCAL_CLOCK -DMX4200PPS -DOMEGA -DPSTCLK -DTPRO -DWWVBCLK -# -# Directory into which binaries should be installed (default /usr/local) -# -BINDIR= /usr/local/bin diff --git a/usr.sbin/xntpd/conf/Config.local b/usr.sbin/xntpd/conf/Config.local deleted file mode 100644 index 22c12a36e90a..000000000000 --- a/usr.sbin/xntpd/conf/Config.local +++ /dev/null @@ -1,190 +0,0 @@ -# This is the local configure file (distribution version). -# You must modify it to fit your particular configuration -# and name it Config.local -# The following configuratiions can be auto-generated: -# -# make Config.local.green -# make a Config.local that supports a local clock -# (i.e. allow fallback to use of the CPU's own clock) -# make Config.local.NO.clock -# make a Config.local that supports no clocks -# -# -# NOTE TO GREENHORNS -# -# For plug-'n-play and no radios or other complicated gadgetry, -# use "make Config.local.green" as above. -# -# Following defines can be set in the DEFS_OPT= define: -# -# The flag -DDEBUG includes some debugging code. To use this, include -# the define and start the daemon with one or more -d flags, depending -# on your calibration of pearannoya. The daemon will not detach your -# terminal in this case. Judicious use of grep will reduce the speaker -# volume to bearable levels. -# -# To change the location of the configuration file, use a -# -DCONFIG_FILE=\\"/local/etc/ntp.conf\\" or something similar. -# -# The -DSYSLOG_FILE defines allows logging messages that are normally -# reported via syslof() in a file. The file name can be configured using -# the configuration line "logfile <filename>" in CONFIG_FILE. -# -# There are three serial port system software interfaces, each of -# which is peculiar to one or more Unix versions. Define -# -DHAVE_SYSV_TTYS for basic System V compatibility; define -DSTREAM -# for POSIX compatibility including System V Streams, and -# HAVE_BSD_TTYS for 4.3bsd compatibility. Only one of these three -# should be defined. If none are defined, HAVE_BSD_TTYS is assumed. -# Usually these defines are already set correctly. -# -DEFS_OPT=-DDEBUG - -# -# The DEFS_LOCAL define picks up all flags from DEFS_OPT (do not delete that) -# and one of the following: -# -# The flag -DREFCLOCK causes the basic reference clock support to be -# compiled into the daemon. If you set this you may also want to -# configure the particular clock drivers you want in the CLOCKDEFS= line -# below. This flag affects xntpd only. This define is included by -# default when using the "make makeconfig" script. -# -# The next two sets of defines are meaningful only when radio clock -# drivers or special 1-pps signals are to be used. For systems without -# these features, these delicious complexities can be avoided. Ordinarily, -# the "make makeconfig" script figures out which ones to use, but your -# mileage may vary. -# -# There are three ways to utilize external 1-pps signals. Define -# -DPPS to include just the pps routine, such as used by the DCF77(PARSE) -# clock driver. Define -DPPSCLK to include a serial device driver -# which avoids much of the jitter due to upper level port -# processing. This requires a dedicated serial port and either the -# tty_clock line discipline or tty_clk_streams module, both of -# which are in the ./kernel directory. Define -DPPSCD to include a -# special driver which intercepts carrier-detect transitions -# generated by the pps signal. This requires a nondedicated serial -# port and the ppsclock streams module in the ./kernel directory. -# Only one of these three flags should be defined. -# -# The flag KERNEL_PLL causes code to be compiled for a special feature of -# the kernel that (a) implements the phase-lock loop and (b) provides -# a user interface to learn time, maximum error and estimated error. -# See the file README.kern in the doc directory for further info. -# This code is activated only if the relevant kernel features have -# been configured; it does not affect operation of unmodified kernels. -# To compile it, however, requires a few header files from the -# special distribution. -# -# Note: following line must always start with DEFS_LOCAL= $(DEFS_OPT) -DEFS_LOCAL= $(DEFS_OPT) -DREFCLOCK -DKERNEL_PLL -DMCAST - -# -# Radio clock support definitions (these only make sense if -DREFCLOCK -# used), which is normally the case. Note that a configuration can include -# no clocks, more than one type of clock and even multiple clocks of the -# same type. -# -# For most radio clocks operating with serial ports, accuracy can -# be considerably improved through use of the tty_clk line -# discipline or tty_clk_STREAMS streams module found in the -# ./kernel directory. These gizmos capture a timestamp upon -# occurrence of an intercept character and stuff it in the data -# stream for the clock driver to munch. To select this mode, -# postfix the driver name with the string CLK; that is, WWVB -# becomes WWVBCLK. If more than one clock is in use, the CLK -# postfix can be used with any or all of them. -# -# Alternatively, for the best accuracy, use the ppsclock streams -# module in the ./ppsclock directory to steal the carrier-detect -# transition and capture a precision timestamp. At present this -# works only with SunOS 4.1.1 or later. To select this mode, -# postfix the driver name with the string PPS; that is, AS2201 -# becomes AS2201PPS. If more than one clock is in use, the PPS -# postfix should be used with only one of them. If any PPS -# postfix is defined, the -DPPSPPS define should be used on the -# DEFS above. -# -# Define -DLOCAL_CLOCK for a local pseudo-clock to masquerade as a -# reference clock for those subnets without access to the real thing. -# Works in all systems and requires no hardware support. This is defined -# by default when using the "make makeconfig" script and greenhorn -# configuraiton. -# -# Define -DPST for a PST/Traconex 1020 WWV/H receiver. The driver -# supports both the CLK and PPS modes. It should work in all systems -# with a serial port. -# -# Define -DWWVB for a Spectracom 8170 or Netclock/2 WWVB receiver. It -# should work in all systems with a serial port. The driver supports -# both the CLK and PPS modes if the requisite kernel support is installed. -# -# Define -DCHU for a special CHU receiver using an ordinary shortwave -# radio. This requires the chu_clk line discipline or chu_clk_STREAMS -# module in the ./kernel directory. At present, this driver works only -# on SunOS4.1.x; operation in other systems has not been confirmed. -# Construction details for a suitable modem can be found in the ./gadget -# directory. The driver supports # neither the CLK nor PPS modes. -# -# Define -DPARSE for a DCF77/GPS(GENERIC) receiver. For best performance -# this requires a special parsestreams STREAMS (SunOS 4.x) module in the -# ./parse directory. Define -DPARSEPPS for PPS support via the -# DCF77/GPS (GENERIC) receiver; also, define -DPPS in the DEFS above. -# Define: -DCLOCK_MEINBERG for Meinberg clocks -# -DCLOCK_SCHMID for Schmid receivers -# -DCLOCK_DCF7000 for ELV DCF7000 -# -DCLOCK_RAWDCF for simple receivers (100/200ms pulses on Rx) -# -DCLOCK_TRIMSV6 for Trimble SV6 GPS receiver -# -# Define -DMX4200PPS for a Magnavox 4200 GPS receiver. At present, this -# driver works only on SunOS4.1.x with CPU serial ports only. The PPS -# mode is required. -# -# Define -DAS2201 for an Austron 2200A or 2201A GPS receiver. It should -# work in all systems with a serial port. The driver does not support the -# CLK mode, but does support the PPS mode. If the radio is connected to -# more than one machine, the PPS mode is required. -# -# Define -DGOES for a Kinemetrics/TrueTime 468-DC GOES receiver. This -# driver is known to work with some other TrueTime products as well, -# including the GPS-DC GPS receiver. It should work in all systems with -# a serial port. The driver does not support the CLK mode, but does -# support the PPS mode. -# -# Define -DOMEGA for a Kinemetrics/TrueTime OM-DC OMEGA receiver. It -# should work in all systems with a serial port. The driver does not -# support the CLK mode, but does support the PPS mode. -# -# Define -DTPRO for a KSI/Odetics TPRO-S IRIG-B timecode reader. This -# requires the SunOS interface driver available from KSI. The driver -# supports neither the CLK nor PPS modes. -# -# Define -DLEITCH for a Leitch CSD 5300 Master Clock System Driver for -# the HP 5061B Cesium Clock. It should work in all systems with a serial -# port. The driver does not support the CLK mode, but does support the -# PPS mode. -# -# Define -DMSFEESPPS for an EES M201 MSF receiver. It currently only works -# under SunOS 4.x with the PPSCD (ppsclock) STREAMS module, but the RCS -# files on cl.cam.ac.uk still has support for CLK and CBREAK modes. -# -# Define -DIRIG for a IRIG-B timecode timecode using the audio codec of -# the Sun SPARCstations. This requires a modified BSD audio driver and -# exclusive access to the audio port. A memo describing how it works and -# how to install the driver is in the README.irig file in the ./doc -# directory. -# -# Note: The following defines result in compilation of all the above radio -# clocks. This works on a Sun 4.1.x system which has tty_clk, chu_clk and -# ppsclock STREAMS modules installed. If the trailing CLK and PPS suffixes -# are removed and the IRIG, PARSE* and CLOCK* deleted, all of the rest compile -# under Ultrix 4.2a/3. If the MX4200 is removed, all the rest compile on a DEC -# OSF/1 Alpha. -# -CLOCKDEFS= -DLOCAL_CLOCK -DAS2201PPS -DCHUPPS -DGOES -DIRIG -DMX4200PPS -DOMEGA -DPSTCLK -DTPRO -DWWVBCLK -DLEITCH - -# -# Directory into which binaries should be installed (default /usr/local) -# -BINDIR= /usr/local/bin diff --git a/usr.sbin/xntpd/conf/Config.plain b/usr.sbin/xntpd/conf/Config.plain deleted file mode 100644 index 67dd70ad50e6..000000000000 --- a/usr.sbin/xntpd/conf/Config.plain +++ /dev/null @@ -1,190 +0,0 @@ -# This is the local configure file (distribution version). -# You must modify it to fit your particular configuration -# and name it Config.local -# The following configuratiions can be auto-generated: -# -# make Config.local.green -# make a Config.local that supports a local clock -# (i.e. allow fallback to use of the CPU's own clock) -# make Config.local.NO.clock -# make a Config.local that supports no clocks -# -# -# NOTE TO GREENHORNS -# -# For plug-'n-play and no radios or other complicated gadgetry, -# use "make Config.local.green" as above. -# -# Following defines can be set in the DEFS_OPT= define: -# -# The flag -DDEBUG includes some debugging code. To use this, include -# the define and start the daemon with one or more -d flags, depending -# on your calibration of pearannoya. The daemon will not detach your -# terminal in this case. Judicious use of grep will reduce the speaker -# volume to bearable levels. -# -# To change the location of the configuration file, use a -# -DCONFIG_FILE=\\"/local/etc/ntp.conf\\" or something similar. -# -# The -DSYSLOG_FILE defines allows logging messages that are normally -# reported via syslof() in a file. The file name can be configured using -# the configuration line "logfile <filename>" in CONFIG_FILE. -# -# There are three serial port system software interfaces, each of -# which is peculiar to one or more Unix versions. Define -# -DHAVE_SYSV_TTYS for basic System V compatibility; define -DSTREAM -# for POSIX compatibility including System V Streams, and -# HAVE_BSD_TTYS for 4.3bsd compatibility. Only one of these three -# should be defined. If none are defined, HAVE_BSD_TTYS is assumed. -# Usually these defines are already set correctly. -# -DEFS_OPT=-DDEBUG - -# -# The DEFS_LOCAL define picks up all flags from DEFS_OPT (do not delete that) -# and one of the following: -# -# The flag -DREFCLOCK causes the basic reference clock support to be -# compiled into the daemon. If you set this you may also want to -# configure the particular clock drivers you want in the CLOCKDEFS= line -# below. This flag affects xntpd only. This define is included by -# default when using the "make makeconfig" script. -# -# The next two sets of defines are meaningful only when radio clock -# drivers or special 1-pps signals are to be used. For systems without -# these features, these delicious complexities can be avoided. Ordinarily, -# the "make makeconfig" script figures out which ones to use, but your -# mileage may vary. -# -# There are three ways to utilize external 1-pps signals. Define -# -DPPS to include just the pps routine, such as used by the DCF77(PARSE) -# clock driver. Define -DPPSCLK to include a serial device driver -# which avoids much of the jitter due to upper level port -# processing. This requires a dedicated serial port and either the -# tty_clock line discipline or tty_clk_streams module, both of -# which are in the ./kernel directory. Define -DPPSCD to include a -# special driver which intercepts carrier-detect transitions -# generated by the pps signal. This requires a nondedicated serial -# port and the ppsclock streams module in the ./kernel directory. -# Only one of these three flags should be defined. -# -# The flag KERNEL_PLL causes code to be compiled for a special feature of -# the kernel that (a) implements the phase-lock loop and (b) provides -# a user interface to learn time, maximum error and estimated error. -# See the file README.kern in the doc directory for further info. -# This code is activated only if the relevant kernel features have -# been configured; it does not affect operation of unmodified kernels. -# To compile it, however, requires a few header files from the -# special distribution. -# -# Note: following line must always start with DEFS_LOCAL= $(DEFS_OPT) -DEFS_LOCAL= $(DEFS_OPT) -DREFCLOCK -DKERNEL_PLL -DMCAST - -# -# Radio clock support definitions (these only make sense if -DREFCLOCK -# used), which is normally the case. Note that a configuration can include -# no clocks, more than one type of clock and even multiple clocks of the -# same type. -# -# For most radio clocks operating with serial ports, accuracy can -# be considerably improved through use of the tty_clk line -# discipline or tty_clk_STREAMS streams module found in the -# ./kernel directory. These gizmos capture a timestamp upon -# occurrence of an intercept character and stuff it in the data -# stream for the clock driver to munch. To select this mode, -# postfix the driver name with the string CLK; that is, WWVB -# becomes WWVBCLK. If more than one clock is in use, the CLK -# postfix can be used with any or all of them. -# -# Alternatively, for the best accuracy, use the ppsclock streams -# module in the ./ppsclock directory to steal the carrier-detect -# transition and capture a precision timestamp. At present this -# works only with SunOS 4.1.1 or later. To select this mode, -# postfix the driver name with the string PPS; that is, AS2201 -# becomes AS2201PPS. If more than one clock is in use, the PPS -# postfix should be used with only one of them. If any PPS -# postfix is defined, the -DPPSPPS define should be used on the -# DEFS above. -# -# Define -DLOCAL_CLOCK for a local pseudo-clock to masquerade as a -# reference clock for those subnets without access to the real thing. -# Works in all systems and requires no hardware support. This is defined -# by default when using the "make makeconfig" script and greenhorn -# configuraiton. -# -# Define -DPST for a PST/Traconex 1020 WWV/H receiver. The driver -# supports both the CLK and PPS modes. It should work in all systems -# with a serial port. -# -# Define -DWWVB for a Spectracom 8170 or Netclock/2 WWVB receiver. It -# should work in all systems with a serial port. The driver supports -# both the CLK and PPS modes if the requisite kernel support is installed. -# -# Define -DCHU for a special CHU receiver using an ordinary shortwave -# radio. This requires the chu_clk line discipline or chu_clk_STREAMS -# module in the ./kernel directory. At present, this driver works only -# on SunOS4.1.x; operation in other systems has not been confirmed. -# Construction details for a suitable modem can be found in the ./gadget -# directory. The driver supports # neither the CLK nor PPS modes. -# -# Define -DPARSE for a DCF77/GPS(GENERIC) receiver. For best performance -# this requires a special parsestreams STREAMS (SunOS 4.x) module in the -# ./parse directory. Define -DPARSEPPS for PPS support via the -# DCF77/GPS (GENERIC) receiver; also, define -DPPS in the DEFS above. -# Define: -DCLOCK_MEINBERG for Meinberg clocks -# -DCLOCK_SCHMID for Schmid receivers -# -DCLOCK_DCF7000 for ELV DCF7000 -# -DCLOCK_RAWDCF for simple receivers (100/200ms pulses on Rx) -# -DCLOCK_TRIMSV6 for Trimble SV6 GPS receiver -# -# Define -DMX4200PPS for a Magnavox 4200 GPS receiver. At present, this -# driver works only on SunOS4.1.x with CPU serial ports only. The PPS -# mode is required. -# -# Define -DAS2201 for an Austron 2200A or 2201A GPS receiver. It should -# work in all systems with a serial port. The driver does not support the -# CLK mode, but does support the PPS mode. If the radio is connected to -# more than one machine, the PPS mode is required. -# -# Define -DGOES for a Kinemetrics/TrueTime 468-DC GOES receiver. This -# driver is known to work with some other TrueTime products as well, -# including the GPS-DC GPS receiver. It should work in all systems with -# a serial port. The driver does not support the CLK mode, but does -# support the PPS mode. -# -# Define -DOMEGA for a Kinemetrics/TrueTime OM-DC OMEGA receiver. It -# should work in all systems with a serial port. The driver does not -# support the CLK mode, but does support the PPS mode. -# -# Define -DTPRO for a KSI/Odetics TPRO-S IRIG-B timecode reader. This -# requires the SunOS interface driver available from KSI. The driver -# supports neither the CLK nor PPS modes. -# -# Define -DLEITCH for a Leitch CSD 5300 Master Clock System Driver for -# the HP 5061B Cesium Clock. It should work in all systems with a serial -# port. The driver does not support the CLK mode, but does support the -# PPS mode. -# -# Define -DMSFEESPPS for an EES M201 MSF receiver. It currently only works -# under SunOS 4.x with the PPSCD (ppsclock) STREAMS module, but the RCS -# files on cl.cam.ac.uk still has support for CLK and CBREAK modes. -# -# Define -DIRIG for a IRIG-B timecode timecode using the audio codec of -# the Sun SPARCstations. This requires a modified BSD audio driver and -# exclusive access to the audio port. A memo describing how it works and -# how to install the driver is in the README.irig file in the ./doc -# directory. -# -# Note: The following defines result in compilation of all the above radio -# clocks. This works on a Sun 4.1.x system which has tty_clk, chu_clk and -# ppsclock STREAMS modules installed. If the trailing CLK and PPS suffixes -# are removed and the IRIG, PARSE* and CLOCK* deleted, all of the rest compile -# under Ultrix 4.2a/3. If the MX4200 is removed, all the rest compile on a DEC -# OSF/1 Alpha. -# -CLOCKDEFS= -DLOCAL_CLOCK -DCHU -DGOES -DOMEGA -DPST -DWWVB -DLEITCH - -# -# Directory into which binaries should be installed (default /usr/local) -# -BINDIR= /usr/local/bin diff --git a/usr.sbin/xntpd/conf/Config.solaris b/usr.sbin/xntpd/conf/Config.solaris deleted file mode 100644 index 5db3cd0b050c..000000000000 --- a/usr.sbin/xntpd/conf/Config.solaris +++ /dev/null @@ -1,7 +0,0 @@ -# -# Test suite for SunOS 5.x (no kernel mods, disciplines) -# -DEFS_OPT=-DDEBUG -DEFS_LOCAL= $(DEFS_OPT) -DREFCLOCK -DMCAST -CLOCKDEFS= -DACTS -DATOM -DAS2201 -DCHU -DDATUM -DGOES -DGPSTM -DHEATH -DIRIG -DLEITCH -DLOCAL_CLOCK -DMSFEES -DMX4200 -DNMEA -DOMEGA -DPST -DTPRO -DTRAK -DWWVB -BINDIR= /usr/local/bin diff --git a/usr.sbin/xntpd/conf/Config.svr4 b/usr.sbin/xntpd/conf/Config.svr4 deleted file mode 100644 index d6d0661539f1..000000000000 --- a/usr.sbin/xntpd/conf/Config.svr4 +++ /dev/null @@ -1,167 +0,0 @@ -# -# This is the local configure file. Modify it to fit your particular -# configuration. -# -# NOTE TO GREENHORNS -# -# For plug-'n-play and no radios or other complicated gadgetry, set the -# alternate defines as shown. -# -# The flag -DDEBUG includes some debugging code. To use this, include -# the define and start the daemon with one or more -d flags, depending -# on your calibration of pearannoya. The daemon will not detach your -# terminal in this case. Judicious use of grep will reduce the speaker -# volume to bearable levels. -# -# To change the location of the configuration file, use a -# -DCONFIG_FILE=\\"/local/etc/ntp.conf\\" or something similar. -# -# The flag -DREFCLOCK causes the basic reference clock support to be -# compiled into the daemon. If you set this you may also want to -# configure the particular clock drivers you want in the CLOCKDEFS= line -# below. This flag affects xntpd only. This define is included by -# default when using the "make makeconfig" script. -# -# The next two sets of defines are meaningful only when radio clock -# drivers or special 1-pps signals are to be used. For systems without -# these features, these delicious complexities can be avoided. Ordinarily, -# the "make makeconfig" script figures out which ones to use, but your -# mileage may vary. -# -# There are three ways to utilize external 1-pps signals. Define -# -DPPS to include just the pps routine, such as used by the DCF77 -# clock driver. Define -DPPSCLK to include a serial device driver -# which avoids much of the jitter due to upper level port -# processing. This requires a dedicated serial port and either the -# tty_clock line discipline or tty_clk_streams module, both of -# which are in the ./kernel directory. Define -DPPSCD to include a -# special driver which intercepts carrier-detect transitions -# generated by the pps signal. This requires a nondedicated serial -# port and the ppsclock streams module in the ./kernel directory. -# Only one of these three flags should be defined. -# -# There are three serial port system software interfaces, each of -# which is peculiar to one or more Unix versions. Define -# -DHAVE_SYSV_TTYS for basic System V compatibility; define -DSTREAM -# for POSIX compatibility including System V Streams, and -# HAVE_BSD_TTYS for 4.3bsd compatibility. Only one of these three -# should be defined. If none are defined, HAVE_BSD_TTYS is assumed. -# Ordinarily, the correct define is sniffed by the "make makeconfig" -# script and automatically included. -# -# The flag KERNEL_PLL is a temporary hack to use when the phase-lock loop -# is implmented in the kernel. Do not use unless you have modified -# kernel routines (see doc/README.kern). -# -#DEFS_LOCAL= -DDEBUG -DPPSPPS -DKERNEL_PLL -DEFS_LOCAL= -DDEBUG -#DEFS_LOCAL= # for greenhorns -# -# Radio clock support definitions (these only make sense if -DREFCLOCK -# used), which is normally the case. Note that a configuration can include -# no clocks, more than one type of clock and even multiple clocks of the -# same type. -# -# For most radio clocks operating with serial ports, accuracy can -# be considerably improved through use of the tty_clk line -# discipline or tty_clk_STREAMS streams module found in the -# ./kernel directory. These gizmos capture a timestamp upon -# occurrence of an intercept character and stuff it in the data -# stream for the clock driver to munch. To select this mode, -# postfix the driver name with the string CLK; that is, WWVB -# becomes WWVBCLK. If more than one clock is in use, the CLK -# postfix can be used with any or all of them. -# -# Alternatively, for the best accuracy, use the ppsclock streams -# module in the ./ppsclock directory to steal the carrier-detect -# transition and capture a precision timestamp. At present this -# works only with SunOS 4.1.1 or later. To select this mode, -# postfix the driver name with the string PPS; that is, AS2201 -# becomes AS2201PPS. If more than one clock is in use, the PPS -# postfix should be used with only one of them. If any PPS -# postfix is defined, the -DPPSPPS define should be used on the -# DEFS above. -# -# Define -DLOCAL_CLOCK for a local pseudo-clock to masquerade as a -# reference clock for those subnets without access to the real thing. -# Works in all systems and requires no hardware support. This is defined -# by default when using the "make makeconfig" script. -# -# Define -DPST for a PST/Traconex 1020 WWV/H receiver. The driver -# supports both the CLK and PPS modes. It should work in all systems -# with a serial port. -# -# Define -DWWVB for a Spectracom 8170 or Netclock/2 WWVB receiver. It -# should work in all systems with a serial port. The driver supports -# both the CLK and PPS modes if the requisite kernel support is installed. -# -# Define -DCHU for a special CHU receiver using an ordinary shortwave -# radio. This requires the chu_clk line discipline or chu_clk_STREAMS -# module in the ./kernel directory. At present, this driver works only -# on SunOS4.1.x; operation in other systems has not been confirmed. -# Construction details for a suitable modem can be found in the ./gadget -# directory. The driver supports # neither the CLK nor PPS modes. -# -# Define -DPARSE for a DCF77/GPS(GENERIC) receiver. For best performance -# this requires a special parsestreams STREAMS (SunOS 4.x) module in the -# ./kernel directory. Define -DPARSEPPS for PPS support via the -# DCF77/GPS (GENERIC) receiver; also, define -DPPS in the DEFS above. -# Define PARSESTREAM for utilising the STREAMS module for improved -# precision (currently only SunOS4.x) -# -# Define: -DCLOCK_MEINBERG for Meinberg clocks -# -DCLOCK_SCHMID for Schmid receivers -# -DCLOCK_DCF7000 for ELV DCF7000 -# -DCLOCK_RAWDCF for simple receivers (100/200ms pulses on Rx) -# -# Define -DMX4200PPS for a Magnavox 4200 GPS receiver. At present, this -# driver works only on SunOS4.1.x with CPU serial ports only. The PPS -# mode is required. -# -# Define -DAS2201 for an Austron 2200A or 2201A GPS receiver. It should -# work in all systems with a serial port. The driver does not support the -# CLK mode, but does support the PPS mode. If the radio is connected to -# more than one machine, the PPS mode is required. -# -# Define -DGOES for a Kinemetrics/TrueTime 468-DC GOES receiver. This -# driver is known to work with some other TrueTime products as well, -# including the GPS-DC GPS receiver. It should work in all systems with -# a serial port. The driver does not support the CLK mode, but does -# support the PPS mode. -# -# Define -DOMEGA for a Kinemetrics/TrueTime OM-DC OMEGA receiver. It -# should work in all systems with a serial port. The driver does not -# support the CLK mode, but does support the PPS mode. -# -# Define -DTPRO for a KSI/Odetics TPRO-S IRIG-B timecode reader. This -# requires the SunOS interface driver available from KSI. The driver -# supports neither the CLK nor PPS modes. -# -# Define -DLEITCH for a Leitch CSD 5300 Master Clock System Driver for -# the HP 5061B Cesium Clock. It should work in all systems with a serial -# port. The driver does not support the CLK mode, but does support the -# PPS mode. -# -# Define -DMSF for a EES M201 MSF receiver. It should work in all systems -# with a serial port. The driver does not support the CLK mode, but does -# support the # PPS mode. -# -# Define -DIRIG for a IRIG-B timecode timecode using the audio codec of -# the Sun SPARCstations. This requires a modified BSD audio driver and -# exclusive access to the audio port. A memo describing how it works and -# how to install the driver is in the README.irig file in the ./doc -# directory. -# -# Note: The following defines result in compilation of all the above radio -# clocks. This works on a Sun 4.1.x system which has tty_clk, chu_clk and -# ppsclock STREAMS modules installed. If the trailing CLK and PPS suffixes -# are removed and the IRIG deleted, all of the rest compile under -# Ultrix 4.2a/3. If the MX4200 is removed, all the rest compile on a DEC -# OSF/1 Alpha. -# -#CLOCKDEFS= -DAS2201PPS -DCHU -DGOES -DIRIG -DMX4200PPS -DOMEGA -DPST -DPSTCLK -DTPRO -DWWVBCLK -CLOCKDEFS= # for greenhorns -# -# Directory into which binaries should be installed -# -BINDIR= /usr/etc diff --git a/usr.sbin/xntpd/conf/README b/usr.sbin/xntpd/conf/README deleted file mode 100644 index 8d075916daf8..000000000000 --- a/usr.sbin/xntpd/conf/README +++ /dev/null @@ -1,11 +0,0 @@ -README file for directory ./conf of the NTP Version 3 distribution - -This directory contains example run-time configuration files for the -NTP Version 3 daemon xntpd. These files illustrate some of the more -obtuse configurations you may run into. They are not likely to do -anything good if run on machines other than their native spot, so don't -just blindly copy something and put it up. Additional information can -be found in the ./doc directory of the base directory. - -See the Config.local.dist file in the base directory for an explanation -of the defines used. diff --git a/usr.sbin/xntpd/conf/baldwin.conf b/usr.sbin/xntpd/conf/baldwin.conf deleted file mode 100644 index baaac95437cd..000000000000 --- a/usr.sbin/xntpd/conf/baldwin.conf +++ /dev/null @@ -1,40 +0,0 @@ -# -# NTP configuration file (ntp.conf) -# baldwin.udel.edu (128.4.1.24) -# -# This illustrates the use of an external clock with the local clock -# driver, as well as a multicast server. The prefer keyword on the -# local clock driver declares an external clock and that the time of -# this server should not be wiggled by an NTP peer, unless the -# external clock comes unstuck. Note the use of the multicast group -# ID assigned to NTP, 224.0.1.1, which identifies this as a multicast -# server rather than a broadcast one. The other NTP peers are known -# stratum-1 chimes intended as backup should the external clock croak. -# -peer 127.127.1.0 prefer # KSI/Odetics TPRO IRIG interface -fudge 127.127.1.0 stratum 0 refid GPS -broadcast 224.0.1.1 key 6 ttl 127 -peer 128.4.1.1 # rackety.udel.edu (Sun4c/40 IPC) -peer 128.4.1.4 # barnstable.udel.edu (Sun4c/65 SS1+) -peer 128.4.1.2 # mizbeaver.udel.edu (Bancomm bc700LAN) -peer 128.4.1.20 # pogo.udel.edu (Sun4c/65 SS1+) - -# -# Miscellaneous stuff -# -enable auth monitor # enable the good stuff -driftfile /etc/ntp.drift # path for drift file -statsdir /baldwin/ntpstats/ # directory for statistics files -filegen peerstats file peerstats type day enable -filegen loopstats file loopstats type day enable -filegen clockstats file clockstats type day enable - -# -# Authentication stuff -# -keys /usr/local/bin/ntp.keys # path for keys file -trustedkey 3 4 5 6 14 15 # define trusted keys -requestkey 15 # key (7) for accessing server variables -controlkey 15 # key (6) for accessing server variables -authdelay 0.000163 # authentication delay (SPARC4c/40 IPC MD5) - diff --git a/usr.sbin/xntpd/conf/dewey.conf b/usr.sbin/xntpd/conf/dewey.conf deleted file mode 100644 index 2a7548c8151e..000000000000 --- a/usr.sbin/xntpd/conf/dewey.conf +++ /dev/null @@ -1,46 +0,0 @@ -# -# NTP configuration file (ntp.conf) -# -# Generic configuration file for UDel NTP stratum-2 time servers. Don't -# forget each server should have a /etc/ntp.drift and /etc/ntp.keys file. -# -# Stratum-1 peers. Each server should chime two different stratum-1 -# servers from the following list. Each stratum-1 server should be used -# only once. -# -#peer 128.8.10.1 # umd1.umd.edu -#peer 18.72.0.3 version 2 # bitsy.mit.edu -peer 132.249.16.1 # fuzz.sdsc.edu -peer 128.118.46.3 version 2 # otc1.psu.edu -#peer 128.9.2.129 # wwvb.isi.edu -#peer 130.43.2.2 version 2 # apple.com -#peer 16.1.0.22 # clepsydra.dec.com -#peer 130.105.1.156 version 2 # clock.osf.orga -#peer 128.96.60.5 version 2 # pi.bellcore.com -#peer 128.4.1.1 # rackety.udel.edu -#peer 129.116.3.5 # shorty.chpc.utexas.edu -# -# Stratum-2 peers. Each server should chime all of the others in this -# list except itself. -# -peer 128.175.1.1 # huey.udel.edu (VAX) -#peer 128.175.1.2 # dewey.udel.edu (VAX) -peer 128.175.1.3 # louie.udel.edu (SPARC) -peer 128.175.2.15 # snow-white.ee.udel.edu (SPARC) -peer 128.175.7.4 # sol.cis.udel.edu (SPARC) -# -# Miscellaneous stuff -# -enable auth monitor # enable the good stuff -driftfile /etc/ntp.drift # path for drift file -# -# Authentication stuff. Note the different authentication delay on -# VAX and SPARC. -# -authenticate yes # enable authentication -keys /etc/ntp.keys # path for key file -trustedkey 1 2 15 # define trusted keys -requestkey 15 # key (7) for accessing server variables -controlkey 15 # key (6) for accessing server variables -authdelay 0.001501 # authentication delay (VAX) -#authdelay 0.000073 # authentication delay (SPARC) diff --git a/usr.sbin/xntpd/conf/grundoon.conf b/usr.sbin/xntpd/conf/grundoon.conf deleted file mode 100644 index 16003d59237b..000000000000 --- a/usr.sbin/xntpd/conf/grundoon.conf +++ /dev/null @@ -1,157 +0,0 @@ -# -# NTP configuration file (ntp.conf) -# grundoon.udel.edu (128.4.2.7) -# -# This machine can best be described as the kitchen sink. It has, in -# addition to the baseboard tty ports ttya and ttyb, an 8-line -# Serial/Parallel Interface (SPIF) with ports ttyz00 through ttyz07. The -# configuration includes the following drivers, clock addresses and Unix -# device names. -# -# Local Clock 127.127.1.0 /dev/audio -# PST 1020 WWV/WWVH Receiver 127.127.3.1 /dev/pst1 -# Spectracom 8170 WWVB Receiver 127.127.4.1 /dev/wwvb1 -# IRIG Audio Decoder 127.127.6.0 /dev/audio -# Scratchbuilt CHU Receiver 127.127.7.1 /dev/chu1 -# NIST ACTS modem 127.127.18.1 /dev/acts1 -# Heath GC-1000 WWV Receiver 127.127.19.1 /dev/pst1 -# PPS Clock 127.127.22.1 none -# -# This machine has the kernel modifications described in the README.kern -# file, as well as the tty_clk, tty_chu and ppsclock streams modules. -# -# Spectracom 8170/Netclock-2 WWVB receiver. This receiver is equipped -# with a 1-pps and IRIG outputs. The 1-pps signal is connected via the -# ppsclock streams module and the carrier detect line of the CHU -# receiver below (ttyb). The IRIG signal is connected via an attenuator -# to the audio port (/dev/audio). The propagation delay computed from -# geographical coordinates is 8.8 ms, while the receiver delay -# calibrated at the factory is 17.3 ms, for a total delay of 26.1 ms. -# This is confirmed within 0.1 ms at the 1-pps signal output using a -# portable cesium clock. We add a fudge time1 of 3.5 ms so the driver -# time agrees with the 1-pps signal to within 1 ms. The fudge flag4 is -# set to cause the receiver to dump the quality table once each day to -# the clockstats file. - -# -#server 127.127.4.1 # /dev/wwvb1 -> /dev/ttyz03 -#fudge 127.127.4.1 time1 0.0035 flag4 1 -# -# IRIG Audio Decoder. The IRGI signal of the Spectracom WWVB receiver is -# connected to the audio codec via a resistor attenuator. We add a fudge -# time1 of 3.5 ms so the driver agrees with the calibrated 1-pps signal -# to within 0.1 ms. We also specify a reference ID of WWVB to indicate -# the signal origin. Note the prefer keyword in the server line, which -# favors this driver over all others that survive the clock selection -# algorithm. See README.refclock for further insight on this feature. -# -server 127.127.6.0 prefer # /dev/audio -fudge 127.127.6.0 time1 0.0005 refid WWVB - -# -# PST/Traconex 1020 WWV/WWVH Receier. The internal DIPswitches are set -# as near as possible to the delays to WWV (8.8 ms) and WWVH (28.1 ms), -# as computed from geographical coordinates. We add a fudge time1 of 5.9 -# ms so the driver time agrees with the 1-pps signal to within 1 ms for -# WWV. We also set the stratum to 1, so this receiver will not normally -# be selected, unless the primary WWVB receiver comes unstuck. -# -server 127.127.3.1 # /dev/pst1 -> ttyz05 -fudge 127.127.3.1 time1 0.0059 stratum 1 - -# -# Scratchbuilt CHU Receiver. The audio signal from a computer controlled -# CHU receiver is connected to a gadget box, which contains a 103A modem -# chip and level converter operating at 300 bps. The propagation delay -# computed from geographical coordinates is 3.0 ms, which is the value -# of the fudge time1 parameter. We add a fudge time2 of 9.9 ms so that -# the driver time agrees with the 1-pps signal to within a few ms, -# ordinarily the best possible with this receiver. The fudge flag3 is -# set because the 1-pps signal happens to be connected vit the carrier -# detect line on this port (ttyb). We also set the stratum to 1, so this -# receiver will not normally be selected, unless the primary WWVB -# receiver comes unstuck. -# -server 127.127.7.1 # /dev/chu1 -> /dev/ttyb -fudge 127.127.7.1 time1 0.0030 time2 0.0099 flag3 1 stratum 1 - -# -# NIST Automated Computer Time Service. This driver calls a special -# telephone number in Boulder, CO, to fetch the time directly from the -# NIST cesium farm. The details of the complicated calling program are -# in the README.refclock file. The Practical Peripherals 9600SA modem -# does not work correctly with the ACTS echo-delay scheme for -# automatically calculating the propagation delay, so the fudge flag2 is -# set to disable the feature. Instead, we add a fudge time1 of 65.0 ms -# so that the driver time agrees with th e1-pps signal to within 1 ms. -# The phone command specifies three alternate telephone numbers, -# including AT modem command prefix, which will be tried one after the -# other at each measurement attempt. In this case, a cron job is used to -# set fudge flag1, causing a measurement attempt, every six hours. -# -server 127.127.18.1 # /dev/acts1 -> /dev/ttyz00 -fudge 127.127.18.1 time1 0.0650 flag2 1 -phone atdt13034944774 atdt13034944785 atdt13034944774 - -# -# Heath GC-1000 Most Accurate Clock. This is a WWV receiver with a -# claimed accuracy better than 100 ms under "hi spec" conditions, but -# such conditions are not frequent. The propagation delay DIPswitchs are -# set to 9 ms, as close as possible to the 8.8 ms computed from -# geographical coordinates. We add a fudge time2 of 40.0 ms so that the -# driver time agrees with the 1-pps signal to within 50 ms, ordinarily -# the best possible with this receiver. We also set the stratum to 1, so -# this receiver will not normally be selected, unless the primary WWVB -# receiver comes unstuck. -# -server 127.127.19.1 # /dev/heath1 -> ttyz07 -fudge 127.127.19.1 time1 0.040 stratum 1 - -# -# Undisciplined Local Clock. This is a fake driver intended for backup -# and when no outside source of synchronized time is available. The -# default stratum is usually 3, but in this case we elect to use stratum -# 0. Since the server line does not have the prefer keyword, this driver -# is never used for synchronization, unless no other other -# synchronization source is available. In case the local host is -# controlled by some external source, such as an external oscillator or -# another protocol, the prefer keyword would cause the local host to -# disregard all other synchronization sources, unless the kernel -# modifications are in use and declare an unsynchronized condition. -# -server 127.127.1.0 # local clock -fudge 127.127.1.0 stratum 0 - -# -# PPS Clock. This driver is used to capture a 1-pps signal when the PPS -# kernel modifications are not in use. It can be configured for the -# tty_clk or ppsclock streams module or no module at all, assuming the -# RS232 connector is properly wired. Normally, the 1-pps signal is -# generated by a radio clock, in this cast the Spectracom clock -# 127.127.4.1 also configured for this host. When used this way, the -# associated radio clock normally has the prefer keyword in the serve -# command line. The PPS driver then will be selected only if the prefer -# peer is operating within nominal error bounds. See the README.refclock -# file for further details. -# -#server 127.127.22.1 # pps clock - -# -# Miscellaneous stuff. We enable authentication in order to prevent -# -enable auth monitor # enable the good stuff -driftfile /etc/ntp.drift # path for drift file -statsdir /grundoon/ntpstats/ # directory for statistics files -filegen peerstats file peerstats type day enable -filegen loopstats file loopstats type day enable -filegen clockstats file clockstats type day enable - -# -# Authentication stuff -# -keys /usr/local/ntp.keys # path for keys file -trustedkey 1 2 3 4 5 6 14 15 # define trusted keys -requestkey 15 # key (7) for accessing server variables -controlkey 15 # key (6) for accessing server variables -authdelay 0.000163 # authentication delay (SPARC4c/40 IPC MD5) - diff --git a/usr.sbin/xntpd/conf/maccarony.conf b/usr.sbin/xntpd/conf/maccarony.conf deleted file mode 100644 index 6bd25c73ec11..000000000000 --- a/usr.sbin/xntpd/conf/maccarony.conf +++ /dev/null @@ -1,33 +0,0 @@ -# -# NTP configuration file (ntp.conf) -# -# This illustrates a multicast client. All that is really needed -# here is the multicastclient command and the authentication stuff. -# If the monitoring option and filgen statistics were not needed, -# this could be done without a configuration file by including the -# following snip in the rc.local startup file or equivalent: -# -#if [ -f /usr/local/bin/xntpd ]; then -# /usr/local/bin/xntpd -m -a -k/usr/local/bin/ntp.keys -t3 -#fi -# -multicastclient # listen on default 224.0.1.1 -# -# Miscellaneous stuff -# -enable auth monitor # enable the good stuff -driftfile /etc/ntp.drift # path for drift file -statsdir /malarky/ntpstats/ # directory for statistics files -filegen peerstats file peerstats type day enable -filegen loopstats file loopstats type day enable -filegen clockstats file clockstats type day enable - -# -# Authentication stuff -# -keys /usr/local/bin/ntp.keys # path for key file -trustedkey 3 4 5 6 14 15 # define trusted keys -requestkey 15 # key (7) for accessing server variables -controlkey 15 # key (6) for accessing server variables -authdelay 0.000094 # authentication delay (Sun4c/50 IPX MD5) - diff --git a/usr.sbin/xntpd/conf/malarky.conf b/usr.sbin/xntpd/conf/malarky.conf deleted file mode 100644 index 9b1d7b2317e1..000000000000 --- a/usr.sbin/xntpd/conf/malarky.conf +++ /dev/null @@ -1,27 +0,0 @@ -# -# NTP configuration file (ntp.conf) -# -# This is for a broadcast/multicast client. Except for the statistics -# stuff, this can be done with only a commmand line of the form -# -# /usr/local/bin/xntpd -a -k /usr/local/bin/ntp.keys -m -t 3 -# -multicastclient # listen on default 224.0.1.1 -# -# Miscellaneous stuff -# -enable auth monitor # enable the good stuff -driftfile /etc/ntp.drift # path for drift file -statsdir /malarky/ntpstats/ # directory for statistics files -filegen peerstats file peerstats type day enable -filegen loopstats file loopstats type day enable -filegen clockstats file clockstats type day enable - -# -# Authentication stuff -# -keys /usr/local/bin/ntp.keys # path for key file -trustedkey 3 4 5 6 14 # define trusted keys -requestkey 14 # key (7) for accessing server variables -controlkey 14 # key (6) for accessing server variables -authdelay 0.000094 # authentication delay (Sun4c/50 IPX MD5) diff --git a/usr.sbin/xntpd/conf/ntp.conf.dcf77 b/usr.sbin/xntpd/conf/ntp.conf.dcf77 deleted file mode 100644 index 678d719d815c..000000000000 --- a/usr.sbin/xntpd/conf/ntp.conf.dcf77 +++ /dev/null @@ -1,19 +0,0 @@ -# -# XNTP configuration file (/etc/ntp.conf) -# - -# -# Server is a Boeder DCF77 receiver -# -# Use: -# 127.127.8.40 for /dev/refclock-0 (/dev/ttyd0) -# 127.127.8.41 for /dev/refclock-1 (/dev/ttyd1) -# 127.127.8.42 for /dev/refclock-2 (/dev/ttyd2) -# 127.127.8.43 for /dev/refclock-3 (/dev/ttyd3) -# -server 127.127.8.40 - -# -# drift file -# -driftfile /etc/ntp.drift diff --git a/usr.sbin/xntpd/conf/ntp.conf.gw b/usr.sbin/xntpd/conf/ntp.conf.gw deleted file mode 100644 index bd5687874f53..000000000000 --- a/usr.sbin/xntpd/conf/ntp.conf.gw +++ /dev/null @@ -1,34 +0,0 @@ -# -# peers for gw.ccie.utoronto.ca (128.100.63.2, 128.100.49.104, 128.100.224.224) -# -peer 128.4.0.1 key 1 # dcn1.udel.edu -peer 128.8.10.1 key 2 # umd1.umd.edu -peer 128.116.64.3 key 3 # ncarfuzz.ucar.edu -peer 128.9.2.129 key 4 # wwvb.isi.edu -#peer 128.4.0.6 key 1 # dcn6.udel.edu -# -# Don't configure associations with the other secondaries. This is -# the only one in a machine room and will hold itself pretty stable -# when all else fails -# -monitor yes # keep track of traffic - -# -# drift file -# -driftfile /etc/ntp.drift - -# -# authentication stuff. We're running authenticated, tell it -# where the keys are and which to trust. -# -authenticate yes -authdelay 0.000323 # seconds, about right for an RT model 125 -trustedkey 1 2 3 4 21 22 23 24 -keys /etc/ntp.keys - -# -# allow run time reconfiguration using key 65535 -# -requestkey 65535 -controlkey 65535 diff --git a/usr.sbin/xntpd/conf/ntp.conf.ipl b/usr.sbin/xntpd/conf/ntp.conf.ipl deleted file mode 100644 index 1fd5b7d62145..000000000000 --- a/usr.sbin/xntpd/conf/ntp.conf.ipl +++ /dev/null @@ -1,32 +0,0 @@ -# -# peers for ipl.utcs.utoronto.ca (128.100.102.7) -# -peer 128.4.0.5 key 1 # dcn5.udel.edu -peer 128.8.10.1 key 2 # umd1.umd.edu -peer 192.12.207.1 key 3 # fuzz.sdsc.edu -peer 128.9.2.129 key 4 # wwvb.isi.edu -peer 128.100.63.2 key 21 # gw.ccie -peer 128.100.49.105 key 22 # suzuki.ccie -peer 128.100.102.4 key 23 # shiningtree.utcs -# -monitor yes # keep track of traffic - -# -# drift file -# -driftfile /etc/ntp.drift - -# -# authentication stuff. We're running authenticated, tell it -# where the keys are and which to trust. -# -authenticate yes -authdelay 0.000323 # seconds, about right for an RT model 125 -trustedkey 1 2 3 4 21 22 23 -keys /etc/ntp.keys - -# -# allow run time reconfiguration using key 65535 -# -requestkey 65535 -controlkey 65535 diff --git a/usr.sbin/xntpd/conf/ntp.conf.nsf b/usr.sbin/xntpd/conf/ntp.conf.nsf deleted file mode 100644 index 298bb7a6905e..000000000000 --- a/usr.sbin/xntpd/conf/ntp.conf.nsf +++ /dev/null @@ -1,156 +0,0 @@ -# -# Maybe an alternate xntpd configuration for NSS#17 -# - -# -# precision is supported, but you don't really need it. The code -# will determine a precision from the kernel's value of _hz which -# is fine. Note you shouldn't claim too good a precision on a -# Unix machine even if the clock carries a lot of bits, since -# precision also depends on things like I/O delays and scheduling -# latencies, which Unix machines control poorly. If you claim better -# than -6 or -7 it will make the anti-hop aperture tighter than is -# reasonable for a Unix machine. -# -#precision -7 - -# -# peers are ncarfuzz.ucar.edu umd1.umd.edu dcn5.udel.edu fuzz.sdsc.edu -# syntax is peer addr [ key 1-15 ] [ version 1_or_2 ] -# - -peer 128.116.64.3 # ncarfuzz.ucar.edu -peer 128.8.10.1 # umd1.umd.edu -peer 128.4.0.5 # dcn5.udel.edu -peer 192.12.207.1 # fuzz.sdsc.edu - -# -# Drift file. Put this in a directory which the daemon can write to. -# No symbolic links allowed, either, since the daemon updates the file -# by creating a temporary in the same directory and then rename()'ing -# it to the file. -# -# This is a nice feature. Once you've got the drift computed it hardly -# ever takes more than an hour or so to resync after a restart. -# -driftfile /etc/ntp.drift - -# -# The server statement causes polling to be done in client mode rather -# than symmetric active. It is an alternative to the peer command -# above. Which you use depends on what you want to achieve. Usually -# it doesn't matter. Syntax is: -# -#server 128.100.49.1 key 4 version 1 - -# -# The broadcast statement tells it to start broadcasting time out one -# of its interfaces. Syntax is -# -#broadcast 128.100.49.255 # [ key n ] [ version n ] - -# -# broadcastclient tells the daemon whether it should attempt to sync -# to broadcasts or not. Defaults to `no'. -# -#broadcastclient yes # or no - -# -# broadcastdelay configures in a default round-trip delay to use for -# broadcast time. It may poll to improve this estimate. -# -#broadcastdelay 0.0095 # in seconds - -# -# authenticate configures us into strict authentication mode (or not). -# -#authenticate yes # or no. Default is no - -# -# authdelay is the time it takes to do an NTP encryption on this host. -# The current routine is pretty fast. -# -#authdelay 0.000340 # in seconds - -# -# trustedkey are used when authenticate is on. We only trust (and sync to) -# peers who know these keys. -# -#trustedkey 1 3 4 8 - -# -# monitor turns on the monitoring facility. See xntpdc's monlist command. -# This shows a lot of neat stuff, but I'm not fussy about the implementation. -# Uses up to 20Kb of memory at run time. You could try this. -# -#monitor yes # or no. Default is no - -# -# keys points at the file which holds the authentication keys. -# -#keys /etc/ntp.keys - -# -# requestkey indicates which key is to be used for validating -# runtime reconfiguration requests. If this isn't defined, or the -# key isn't in the keys file, you can't do runtime reconfiguration. -# controlkey indicates which key is to be used for validating -# mode 6 write variables commands. If this isn't defined you can't -# do it. The only thing the latter is used for is to set leap second -# warnings on machines with radio clocks. -# -#requestkey 65535 -#controlkey 65534 - -# -# restrict places restrictions on the punters. This is implemented as -# a sorted address-and-mask list, with each entry including a set of -# flags which define what a host matching the entry *can't* do (the sort -# also saves CPU time searching the table since it needn't be searched -# to the end). The last match in the table defines what the host does. -# The default entry, which everyone matches, is first, most specific -# matches are later in the table. The flags are: -# -# ignore - ignore all traffic from host -# noserve - don't give host any time (but let him make queries?) -# notrust - give host time, let him make queries, but don't sync to him -# noquery - host can have time, but not make queries -# nomodify - allow the host to make queries except those which are -# actually run-time configuration commands. -# notrap - don't allow matching hosts to set traps. If noquery is -# set this isn't needed -# lowpriotrap - if this guy sets a trap make it easy to delete -# ntpport - a different kind of flag. Makes matches for this entry -# possible only if the source port is 123. -# -# To understand this better, take a look at xntpdc's reslist command when the -# server is running. This usually prints in the sorted order. -# -# This should match the NSS 17 stuff. Default mask is all ones. - -restrict default ignore # ignore almost everyone - -# -# These guys can be served time and make non-modifying queries -# -restrict 129.140.0.0 mask 255.255.0.0 notrust nomodify -restrict 35.1.1.42 notrust nomodify - -# -# Rest of 35.1.1 gets to look but not touch -# -restrict 35.1.1.0 mask 255.255.255.0 noserve nomodify - -# -# modifications can be made from local NSS only -# -restrict 129.140.17.0 mask 255.255.255.0 notrust -restrict 127.0.0.1 notrust - -# -# take time from the following peers, but don't let them peek or modify -# -restrict 128.116.64.3 noquery -restrict 128.8.10.1 noquery -restrict 128.4.0.5 noquery -restrict 192.12.207.1 noquery diff --git a/usr.sbin/xntpd/conf/ntp.conf.shiningtree b/usr.sbin/xntpd/conf/ntp.conf.shiningtree deleted file mode 100644 index 1576ebbd072c..000000000000 --- a/usr.sbin/xntpd/conf/ntp.conf.shiningtree +++ /dev/null @@ -1,32 +0,0 @@ -# -# peers for shiningtree.utcs.utoronto.ca (128.100.102.4) -# -peer 128.4.0.1 key 1 # dcn1.udel.edu -peer 130.126.174.40 key 2 # truechimer.cso.uiuc.edu -peer 192.12.207.1 key 3 # fuzz.sdsc.edu -peer 128.116.64.3 key 4 # ncarfuzz.ucar.edu -peer 128.100.63.2 key 21 # gw.ccie -peer 128.100.49.105 key 22 # suzuki.ccie -peer 128.100.102.7 key 23 # ipl.utcs -# -monitor yes # keep track of traffic - -# -# drift file -# -driftfile /etc/ntp.drift - -# -# authentication stuff. We're running authenticated, tell it -# where the keys are and which to trust. -# -authenticate yes -authdelay 0.000323 # seconds, about right for an RT model 125 -trustedkey 1 2 3 4 21 22 23 -keys /etc/ntp.keys - -# -# allow run time reconfiguration using key 65535 -# -requestkey 65535 -controlkey 65535 diff --git a/usr.sbin/xntpd/conf/ntp.conf.suzuki b/usr.sbin/xntpd/conf/ntp.conf.suzuki deleted file mode 100644 index ee32e7ad87a1..000000000000 --- a/usr.sbin/xntpd/conf/ntp.conf.suzuki +++ /dev/null @@ -1,43 +0,0 @@ -# -# peers for suzuki.ccie.utoronto.ca (128.100.49.105, 128.100.224.225) -# - -# -# the reference clock, /dev/chu1 -# -server 127.127.7.1 key 4 -# Propagation delay 2.5 ms, sloppy clock flag on -fudge 127.127.7.1 time1 0.0025 flag1 1 - -peer 128.4.0.5 key 1 # dcn5.udel.edu -peer 128.8.10.1 key 2 # umd1.umd.edu -peer 128.116.64.34 key 3 # ncarfuzz.ucar.edu -peer 130.126.174.40 key 4 # truechimer.cso.uiuc.edu -peer 128.100.49.104 key 24 # gw.ccie -peer 128.100.102.4 key 22 # shiningtree.utcs -peer 128.100.102.7 key 22 # ipl.utcs - -peer 128.4.0.6 key 1 # dcn6.udel.edu - -# -monitor yes # keep track of traffic - -# -# drift file -# -driftfile /etc/ntp.drift - -# -# authentication stuff. We're running authenticated, tell it -# where the keys are and which to trust. -# -authenticate yes -authdelay 0.000323 # seconds, about right for an RT model 125 -trustedkey 1 2 3 4 21 22 23 24 -keys /etc/ntp.keys - -# -# allow run time reconfiguration using key 65535 -# -requestkey 65535 -controlkey 65535 diff --git a/usr.sbin/xntpd/conf/pogo.conf b/usr.sbin/xntpd/conf/pogo.conf deleted file mode 100644 index e557e44740a5..000000000000 --- a/usr.sbin/xntpd/conf/pogo.conf +++ /dev/null @@ -1,34 +0,0 @@ -# -# NTP configuration file (ntp.conf) -# pogo.udel.edu (128.4.1.20) -# -server 127.127.10.1 prefer # austron 2201A gps receiver -peer 128.4.1.1 # rackety.udel.edu (Sun4c/40 IPC) -peer 128.4.1.2 # mizbeaver.udel.edu (Bancomm bc700LAN) -peer 128.4.1.4 # barnstable.udel.edu (Sun4c/65 SS1+) -peer 128.4.1.5 maxpoll 8 # churchy.udel.edu (cisco IGS router) -peer 132.163.135.130 maxpoll 8 # time_A.timefreq.bldrdoc.gov (Cesium) -peer 131.188.1.40 maxpoll 8 # ntps1-0.uni-erlangen.de (DCF77) -peer 129.132.2.21 maxpoll 8 # swisstime.ethz.ch (DCF77) -peer 130.155.98.13 maxpoll 8 # terss.ml.csiro.au (Cesium) -peer 192.36.143.150 maxpoll 8 # Time1.Stupi.SE (Cesium) - -# -# Miscellaneous stuff -# -enable auth monitor # enable the good stuff -precision -18 # clock reading precision (usec) -driftfile /etc/ntp.drift # path for drift file -statsdir /pogo/ntpstats/ # directory for statistics files -filegen peerstats file peerstats type day enable -filegen loopstats file loopstats type day enable -filegen clockstats file clockstats type day enable - -# -# Authentication stuff -# -keys /usr/local/bin/ntp.keys # path for keys file -trustedkey 3 4 5 6 14 # define trusted keys -requestkey 15 # key (7) for accessing server variables -controlkey 15 # key (6) for accessing server variables -authdelay 0.000159 # authentication delay (SPARC4c/65 SS1+ MD5) diff --git a/usr.sbin/xntpd/conf/rackety.conf b/usr.sbin/xntpd/conf/rackety.conf deleted file mode 100644 index 48389dcb4529..000000000000 --- a/usr.sbin/xntpd/conf/rackety.conf +++ /dev/null @@ -1,69 +0,0 @@ -# -# NTP configuration file (ntp.conf) -# rackety (128.4.1.1) -# -server 127.127.10.1 prefer # austron 2201A gps receiver -fudge 127.127.10.1 flag4 1 # enable statistics -server 127.127.4.1 # spectracom 8170/netclock-2 wwvb receiver -# propagation delay: wwvb 0.0088, receiver delay 0.0173, os delay .0035 -fudge 127.127.4.1 time1 0.0035 stratum 1 flag4 1 - -# -# ee vaxen -# -peer 128.175.1.1 # huey.udel.edu -peer 128.175.1.2 # louie.udel.edu -peer 128.175.1.3 # dewey.udel.edu - -# -# munchkins (stratum-1 only) -# -broadcast 224.0.1.1 key 5 ttl 127 # multicast -broadcast 128.4.1.0 key 3 # local broadcast -peer 128.4.1.2 # mizbeaver.udel.edu -peer 128.4.1.4 # barnstable.udel.edu -peer 128.4.1.20 # pogo.udel.edu - -# -# dartnet -# -peer 140.173.112.2 # ames.dart.net -peer 140.173.128.1 # la.dart.net -peer 140.173.64.1 # dc.dart.net -peer 140.173.144.2 # parc.dart.net -peer 140.173.80.1 # sri.dart.net -peer 140.173.96.1 # lbl.dart.net -peer 140.173.128.2 # isi.dart.net -peer 140.173.16.1 # udel.dart.net -peer 140.173.32.1 # bbn.dart.net -peer 140.173.48.2 # mit.dart.net - -# -# nsfnet t3 backbone -# -server 140.222.134.1 version 2 # enss134 (cambridge - mit) -server 140.222.135.1 version 2 # enss135 (san diego - sdsc) -peer 140.222.136.1 version 2 # enss136 (college park - sura) -server 140.222.141.1 version 2 # enss141 (boulder - ncar) -server 140.222.144.1 version 2 # enss144 (sunnyvale - nasa ames) - -# -# Miscellaneous stuff -# -enable auth monitor # enable the good stuff -precision -18 # clock reading precision (usec) -driftfile /etc/ntp.drift # path for drift file -statsdir /rackety/ntpstats/ # directory for statistics files -filegen peerstats file peerstats type day enable -filegen loopstats file loopstats type day enable -filegen clockstats file clockstats type day enable - -# -# Authentication stuff -# -keys /usr/local/bin/ntp.keys # path for keys file -trustedkey 3 4 5 6 14 # define trusted keys -requestkey 14 # key (7) for accessing server variables -controlkey 14 # key (6) for accessing server variables -authdelay 0.000163 # authentication delay (SPARC4c/40 IPC MD5) - diff --git a/usr.sbin/xntpd/conf/snow-white.conf b/usr.sbin/xntpd/conf/snow-white.conf deleted file mode 100644 index a86cb4bc5b45..000000000000 --- a/usr.sbin/xntpd/conf/snow-white.conf +++ /dev/null @@ -1,33 +0,0 @@ -# -# NTP configuration file (ntp.conf) -# snow-white.udel.edu (128.175.2.15) -# -# Stratum-2 peers -# -peer 128.175.1.1 # huey.udel.edu -peer 128.175.1.2 # dewey.udel.edu -#peer 128.175.1.3 # louie.udel.edu -peer 128.175.2.33 # louie.udel.edu -#peer 128.175.7.39 # louie.udel.edu -# -# Stratum-3 peers -# -peer 128.175.7.4 # sol.cis.udel.edu -peer 128.175.7.18 # ra.cis.udel.edu -#peer 128.175.2.15 # snow-white.ee.udel.edu -peer 128.175.2.21 # opus.ee.udel.edu -# -# Miscellaneous stuff -# -monitor yes # enable monitoring -precision -18 # clock reading precision (1 usec) -driftfile /etc/ntp.drift # path for drift file -# -# Authentication stuff -# -authenticate yes # enable authentication -keys /etc/ntp.keys # path for key file -trustedkey 1 2 15 # define trusted keys -requestkey 15 # key (7) for accessing server variables -controlkey 15 # key (6) for accessing server variables -authdelay 0.000077 # authentication delay (SPARC IPC) diff --git a/usr.sbin/xntpd/doc/README.irig b/usr.sbin/xntpd/doc/README.irig deleted file mode 100644 index f293f4cde160..000000000000 --- a/usr.sbin/xntpd/doc/README.irig +++ /dev/null @@ -1,306 +0,0 @@ - Audio IRIG Receiver for Precision Timekeeping - - Revised 20 September 1993 - -Note: This information file is included in both the BSD audio driver -distribution (bsd_audio.tar.Z) and NTP Version 3 distribution -(xntp3.tar.Z) as the file README.irig. Both distributions can be -obtained via anonymous ftp from louie.udel.edu in the directory pub/ntp. - -1. Introduction - -This software distribution includes modifications to the BSD audio -driver for the Sun SPARCstation written by Van Jacobson and -collaborators at Lawrence Berkeley National Laboratory. The -modifications provide for the connection of a standard Inter-Range -Instrumentation Group (IRIG) timecode signal generator and the decoding -of the signal to produce data sufficient to synchronize a host clock to -the IRIG signal. There are several timing receivers now on the market -that can produce IRIG signals, including those made by Austron, -TrueTime, Odetics and Spectracom, among others. These data can be used -to precisely synchronize the host computer clock to within a few -microseconds without requiring level converters or pulse generators -necessary with the one-pulse-per-second signals also produced by these -receivers. The current implementation of the Network Time Protocol -Version 3 supports the modified BSD driver when installed in the SunOS -4.1.x kernel. - -The specific IRIG signal format supported by the driver is designated -IRIG-B. It consists of an amplitude-modulated 1000-Hz sinewave, where -each symbol is encoded as ten full carrier cycles, or 10 ms in duration. -The symbols are distinguished using a pulse-width code, where 2 ms -corresponds to logic zero, 5 ms to logic one and 8 ms to a position -identifier used for symbol synchronization. The complete IRIG-B message -consists of a frame of ten fields, each field consisting of a nine -information symbols followed by a position identifier for a total frame -duration of one second. The first symbol in the frame is also a position -identifier to facilitate frame synchronization. - -The IRIG-B signal encodes the day of year and time of day in binary- -coded decimal (BCD) format, together with a set of control functions, -which are not used by the driver, but included in the raw binary -timecode. Either the BCD timecode or the combined raw timecode and BCD -timecode can be returned in response to a read() system call. The BCD -timecode is in handy ASCII format: "ddd hh:mm:ss*" for convenience in -client programs. In this format the "*" status character is " " when the -driver is operating normally and "?" when errors may be present (see -below). In order to reduce residual errors to the greatest extent -possible, the driver computes a timestamp based on the value of the -kernel clock at the on-time epoch of the IRIG-B signal. In addition, the -driver automatically adjusts for slowly varying amplitude levels of the -IRIG-B signal and suppresses noise transients. - -In operation the IRIG driver interprets the IRIG-B signal in real time, -synchronizes to the signal, demodulates the data bits and prepares the -data to be read later. At the on-time epoch a timestamp is captured from -the kernel clock and adjusted for the phase of the IRIG carrier signal -relative to the 8-kHz codec sample clock. When a client program issues a -read() request, the most recent timecode data, including a status byte -and the corrected timestamp, are stored in a structure and returned to -the caller. Depending on the frequency with which the driver is called, -this may result in old data or duplicate data or even invalid data, -should the driver be called before it has computed its first timestamp. - -In practice, the resulting ambiguity causes few problems. The caller -converts the ASCII timecode returned by a read() system call to Unix -timeval format and subtracts it from the kernel timestamp provided by -the driver. The result is an adjustment that can be subtracted from the -kernel time, as returned in a gettimeofday() call, for example, to -correct for the deviation between IRIG time and kernel time. The result -can always be relied on to within plus/minus 128 microseconds, the audio -codec sampling interval, and ordinarily to within a few microseconds, as -determined by the interpolation algorithm. - -2. Programming Interface - -The IRIG driver modifications are integrated in the BSD audio driver -bsd_audio.c without affecting its usual functions in transmitting and -receiving ordinary speech, except when enabled by specific ioctl() -system calls. However, the driver cannot be used for both speech and -IRIG signals at the same time. Once activated by a designated ioctl() -call, the driver remains active until it is explicitly deactivated by -another ioctl() call. This allows applications to configure the audio -device and pass the pre-configured driver to other applications. Since -the driver is currently only a receiver, it does not affect the -operation of the BSD audio output driver. - -Data are read using the standard read() system call. Since the output -formats have constant lengths, the application receives the data into a -fixed-length buffer or structure. The read() call never blocks; it -simply returns the most recent IRIG data received during the last -second. It may happen that, due to unavoidable race conditions in the -kernel, data for other than the most recent second are returned. The -driver's internal data structure is updated as an atomic unit; thus, the -entire structure is valid, even if it contains old data. This should -cause no problems, since in the intended application the driver is -called at regular intervals by a time-synchronization daemon such as -NTP. The daemon can determine the validity of the time indication by -checking the timecode or status byte returned with the data. - -The header file bsd_audioirig.h defines the irig_time structure and -ioctl() codes used by the driver. Following are those codes specific to -the IRIG function of the driver. Unless indicated otherwise, the (third) -argument of the ioctl() system call points to an integer or string. - -AUDIO_IRIG_OPEN - - This command activates the IRIG receiver. The audio driver must be - opened with this command before other commands can be issued. The - argument is ignored. When the IRIG receiver is initialized, all - internal data are purged and any buffered data are lost. - -AUDIO_IRIG_CLOSE - - This command deactivates the IRIG receiver. The argument is - ignored. The buffers are purged and any buffered time data are - lost. The original BSD audio driver functions are enabled and it - resumes operating normally. - -AUDIO_IRIG_SETFORMAT - - The argument is a pointer to an integer designating the output - format for the IRIG data. There are currently two formats defined, - 0 (default) and 1. If an invalid format is selected, the default - format is used. - -The data returned by a read() system call in format 0 is a character -string in the format "ddd hh:mm:ss*\n", which consists of 13 ASCII -characters followed by a newline terminator for a total of 14 -characters. The "*" status character is an ASCII space " " if the status -byte determined by the driver is zero and "?" if not. This format is -intended to be used with simple user programs that care only about the -time to the nearest second. -The data returned by a read() system call in format 1 is a structure -defined in the bsd_audioirig.h header file: - - struct irig_time { - struct timeval stamp; /* timestamp */ - u_char bits[13]; /* 100 irig data bits */ - u_char status; /* status byte */ - char time[14]; /* time string */ - }; - -The irig-time.stamp is a pair of 32-bit longwords in Unix timeval -format, as defined in the sys/time.h header file. The first word is the -number of seconds since 1 January 1970, while the second is the number -of microseconds in the current second. The timestamp is captured at the -most recent on-time instant of the IRIG timecode and applies to all -other values returned in the irig_time structure. - -The irig_time.bits[13] is a vector of 13 bytes to hold the 100-bit, -zero-padded raw binary timecode, packed 8 symbols per byte. The symbol -encoding maps IRIG one to 1 and both IRIG zero and IRIG position -identifier to 0. The order of encoding is illustrated by the following -diagram (the padding bits are represented by xxxx, which are set to -zero): - -IRIG symbol number 00000000001111111111 . . . 8888889999999999xxxx - 01234567890123456789 . . . 4567890123456789xxxx - ----------------------------------------------- -bits byte number <--00--><--01--><---- ----><--11--><--12--> -bits bit in byte 01234567012345670123 . . . 45670123456701234567 - -The irig_time.status is a single byte with bits defined in the -bsd_audioirig.h header file. In ordinary operation all bits of the -status byte are zero and the " " status character is set in the ASCII -timecode. If any of these bits are nonzero, the "?" status character is -set in the ASCII timecode. - -AUDIO_IRIG_BADSIGNAL - - The signal amplitude is outside tolerance limits, either in - amplitude or modulation depth. The indicated time may or may not be - in error. If the signal is too high, it may be clipped by the - codec, so that the pulse width cannot be reliably determined. If - too low, it may be obscured by noise. The nominal expectation is - that the peak amplitude of the signal be maintained by the codec - AGC at about 10 dB below the clipping level and that the modulation - index be at least 0.5 (6 dB). - -AUDIO_IRIG_BADDATA - - An invalid hex code (A through F) has been found where BCD data is - expected. The ASCII representation of the invalid code is set to - "?". Errors of this type are most likely due to noise on the IRIG - signal due to ground loops, coupling to other noise sources, etc. - -AUDIO_IRIG_BADSYNC - - A code element has been found where a position identifier should be - or a position identifier has been found where a code element should - be. The time is meaningless and should be disregarded. Errors of - this type can be due to severe noise on the IRIG signal due to - ground loops, coupling to other noise sources, etc., or during - initial acquisition of the signal. - -AUDIO_IRIG_BADCLOCK - - Some IRIG timecode generators can indicate whether or not the - generator is operating correctly or synchronized to its source of - standard time using a designated field in the raw binary timecode. - Where such information is available and the IRIG decoder can detect - it, this bit is set when the generator reports anything except - normal operating conditions. - -AUDIO_IRIG_OLDDATA - - The IRIG time has not changed since the last time it was returned - in a read() call. This is not normally considered an error, unless - it persists for longer than a few seconds, in which case it - probably indicates a hardware problem. - -The irig_time.time[14] vector is a character string in the format "ddd -hh:mm:ss*\0", which consists of 13 ASCII characters followed by a zero -terminator. The "*" status character is an ASCII space " " if the status -byte is zero and "?" if not. This format is identical to format 0, -except that in format 1 the time string is null-terminated. - -2.1. Programming Example - -The following pseudo-code demonstrates how the IRIG receiver may be used -by a simple user program. Of course, real code should include error -checking after each call to ensure the driver is communicating properly. -It should also verify that the correct fields in the structure are being -filled by the read() call. - - include "bsd_audioirig.h" - - int format = 1; - struct irig_time it; - - Audio_fd = open("/dev/audio", O_RDONLY); - ioctl(Audio_fd, AUDIO_IRIG_OPEN, NULL); - ioctl(Audio_fd, AUDIO_IRIG_SETFORMAT,&format); - while (condition) - read(Audio_fd, &it, sizeof(it); - printf("%s\n", it.time); - ioctl(Audio_fd, AUDIO_IRIG_CLOSE, NULL); - close(Audio_fd); - -3. Implementation and Configuration Notes - -The signal level produced by most IRIG-equipped radios is on the order -of a few volts peak-peak, which is far larger than the audio codec can -accept; therefore, an attenuator in the form of a voltage divider is -needed. The codec can handle IRIG signals at the microphone input from -4.2mV to 230mV peak-peak. A suitable attenuator conists of a series- -connected 100K-Ohm resistor at the input and a parallel-connected 1K-Ohm -resistor at the output, both contained along with suitable connectors in -a small aluminum box. The exact values of these resistors are not -critical, since the IRIG driver includes an automatic level-adjustment -capability. - -For the most accurate time using the IRIG signal and a particular radio, -it may be necessary to adjust the time1 parameter of the fudge command -to compensate for the codec delay and any additional delay due to IRIG -processing in the radio itself. Since the codec samples at an 8-kHz -rate, the average delay is about 62 usec; however, the delays due to the -radios and IRIG signals themselves can vary. For instance, in the -Austron recievers the IRIG delay is essentially zero, while in the -Spectracom receivers the delay is about 240 usec relative to the 1-pps -signal. In addition, the poll interval can be reduced from the usual 64 -seconds to 16 seconds to reduce wander of the local hardware clock. -Finally, the prefer parameter can be used to bias the clock-selection -algorithm to favor the IRIG time, which is ordinarily the best time -available. For example, the following two lines in the NTP configuration -file ntp.conf are appropriate for the Spectracom Netclock/1 WWVB -Synchronized Clock with IRIG Option: - -server 127.127.6.0 prefer minpoll 4 maxpoll 4 # irig audio decoder -fudge 127.127.6.0 time1 0.0005 - -The time1 value of .0005 s (500 usec) was determined by actual -measurement. Since the IRIG delay in Austron receivers is essentially -zero, the fudge command is not necessary with these receivers. The -correct value in case of other radios may have to be determined by -actual measurement. A convenient way of doing this is to configure the -PPSPPS feature in the NTP Version 3 distribution and adjust time1 until -the 1-pps signal and IRIG signal both show the same offset. - -The modified BSD driver includes both the modified driver itself -bsd_audio.c and the IRIG header file bsd_audioirig.h, as well as -modified header files bsd_audiovar.h and bsd_audioio.h. The driver is -installed in the same way as described in the BSD driver documentation, -with the addition of the following define in the kernel configuration -file: - -options AUDIO_IRIG # IRIG driver - -This causes the IRIG code to be included in the BSD driver, as well as a -C-coded codec interrupt routine which replaces the assembly-coded -routine and provides the IRIG functionality. While the C-coded routine -is somewhat slower than the assembly-coded routine, the extra overhead -is not expected to be significant. Note that the IRIG driver calls the -kernel routine microtime() as included in the ppsclock directory of the -NTP Version 3 distribution xntp3. It is highly recommended that this -routine be installed in the kernel configuration as well. The -instructions for doing this are contained in the ppsclock directory of -the xntp3 distribution. - -Roy LeCates <lecates@udel.edu> and David Mills <mills@udel.edu> -Electrical Engineering Department -University of Delaware -Newark, DE 19716 -302 831 8247 fax 302 831 4316 - -24 August 1993 diff --git a/usr.sbin/xntpd/doc/README.kern b/usr.sbin/xntpd/doc/README.kern deleted file mode 100644 index aac26fa2e62b..000000000000 --- a/usr.sbin/xntpd/doc/README.kern +++ /dev/null @@ -1,1374 +0,0 @@ - A Kernel Model for Precision Timekeeping - - Revised 3 April 1994 - -Note: This memorandum is a substantial revision of RFC-1589, "A Kernel -Model for Precision Timekeeping," March, 1994. It includes several -changes to the daemon and user interfaces, as well as a new feature -which disciplines the CPU clock oscillator in both time and frequency to -a source of precision time signals. This memorandum is included in the -distributions for the SunOS, Ultrix and OSF/1 kernels and in the NTP -Version 3 distribution (xntp3.v.tar.Z) as the file README.kern, where v -is the version identifier. Availability of the kernel distributions, -which involve licensed code, will be announced separately. The NTP -Version 3 distribution can be obtained via anonymous ftp from -louie.udel.edu in the directory pub/ntp. In order to utilize all -features of this distribution, the NTP version identifier should be 3q -or later. - -Overview - -This memorandum describes an engineering model which implements a -precision time-of-day function for a generic operating system. The model -is based on the principles of disciplined oscillators and phase-lock -loops (PLL) and frequency-lock loops (FLL) often found in the -engineering literature. It has been implemented in the Unix kernels for -several workstations, including those made by Sun Microsystems and -Digital Equipment. The model changes the way the system clock is -adjusted in time and frequency, as well as provides mechanisms to -discipline its frequency to an external precision timing source. The -model incorporates a generic system-call interface for use with the -Network Time Protocol (NTP) or similar time synchronization protocol. -The NTP Version 3 daemon xntpd operates with this model to provide -synchronization limited in principle only by the accuracy and stability -of the external timing source. - -This memorandum does not obsolete or update any RFC. It does not propose -a standard protocol, specification or algorithm. It is intended to -provoke comment, refinement and implementations for kernels not -considered herein. While a working knowledge of NTP is not required for -an understanding of the design principles or implementation of the -model, it may be helpful in understanding how the model behaves in a -fully functional timekeeping system. The architecture and design of NTP -is described in [MIL91], while the current NTP Version 3 protocol -specification is given in RFC-1305 [MIL92a] and a subset of the -protocol, the Simple Network Time Protocol (SNTP), is given in RFC-1361 -[MIL92c]. - -The model has been implemented in the Unix kernels for three Sun -Microsystems and Digital Equipment workstations. In addition, for the -Digital machines the model provides improved precision to one -microsecond (us). Since these specific implementations involve -modifications to licensed code, they cannot be provided directly. -Inquiries should be directed to the manufacturer's representatives. -However, the engineering model for these implementations, including a -simulator with code segments almost identical to the implementations, -but not involving licensed code, is available via anonymous FTP from -host louie.udel.edu in the directory pub/ntp and compressed tar archive -kernel.tar.Z. The NTP Version 3 distribution can be obtained via -anonymous ftp from the same host and directory in the compressed tar -archive xntp3.3q.tar.Z, where the version number shown as 3.3q may be -adjusted for new versions as they occur. - -1. Introduction - -This memorandum describes a model and programming interface for generic -operating system software that manages the system clock and timer -functions. The model provides improved accuracy and stability for most -computers using the Network Time Protocol (NTP) or similar time -synchronization protocol. This memorandum describes the design -principles and implementations of the model, while related technical -reports discuss the design approach, engineering analysis and -performance evaluation of the model as implemented in Unix kernels for -modern workstations. The NTP Version 3 daemon xntpd operates with these -implementations to provide improved accuracy and stability, together -with diminished overhead in the operating system and network. In -addition, the model supports the use of external timing sources, such as -precision pulse-per-second (PPS) signals and the industry standard IRIG -timing signals. The NTP daemon automatically detects the presence of the -new features and utilizes them when available. - -There are three prototype implementations of the model presented in this -memorandum, one each for the Sun Microsystems SPARCstation with the -SunOS 4.1.x kernel, Digital Equipment DECstation 5000 with the Ultrix -4.x kernel and Digital Equipment 3000 AXP Alpha with the OSF/1 V1.x -kernel. In addition, for the DECstation 5000/240 and 3000 AXP Alpha -machines, a special feature provides improved precision to 1 us (stock -Sun kernels already do provide this precision). Other than improving the -system clock accuracy, stability and precision, these implementations do -not change the operation of existing Unix system calls which manage the -system clock, such as gettimeofday(), settimeofday() and adjtime(); -however, if the new features are in use, the operations of -gettimeofday() and adjtime() can be controlled instead by new system -calls ntp_gettime() and ntp_adjtime() as described below. - -A detailed description of the variables and algorithms that operate upon -them is given in the hope that similar functionality can be incorporated -in Unix kernels for other machines. The algorithms involve only minor -changes to the system clock and interval timer routines and include -interfaces for application programs to learn the system clock status and -certain statistics of the time synchronization process. Detailed -installation instructions are given in a specific README files included -in the kernel distributions. - -In this memorandum, NTP Version 3 and the Unix implementation xntp3 are -used as an example application of the new system calls for use by a -synchronization daemon. In principle, these system calls can be used by -other protocols and implementations as well. Even in cases where the -local time is maintained by periodic exchanges of messages at relatively -long intervals, such as using the NIST Automated Computer Time Service -[LEV89], the ability to precisely adjust the system clock frequency -simplifies the synchronization procedures and allows the telephone call -frequency to be considerably reduced. - -2. Design Approach - -While not strictly necessary for an understanding or implementation of -the model, it may be helpful to briefly describe how NTP operates to -control the system clock in a client computer. As described in [MIL91], -the NTP protocol exchanges timestamps with one or more peers sharing a -synchronization subnet to calculate the time offsets between peer clocks -and the local clock. These offsets are processed by several algorithms -which refine and combine the offsets to produce an ensemble average, -which is then used to adjust the local clock time and frequency. The -manner in which the local clock is adjusted represents the main topic of -this memorandum. The goal in the enterprise is the most accurate and -stable system clock possible with the available computer hardware and -kernel software. - -In order to understand how the new model works, it is useful to review -how most Unix kernels maintain the system clock. In the Unix design a -hardware counter interrupts the kernel at a fixed rate: 100 Hz in the -SunOS kernel, 256 Hz in the Ultrix kernel and 1024 Hz in the OSF/1 -kernel. Since the Ultrix timer interval (reciprocal of the rate) does -not evenly divide one second in microseconds, the kernel adds 64 us once -each second, so the timescale consists of 255 advances of 3906 us plus -one of 3970 us. Similarly, the OSF/1 kernel adds 576 us once each -second, so its timescale consists of 1023 advances of 976 us plus one of -1552 us. - -2.1. Mechanisms to Adjust Time and Frequency - -In most Unix kernels it is possible to slew the system clock to a new -offset relative to the current time by using the adjtime() system call. -To do this the clock frequency is changed by adding or subtracting a -fixed amount (tickadj) at each timer interrupt (tick) for a calculated -number of timer interrupts. Since this calculation involves dividing the -requested offset by tickadj, it is possible to slew to a new offset with -a precision only of tickadj, which is usually in the neighborhood of 5 -us, but sometimes much larger. This results in a roundoff error which -can accumulate to an unacceptable degree, so that special provisions -must be made in the clock adjustment procedures of the synchronization -daemon. - -In order to implement a frequency discipline function, it is necessary -to provide time offset adjustments to the kernel at regular adjustment -intervals using the adjtime() system call. In order to reduce the system -clock jitter to the regime consistent with the model, it is necessary -that the adjustment interval be relatively small, in the neighborhood of -1 s. However, the Unix adjtime() implementation requires each offset -adjustment to complete before another one can be begun, which means that -large adjustments must be amortized over possibly many adjustment -intervals. The requirement to implement the adjustment interval and -compensate for roundoff error considerably complicates the synchronizing -daemon implementation. - -In the new model this scheme is replaced by another that represents the -system clock as a multiple-word, precision-time variable in order to -provide very precise clock adjustments. At each timer interrupt a -precisely calibrated quantity is added to the kernel time variable and -overflows propagated as required. The quantity is computed as in the NTP -local clock model described in [MIL92b], which operates as an adaptive- -parameter, first-order, type-II phase-lock loop (PLL). In principle, -this PLL design can provide precision control of the system clock -oscillator within 1 us and frequency to within parts in 10^11. While -precisions of this order are surely well beyond the capabilities of the -CPU clock oscillator used in typical workstations, they are appropriate -using precision external oscillators, as described below. - -The PLL design is identical to the one originally implemented in NTP and -described in [MIL92b]. In the original design the software daemon -simulates the PLL using the adjtime() system call; however, the daemon -implementation is considerably complicated by the considerations -described above. The modified kernel routines implement the PLL in the -kernel using precision time and frequency representations, so that these -complications are avoided. A new system call ntp_adjtime() is called -only as each new time update is determined, which in NTP occurs at -intervals of from 16 s to 1024 s. In addition, doing frequency -compensation in the kernel means that the system clock runs true even if -the daemon were to cease operation or the network paths to the primary -synchronization source fail. - -In the new model the new ntp_adjtime() operates in a way similar to the -original adjtime() system call, but does so independently of adjtime(), -which continues to operate in its traditional fashion. When used with -NTP, it is the design intent that settimeofday() or adjtime() be used -only for system clock adjustments greater than +-128 ms, although the -dynamic range of the new model is much larger at +-512 ms. It has been -the Internet experience that the need to change the system clock in -increments greater than +-128 ms is extremely rare and is usually -associated with a hardware or software malfunction or system reboot. - -The easiest way to set the time is with the settimeofday() system call; -however, this can under some conditions cause the clock to jump -backwards. If this cannot be tolerated, adjtime() can be used to slew -the clock to the new value without running backward or affecting the -frequency discipline process. Once the system clock has been set within -+-128 ms, the ntp_adjtime() system call is used to provide periodic -updates including the time offset, maximum error, estimated error and -PLL time constant. With NTP the update interval and time constant depend -on the measured delay and dispersion; however, the scheme is quite -forgiving and neither moderate loss of updates nor variations in the -update interval are serious. - -2.2 Daemon and Application Interface - -Unix application programs can read the system clock using the -gettimeofday() system call, which returns only the system time and -timezone data. For some applications it is useful to know the maximum -error of the reported time due to all causes, including clock reading -errors, oscillator frequency errors and accumulated latencies on the -path to the primary synchronization source. However, in the new model -the PLL adjusts the system clock to compensate for its intrinsic -frequency error, so that the time error expected in normal operation -will usually be much less than the maximum error. The programming -interface includes a new system call ntp_gettime(), which returns the -system time, as well as the maximum error and estimated error. This -interface is intended to support applications that need such things, -including distributed file systems, multimedia teleconferencing and -other real-time applications. The programming interface also includes a -new system call ntp_adjtime(), which can be used to read and write -kernel variables for time and frequency adjustment, PLL time constant, -leap-second warning and related data. - -In addition, the kernel adjusts the indicated maximum error to grow by -an amount equal to the maximum oscillator frequency tolerance times the -elapsed time since the last update. The default engineering parameters -have been optimized for update intervals in the order of 64 s. As shown -in [MIL93], this is near the optimum interval for NTP used with ordinary -room-temperature quartz oscillators. For other intervals the PLL time -constant can be adjusted to optimize the dynamic response over intervals -of 16-1024 s. Normally, this is automatically done by NTP. In any case, -if updates are suspended, the PLL coasts at the frequency last -determined, which usually results in errors increasing only to a few -tens of milliseconds over a day using typical modern workstations. - -While any synchronization daemon can in principle be modified to use the -new system calls, the most likely will be users of the NTP Version 3 -daemon xntpd. The xntpd code determines whether the new system calls are -implemented and automatically reconfigures as required. When -implemented, the daemon reads the frequency offset from a system file -and provides it and the initial time constant via ntp_adjtime(). In -subsequent calls to ntp_adjtime(), only the time offset and time -constant are affected. The daemon reads the frequency from the kernel -using ntp_adjtime() at intervals of about one hour and writes it to a -system file. This information is recovered when the daemon is restarted -after reboot, for example, so the sometimes extensive training period to -learn the frequency separately for each oscillator can be avoided. - -2.3. Precision Clocks for DECstation 5000/240 and 3000 AXP Alpha - -The stock microtime() routine in the Ultrix kernel for Digital Equipment -MIPS-based workstations returns system time to the precision of the -timer interrupt interval, which is in the 1-4 ms range. However, in the -DECstation 5000/240 and possibly other machines of that family, there is -an undocumented IOASIC hardware register that counts system bus cycles -at a rate of 25 MHz. The new microtime() routine for the Ultrix kernel -uses this register to interpolate system time between timer interrupts. -This results in a precision of 1 us for all time values obtained via the -gettimeofday() and ntp_gettime() system calls. For the Digital Equipment -3000 AXP Alpha, the architecture provides a hardware Process Cycle -Counter and a machine instruction (rpcc) to read it. This counter -operates at the fundamental frequency of the CPU clock or some -submultiple of it, 133.333 MHz for the 3000/400 for example. The new -microtime() routine for the OSF/1 kernel uses this counter in the same -fashion as the Ultrix routine. Support for this feature is conditionally -compiled in the kernel only if the MICRO option is used in the kernel -configuration file. - -In both the Ultrix and OSF/1 kernels the gettimeofday() and -ntp_gettime() system call use the new microtime() routine, which returns -the interpolated value to 1-us resolution, but does not change the -kernel time variable. Therefore, other routines that access the kernel -time variable directly and do not call either gettimeofday(), -ntp_gettime() or microtime() will continue their present behavior. The -microtime() feature is independent of other features described here and -is operative even if the kernel PLL or new system calls have not been -implemented. - -The SunOS kernel already includes a system clock with 1-us resolution; -so, in principle, no microtime() routine is necessary. An existing -kernel routine uniqtime() implements this function, but it is coded in -the C language and is rather slow at 42-85 us per call on a SPARCstation -IPC. A replacement microtime() routine coded in assembler language is -available in the NTP Version 3 distribution and is much faster at about -3 us per call. Note that, as explained later, this routine should be -called at an interrupt priority level not greater than that of the timer -interrupt routine. Otherwise, it is possible to miss a tick increment, -with result the time returned can be late by one tick. This is always -true in the case of gettimeofday() and ntp_gettime(), but might not be -true in other cases, such as when using the PPS signal described later -in this memorandum. - -2.4. External Time and Frequency Discipline - -The overall accuracy of a time synchronization subnet with respect to -Coordinated Universal Time (UTC) depends on the accuracy and stability -of the primary synchronization source, usually a radio or satellite -receiver, and the CPU clock oscillator of the primary server. As -discussed in [MIL93], the traditional interface using a ASCII serial -timecode and RS232 port precludes the full accuracy of most radio -clocks. In addition, the poor frequency stability of typical CPU clock -oscillators limits the accuracy, whether or not precision time sources -are available. There are, however, several ways in which the system -clock accuracy and stability can be improved to the degree limited only -by the accuracy and stability of the synchronization source and the -jitter of the interface and operating system. - -Many radio clocks produce special signals that can be used by external -equipment to precisely synchronize time and frequency. Most produce a -pulse-per-second (PPS) signal that can be read via a modem-control lead -of a serial port and some produce a special IRIG signal that can be read -directly by a bus peripheral, such as the KSI/Odetics TPRO IRIG SBus -interface, or indirectly via the audio codec of some workstations, as -described in [MIL93]. In the NTP Version 3 daemon xntpd, the PPS signal -can be used to augment the less precise ASCII serial timecode to improve -accuracy to the order of a few tens of microseconds. Support is also -included in the NTP distribution for the TPRO interface, as well as the -audio codec; however, the latter requires a modified kernel audio driver -contained in the compressed tar archive bsd_audio.tar.Z in the same host -and directory as the NTP Version 3 distribution mentioned previously. -2.4.1. PPS Signal - -The most convenient way to interface a PPS signal to a computer is -usually with a serial port and RS232-compatible signal; however, the PPS -signal produced by most radio clocks and laboratory instruments is -usually a TTL pulse signal. Therefore, some kind of level -converter/pulse generator is necessary to adapt the PPS signal to a -serial port. An example design, including schematic and printed-circuit -board artwork, is in the compressed tar archive gadget.tar.Z in the same -host and directory as the NTP Version 3 distribution mentioned -previously. There are several ways the PPS signal can be used in -conjunction with the NTP Version 3 daemon xntpd, as described in [MIL93] -and in the documentation included in the distribution. - -The NTP Version 3 distribution includes a special ppsclock module for -the SunOS 4.1.x kernel that captures the PPS signal presented via a -modem-control lead of a serial port. Normally, the ppsclock module -produces a timestamp at each transition of the PPS signal and provides -it to the synchronization daemon for integration with the serial ASCII -timecode, also produced by the radio clock. With the conventional PLL -implementation in either the daemon or the kernel as described in -[MIL93], the accuracy of this scheme is limited by the intrinsic -stability of the CPU clock oscillator to a millisecond or two, depending -on environmental temperature variations. - -The ppsclock module has been modified to in addition call a new kernel -routine hardpps() once each second. In addition, the Ultrix 4.3 kernel -has been modified to provide a similar functionality. The hardpps() -routine compares the timestamp with a sample of the CPU clock oscillator -in order to discipline the oscillator to the time and frequency of the -PPS signal. Using this method, the time accuracy is improved to -typically 20 us or less and frequency stability a few parts in 10^8, -which is about two orders of magnitude better than the undisciplined -oscillator. The new feature is conditionally compiled in the code -described below only if the PPS_SYNC option is used in the kernel -configuration file. - -When using the PPS signal to adjust the time, there is a problem with -some kernels which is very difficult to fix. The serial port interrupt -routine often operates at an interrupt priority level above the timer -interrupt routine. Thus, as explained below, it is possible that a tick -increment can be missed and the time returned late by one tick. It may -happen that, if the CPU clock oscillator frequency is close to the PPS -oscillator frequency (less than a few ppm), this condition can persist -for two or more successive PPS interrupts. A useful workaround in the -code is to use a glitch detector and median filter to process the PPS -sample offsets. The glitch detector suppresses offset bursts greater -than half the tick interval and which last less than 30 successive PPS -interrupts. The median filter ranks the offsets in a moving window of -three samples and uses the median as the output and the difference -between the other two as a dispersion measure. - -2.4.2. External Clocks - -It is possible to replace the system clock function with an external bus -peripheral. The TPRO device mentioned previously can be used to provide -IRIG-synchronized time with a precision of 1 us. A driver for this -device tprotime.c and header file tpro.h are included in the -kernel.tar.Z distribution mentioned previously. Using this device, the -system clock is read directly from the interface; however, the device -does not record the year, so special provisions have been made to obtain -the year from the kernel time variable and initialize the driver -accordingly. Support for this feature is conditionally compiled in the -kernel only if the EXT_CLOCK and TPRO options are used in the kernel -configuration file. - -While the system clock function is provided directly by the microtime() -routine in the driver, the kernel time variable must be disciplined as -well, since not all system timing functions use the microtime() routine. -This is done by measuring the time difference between the microtime() -clock and kernel time variable and using it to adjust the kernel PLL as -if the adjustment were provided by an external peer and NTP. - -A good deal of error checking is done in the TPRO driver, since the -system clock is vulnerable to a misbehaving radio clock, IRIG signal -source, interface cables and TPRO device itself. Unfortunately, there is -no practical way to utilize the extensive diversity and redundancy -capabilities available in the NTP synchronization daemon. In order to -avoid disruptions that might occur if the TPRO time is far different -from the kernel time variable, the latter is used instead of the former -if the difference between the two exceeds 1000 s; presumably in that -case operator intervention is required. - -2.4.2. External Oscillators - -Even if a source of PPS or IRIG signals is not available, it is still -possible to improve the stability of the system clock through the use of -a specialized bus peripheral. In order to explore the benefits of such -an approach, a special SBus peripheral called HIGHBALL has been -constructed. The device includes a pair of 32-bit hardware counters in -Unix timeval format, together with a precision, oven-controlled quartz -oscillator with a stability of a few parts in 10^9. A driver for this -device hightime.c and header file high.h are included in the -kernel.tar.Z distribution mentioned previously. Support for this feature -is conditionally compiled in the kernel only if the EXT_CLOCK and -HIGHBALL options are used in the kernel configuration file. - -Unlike the external clock case, where the system clock function is -provided directly by the microtime() routine in the driver, the HIGHBALL -counter offsets with respect to UTC must be provided first. This is done -using the ordinary kernel PLL, but controlling the counter offsets -directly, rather than the kernel time variable. At first, this might -seem to defeat the purpose of the design, since the jitter and wander of -the synchronization source will affect the counter offsets and thus the -accuracy of the time. However, the jitter is much reduced by the PLL and -the wander is small, especially if using a radio clock or another -primary server disciplined in the same way. In practice, the scheme -works to reduce the incidental wander to a few parts in 10^8, or about -the same as using the PPS signal. - -As in the previous case, the kernel time variable must be disciplined as -well, since not all system timing functions use the microtime() routine. -However, the kernel PLL cannot be used for this, since it is already in -use providing offsets for the HIGHBALL counters. Therefore, a special -correction is calculated from the difference between the microtime() -clock and the kernel time variable and used to adjust the kernel time -variable at the next timer interrupt. This somewhat roundabout approach -is necessary in order that the adjustment does not cause the kernel time -variable to jump backwards and possibly lose or duplicate a timer event. - -2.5 Other Features - -It is a design feature of the NTP architecture that the system clocks in -a synchronization subnet are to read the same or nearly the same values -before during and after a leap-second event, as declared by national -standards bodies. The new model is designed to implement the leap event -upon command by an ntp_adjtime() argument. The intricate and sometimes -arcane details of the model and implementation are discussed in [MIL92b] -and [MIL93]. Further details are given in the technical summary later in -this memorandum. -3. Technical Summary - -In order to more fully understand the workings of the model, a stand- -alone simulator kern.c and header file timex.h are included in the -kernel.tar.Z distribution mentioned previously. In addition, an example -kernel module kern_ntptime.c which implements the ntp_gettime() and -ntp_adjtime() system calls is included. Neither of these programs -incorporate licensed code. Since the distribution is somewhat large, due -to copious comments and ornamentation, it is impractical to include a -listing of these programs in this memorandum. In any case, implementors -may choose to snip portions of the simulator for use in new kernel -designs; but, due to formatting conventions, this would be difficult if -included in this memorandum. - -The kern.c program is an implementation of an adaptive-parameter, first- -order, type-II phase-lock loop. The system clock is implemented using a -set of variables and algorithms defined in the simulator and driven by -explicit offsets generated by the main() routine in the program. The -algorithms include code fragments almost identical to those in the -machine-specific kernel implementations and operate in the same way, but -the operations can be understood separately from any licensed source -code into which these fragments may be integrated. The code fragments -themselves are not derived from any licensed code. The following -discussion assumes that the simulator code is available for inspection. - -3.1. PLL Simulation - -The simulator operates in conformance with the analytical model -described in [MIL92b]. The main() program operates as a driver for the -fragments hardupdate(), hardclock(), second_overflow(), hardpps() and -microtime(), although not all functions implemented in these fragments -are simulated. The program simulates the PLL at each timer interrupt and -prints a summary of critical program variables at each time update. - -There are three defined options in the kernel configuration file -specific to each implementation. The PPS_SYNC option provides support -for a pulse-per-second (PPS) signal, which is used to discipline the -frequency of the CPU clock oscillator. The EXT_CLOCK option provides -support for an external kernel-readable clock, such as the KSI/Odetics -TPRO IRIG interface or HIGHBALL precision oscillator, both for the SBus. -The TPRO option provides support for the former, while the HIGHBALL -option provides support for the latter. External clocks are implemented -as the microtime() clock driver, with the specific source code selected -by the kernel configuration file. - -The PPS signal is carefully monitored for error conditions which can -affect accuracy, stability and reliability. The time_status kernel -variable contains bits that both control the use of the PPS signal and -reveal its operational status. The function of each bit is described in -a later section of this memo. - -3.1.1. The hardupdate() Fragment - -The hardupdate() fragment is called by ntp_adjtime() as each update is -computed to adjust the system clock phase and frequency. Note that the -time constant is in units of powers of two, so that multiplies can be -done by simple shifts. The phase variable is computed as the offset -divided by the time constant, but clamped to a maximum (for robustness). -Then, the time since the last update is computed and clamped to a -maximum and to zero if initializing. The offset is multiplied (sorry -about the ugly multiply) by the result and divided by the square of the -time constant and then added to the frequency variable. Note that all -shifts are assumed to be positive and that a shift of a signed quantity -to the right requires a little dance. - -The STA_PLL and STA_PPSTIME status bits, which are set by the -ntp_adjtime() system call, serve to enable or inhibit the kernel PLL and -PPS time-discipline functions. The STA_PPSSIGNAL status bit is set by -the hardpps() code fragment when the PPS signal is present and operating -within nominal bounds. Time discipline from the PPS signal operates only -if both the STA_PPSTIME and STA_PPSSIGNAL bits are set; otherwise, the -discipline operates from the offset given in the ntp_adjtime() system -call. In the intended mode of operation, the synchronization daemon sets -STA_PLL to enable the PLL when first initialized, then sets STA_PPSTIME -when reliable synchronization to within +-128 ms has been achieved with -either a radio clock or external peer. The daemon can detect and -indicate this condition for monitoring purposes by noting that both -STA_PPSTIME and STA_PPSSIGNAL are set. - -With the defines given in the program and header files, the maximum time -offset is determined by the size in bits of the long type (32 or 64) -less the SHIFT_UPDATE scale factor (12) or at least 20 bits (signed). -The scale factor is chosen so that there is no loss of significance in -later steps, which may involve a right shift up to SHIFT_UPDATE bits. -This results in a time adjustment range over +-512 ms. Since -time_constant must be greater than or equal to zero, the maximum -frequency offset is determined by the SHIFT_USEC scale factor (16) or at -least 16 bits (signed). This results in a frequency adjustment range -over +-31,500 ppm. - -In the addition step, the value of offset * mtemp is not greater than -MAXPHASE * MAXSEC = 31 bits (signed), which will not overflow a long add -on a 32-bit machine. There could be a loss of precision due to the right -shift of up to 12 bits, since time_constant is bounded at 6. This -results in a net worst-case frequency resolution of about .063 ppm, -which is not significant for most quartz oscillators. The worst case -could be realized only if the NTP peer misbehaves according to the -protocol specification. - -The time_offset value is clamped upon entry. The time_phase variable is -an accumulator, so is clamped to the tolerance on every call. This helps -to damp transients before the oscillator frequency has been stabilized, -as well as to satisfy the correctness assertions if the time -synchronization protocol or implementation misbehaves. - -3.1.2. The hardclock() Fragment - -The hardclock() fragment is inserted in the hardware timer interrupt -routine at the point the system clock is to be incremented by the value -of tick. Previous to this fragment the time_update variable has been -initialized to the tick increment plus the value computed by the -adjtime() system call in the stock Unix kernel, normally plus/minus the -tickadj value, which is usually in the order of 5 us. The time_phase -variable, which represents the instantaneous phase of the system clock, -is advanced by time_adj, which is calculated in the second_overflow() -fragment described below. If the value of time_phase exceeds 1 us in -scaled units, time_update is increased by the (signed) excess and -time_phase retains the residue. - -In those cases where a PPS signal is connected by a serial port -operating at an interrupt priority level greater than the timer -interrupt, special consideration should be given the location of the -hardclock() fragment in the timer interrupt routine. The system clock -should be advanced as early in the routine as possible, preferably -before the hardware timer interrupt flag is cleared. This reduces or -eliminates the possibility that the microtime() routine may latch the -time after the flag is cleared, but before the system clock is advanced, -which results in a returned time late by one tick. - -Except in the case of an external oscillator such as the HIGHBALL -interface, the hardclock() fragment advances the system clock by the -value of tick plus time_update. However, in the case of an external -oscillator, the system clock is obtained directly from the interface and -time_update used to discipline that interface instead. However, the -system clock must still be disciplined as explained previously, so the -value of clock_cpu computed by the second_overflow() fragment is used -instead. - -3.1.3. The second_overflow() Fragment - -The second_overflow() fragment is inserted at the point where the -microseconds field of the system time variable is being checked for -overflow. Upon overflow the maximum error time_maxerror is increased by -time_tolerance to reflect the maximum time offset due to oscillator -frequency error. Then, the increment time_adj to advance the kernel time -variable is calculated from the (scaled) time_offset and time_freq -variables updated at the last call to the hardclock() fragment. - -The phase adjustment is calculated as a (signed) fraction of the -time_offset remaining, where the fraction is added to time_adj, then -subtracted from time_offset. This technique provides a rapid convergence -when offsets are high, together with good resolution when offsets are -low. The frequency adjustment is the sum of the (scaled) time_freq -variable, an adjustment necessary when the tick interval does not evenly -divide one second fixtick and PPS frequency adjustment pps_freq (if -configured). - -The scheme of approximating exact multiply/divide operations with shifts -produces good results, except when an exact calculation is required, -such as when the PPS signal is being used to discipline the CPU clock -oscillator frequency as described below. As long as the actual -oscillator frequency is a power of two in Hz, no correction is required. -However, in the SunOS kernel the clock frequency is 100 Hz, which -results in an error factor of 0.78. In this case the code increases -time_adj by a factor of 1.25, which results in an overall error less -than three percent. - -On rollover of the day, the leap-second state machine described below -determines whether a second is to be inserted or deleted in the -timescale. The microtime() routine insures that the reported time is -always monotonically increasing. - -3.1.4. The hardpps() Fragment - -The hardpps() fragment is operative only if the PPS_SYNC option is -specified in the kernel configuration file. It is called from the serial -port driver or equivalent interface at the on-time transition of the PPS -signal. The code operates as a first-order, type-I, frequency-lock loop -(FLL) controlled by the difference between the frequency represented by -the pps_freq variable and the frequency of the hardware clock -oscillator. It also provides offsets to the hardupdate() fragment in -order to discipline the system clock time. - -In order to avoid calling the microtime() routine more than once for -each PPS transition, the interface requires the calling program to -capture the system time and hardware counter contents at the on-time -transition of the PPS signal and provide a pointer to the timestamp -(Unix timeval) and counter contents as arguments to the hardpps() call. -The hardware counter contents are determined by saving the microseconds -field of the system time, calling the microtime() routine, and -subtracting the saved value. If a microseconds overflow has occurred -during the process, the resulting microseconds value will be negative, -in which case the caller adds 1000000 to normalize the microseconds -field. - -In order to avoid large jitter when the PPS interrupt occurs during the -timer interrupt routine before the system clock is advanced, a glitch -detector is used. The detector latches when an offset exceeds a -threshold tick/2 and stays latched until either a subsequent offset is -less than the threshold or a specified interval MAXGLITCH (30 s) has -elapsed. As long as the detector remains latched, it outputs the offset -immediately preceding the latch, rather than the one received. - -A three-stage median filter is used to suppress jitter less than the -glitch threshold. The median sample drives the PLL, while the difference -between the other two samples represents the time dispersion. Time -dispersion samples are averaged and used as a jitter estimate. If this -estimate exceeds a threshold MAXTIME/2 (100 us), an error bit -STA_PPSJITTER is raised in the status word. - -The frequency of the hardware oscillator is determined from the -difference in hardware counter readings at the beginning and end of the -calibration interval divided by the duration of the interval. However, -the oscillator frequency tolerance, as much as 100 ppm, may cause the -difference to exceed the tick value, creating an ambiguity. In order to -avoid this ambiguity, the hardware counter value at the beginning of the -interval is increased by the current pps_freq value once each second, -but computed modulo the tick value. At the end of the interval, the -difference between this value and the value computed from the hardware -counter is the control signal for the FLL. - -Control signal samples which exceed the frequency tolerance MAXFREQ (100 -ppm) are discarded, as well as samples resulting from excessive interval -duration jitter. In these cases an error bit STA_PPSERROR is raised in -the status word. Surviving samples are then processed by a three-stage -median filter. The median sample drives the FLL, while the difference -between the other two samples represents the frequency dispersion. -Frequency dispersion samples are averaged and used as a stabiity -estimate. If this estimate is below a threshold MAXFREQ/4 (25 ppm), the -median sample is used to correct the oscillator frequency pps_freq with -a weight expressed as a shift PPS_AVG (2). - -Initially, an approximate value for the oscillator frequency is not -known, so the duration of the calibration interval must be kept small to -avoid overflowing the tick. The time difference at the end of the -calibration interval is measured. If greater than tick/4, the interval -is reduced by half. If less than this fraction for four successive -calibration intervals, the interval is doubled. This design -automatically adapts to nominal jitter in the PPS signal, as well as the -value of tick. The duration of the calibration interval is set by the -pps_shift variable as a shift in powers of two. The minimum value -PPS_SHIFT (2) is chosen so that with the highest CPU oscillator -frequency 1024 Hz and frequency tolerance 100 ppm the tick will not -overflow. The maximum value PPS_SHIFTMAX (8) is chosen such that the -maximum averaging time is about 1000 s as determined by measurements of -Allan variance [MIL93]. - -Should the PPS signal fail, the current frequency estimate pps_freq -continues to be used, so the nominal frequency remains correct subject -only to the instability of the undisciplined oscillator. The procedure -to save and restore the frequency estimate works as follows. When -setting the frequency from a file, the time_freq value is set as the -file value minus the pps_freq value; when retrieving the frequency, the -two values are added before saving in the file. This scheme provides a -seamless interface should the PPS signal fail or the kernel -configuration change. Note that the frequency discipline is active -whether or not the synchronization daemon is active. Since all Unix -systems take some time after reboot to build a running system, usually -by that time the discipline process has already settled down and the -initial transients due to frequency discipline have damped out. -3.1.4. External Clock Interface - -The external clock driver interface is implemented with two routines, -microtime(), which returns the current clock time, and clock_set(), -which furnishes the apparent system time derived from the kernel time -variable. The latter routine is called only when the clock is set using -the settimeofday() system call, but can be called from within the -driver, such as when the year rolls over, for example. - -In the stock SunOS kernel and modified Ultrix and OSF/1 kernels, the -microtime() routine returns the kernel time variable plus an -interpolation between timer interrupts based on the contents of a -hardware counter. In the case of an external clock, such as described -above, the system clock is read directly from the hardware clock -registers. Examples of external clock drivers are in the tprotime.c and -hightime.c routines included in the kernel.tar.Z distribution. - -The external clock routines return a status code which indicates whether -the clock is operating correctly and the nature of the problem, if not. -The return code is interpreted by the ntp_gettime() system call, which -transitions the status state machine to the TIME_ERR state if an error -code is returned. This is the only error checking implemented for the -external clock in the present version of the code. - -The simulator has been used to check the PLL operation over the design -envelope of +-512 ms in time error and +-100 ppm in frequency error. -This confirms that no overflows occur and that the loop initially -converges in about 15 minutes for timer interrupt rates from 50 Hz to -1024 Hz. The loop has a normal overshoot of a few percent and a final -convergence time of several hours, depending on the initial time and -frequency error. - -3.2. Leap Seconds - -It does not seem generally useful in the user application interface to -provide additional details private to the kernel and synchronization -protocol, such as stratum, reference identifier, reference timestamp and -so forth. It would in principle be possible for the application to -independently evaluate the quality of time and project into the future -how long this time might be "valid." However, to do that properly would -duplicate the functionality of the synchronization protocol and require -knowledge of many mundane details of the platform architecture, such as -the subnet configuration, reachability status and related variables. For -the curious, the ntp_adjtime() system call can be used to reveal some of -these mysteries. - -However, the user application may need to know whether a leap second is -scheduled, since this might affect interval calculations spanning the -event. A leap-warning condition is determined by the synchronization -protocol (if remotely synchronized), by the timecode receiver (if -available), or by the operator (if awake). This condition is set by the -synchronization daemon on the day the leap second is to occur (30 June -or 31 December, as announced) by specifying in a ntp_adjtime() system -call a status bit of either STA_DEL, if a second is to be deleted, or -STA_INS, if a second is to be inserted. Note that, on all occasions -since the inception of the leap-second scheme, there has never been a -deletion, nor is there likely to be one in future. If the bit is -STA_DEL, the kernel adds one second to the system time immediately -following second 23:59:58 and resets the clock state to TIME_WAIT. If -the bit is STA_INS, the kernel subtracts one second from the system time -immediately following second 23:59:59 and resets the clock stateto -TIME_OOP, in effect causing system time to repeat second 59. Immediately -following the repeated second, the kernel resets the clock status to -TIME_WAIT. - -Following the leap operations, the clock remains in the TIME_WAIT state -until both the STA_DEL and STA_INS status bits are reset. This provides -both an unambiguous indication that a leap recently occured, as well as -time for the daemon or operator to clear the warning condition. - -Depending upon the system call implementation, the reported time during -a leap second may repeat (with the TIME_OOP return code set to advertise -that fact) or be monotonically adjusted until system time "catches up" -to reported time. With the latter scheme the reported time will be -correct before and shortly after the leap second (depending on the -number of microtime() calls during the leap second), but freeze or -slowly advance during the leap second itself. However, Most programs -will probably use the ctime() library routine to convert from timeval -(seconds, microseconds) format to tm format (seconds, minutes,...). If -this routine is modified to use the ntp_gettime() system call and -inspect the return code, it could simply report the leap second as -second 60. - -3.3. Clock Status State Machine - -The various options possible with the system clock model described in -this memorandum require a careful examination of the state transitions, -status indications and recovery procedures should a crucial signal or -interface fail. In this section is presented a prototype state machine -designed to support leap second insertion and deletion, as well as -reveal various kinds of errors in the synchronization process. The -states of this machine are decoded as follows: - - TIME_OK If a PPS signal or external clock is present, it is - working properly and the system clock is derived - from it. If not, the synchronization daemon is - working properly and the system clock is - synchronized to a radio clock or one or more peers. - - TIME_INS An insertion of one second in the system clock has - been declared following the last second of the - current day, but has not yet been executed. - - TIME_DEL A deletion of the last second of the current day has - been declared, but not yet executed. - - TIME_OOP An insertion of one second in the system clock has - been declared following the last second of the - current day. The second is in progress, but not yet - completed. Library conversion routines should - interpret this second as 23:59:60. - - TIME_WAIT The scheduled leap event has occurred, but the - STA_DEL and STA_INS status bits have not yet been - cleared. - - TIME_ERROR Either (a) the synchronization daemon has declared - the protocol is not working properly, (b) all - sources of outside synchronization have been lost or - (c) a PPS signal or external clock is present, but - not working properly. - -In all states the system clock is derived from either a PPS signal or -external clock, if present, or the kernel time variable, if not. If a -PPS error condition is recognized, the PPS signal is disabled and -ntp_adjtime() updates are used instead. If an external clock error -condition is recognized, the external clock is disabled and the kernel -time variable is used instead. - -The state machine makes a transition once each second at an instant -where the microseconds field of the kernel time variable overflows and -one second is added to the seconds field. However, this condition is -checked when the timer overflows, which may not coincide with the actual -seconds increment. This may lead to some interesting anomalies, such as -a status indication of a leap second in progress (TIME_OOP) when the -leap second has already expired. This ambiguity is unavoidable, unless -the timer interrupt is made synchronous with the system clock. - -The following state transitions are executed automatically by the kernel -at rollover of the microseconds field: - - any state -> TIME_ERROR This transition occurs when an error - condition is recognized and continues as long - as the condition persists. The error indication - overrides the normal state indication, but does - not affect the actual clock state. Therefore, - when the condition is cleared, the normal state - indication resumes. - - TIME_OK->TIME_DEL This transition occurs if the STA_DEL bit is - set in the status word. - - TIME_OK->TIME_INS This transition occurs if the STA_INS bit is - set in the status word. - - TIME_INS->TIME_OOP This transition occurs immediately following - second 86,400 of the current day when an - insert-second event has been declared. - - TIME_OOP->TIME_WAIT This transition occurs immediately following - second 86,401 of the current day; that is, one - second after entry to the TIME_OOP state. - - TIME_DEL->TIME_WAIT This transition occurs immediately following - second 86,399 of the current day when a delete- - second event has been declared. - - TIME_WAIT->TIME_OK This transition occurs when the STA_DEL and - STA_INS bits are cleared by an ntp_adjtime() - call. - -The following table summarizes the actions just before, during and just -after a leap-second event. Each line in the table shows the UTC and NTP -times at the beginning of the second. The left column shows the behavior -when no leap event is to occur. In the middle column the state machine -is in TIME_INS at the end of UTC second 23:59:59 and the NTP time has -just reached 400. The NTP time is set back one second to 399 and the -machine enters TIME_OOP. At the end of the repeated second the machine -enters TIME_OK and the UTC and NTP times are again in correspondence. In -the right column the state machine is in TIME_DEL at the end of UTC -second 23:59:58 and the NTP time has just reached 399. The NTP time is -incremented, the machine enters TIME_OK and both UTC and NTP times are -again in correspondence. - - No Leap Leap Insert Leap Delete - UTC NTP UTC NTP UTC NTP - --------------------------------------------- - 23:59:58|398 23:59:58|398 23:59:58|398 - | | | - 23:59:59|399 23:59:59|399 00:00:00|400 - | | | - 00:00:00|400 23:59:60|399 00:00:01|401 - | | | - 00:00:01|401 00:00:00|400 00:00:02|402 - | | | - 00:00:02|402 00:00:01|401 00:00:03|403 - | | | -To determine local midnight without fuss, the kernel code simply finds -the residue of the time.tv_sec (or time.tv_sec + 1) value mod 86,400, -but this requires a messy divide. Probably a better way to do this is to -initialize an auxiliary counter in the settimeofday() routine using an -ugly divide and increment the counter at the same time the time.tv_sec -is incremented in the timer interrupt routine. For future embellishment. - -4. Programming Model and Interfaces - -This section describes the programming model for the synchronization -daemon and user application programs. The ideas are based on suggestions -from Jeff Mogul and Philip Gladstone and a similar interface designed by -the latter. It is important to point out that the functionality of the -original Unix adjtime() system call is preserved, so that the modified -kernel will work as the unmodified one, should the new features not be -in use. In this case the ntp_adjtime() system call can still be used to -read and write kernel variables that might be used by a synchronization -daemon other than NTP, for example. - -The kernel routines use the clock state variable time_state, which -records whether the clock is synchronized, waiting for a leap second, -etc. The value of this variable is returned as the result code by both -the ntp_gettime() and ntp_adjtime() system calls. It is set implicitly -by the STA_DEL and STA_INS status bits, as described previously. Values -presently defined in the timex.h header file are as follows: - - TIME_OK 0 no leap second warning - TIME_INS 1 insert leap second warning - TIME_DEL 2 delete leap second warning - TIME_OOP 3 leap second in progress - TIME_WAIT 4 leap second has occured - TIME_ERROR 5 clock not synchronized - -In case of a negative result code, the kernel has intercepted an invalid -address or (in case of the ntp_adjtime() system call), a superuser -violation. - -4.1. The ntp_gettime() System Call - -The syntax and semantics of the ntp_gettime() call are given in the -following fragment of the timex.h header file. This file is identical, -except for the SHIFT_HZ define, in the SunOS, Ultrix and OSF/1 kernel -distributions. (The SHIFT_HZ define represents the logarithm to the base -2 of the clock oscillator frequency specific to each system type.) Note -that the timex.h file calls the syscall.h system header file, which must -be modified to define the SYS_ntp_gettime system call specific to each -system type. The kernel distributions include directions on how to do -this. - - /* - * This header file defines the Network Time Protocol (NTP) - * interfaces for user and daemon application programs. These are - * implemented using private system calls and data structures and - * require specific kernel support. - * - * NAME - * ntp_gettime - NTP user application interface - * - * SYNOPSIS - * #include <sys/timex.h> - * - * int system call(SYS_ntp_gettime, tptr) - * - * int SYS_ntp_gettime defined in syscall.h header file - * struct ntptimeval *tptr pointer to ntptimeval structure - * - * NTP user interface - used to read kernel clock values - * Note: maximum error = NTP synch distance = dispersion + delay / - * 2 - * estimated error = NTP dispersion. - */ - struct ntptimeval { - struct timeval time; /* current time (ro) */ - long maxerror; /* maximum error (us) (ro) */ - long esterror; /* estimated error (us) (ro) */ - }; - -The ntp_gettime() system call returns three read-only (ro) values in the -ntptimeval structure: the current time in unix timeval format plus the -maximum and estimated errors in microseconds. While the 32-bit long data -type limits the error quantities to something more than an hour, in -practice this is not significant, since the protocol itself will declare -an unsynchronized condition well below that limit. In the NTP Version 3 -specification, if the protocol computes either of these values in excess -of 16 seconds, they are clamped to that value and the system clock -declared unsynchronized. - -Following is a detailed description of the ntptimeval structure members. - -struct timeval time (ro) - - This member is the current system time expressed as a Unix timeval - structure. The timeval structure consists of two 32-bit words; the - first is the number of seconds past 1 January 1970 assuming no - intervening leap-second insertions or deletions, while the second - is the number of microseconds within the second. - -long maxerror (ro) - - This member is the value of the time_maxerror kernel variable, - which represents the maximum error of the indicated time relative - to the primary synchronization source, in microseconds. For NTP, - the value is initialized by a ntp_adjtime() call to the - synchronization distance, which is equal to the root dispersion - plus one-half the root delay. It is increased by a small amount - (time_tolerance) each second to reflect the maximum clock frequency - error. This variable is provided bu a ntp-adjtime() system call and - modified by the kernel, but is otherwise not used by the kernel. - -long esterror (ro) - - This member is the value of the time_esterror kernel variable, - which represents the expected error of the indicated time relative - to the primary synchronization source, in microseconds. For NTP, - the value is determined as the root dispersion, which represents - the best estimate of the actual error of the system clock based on - its past behavior, together with observations of multiple clocks - within the peer group. This variable is provided bu a ntp-adjtime() - system call, but is otherwise not used by the kernel. - -4.2. The ntp_adjtime() System Call - -The syntax and semantics of the ntp_adjtime() call are given in the -following fragment of the timex.h header file. Note that, as in the -ntp_gettime() system call, the syscall.h system header file must be -modified to define the SYS_ntp_adjtime system call specific to each -system type. In the fragment, rw = read/write, ro = read-only, wo = -write-only. - - /* - * NAME - * ntp_adjtime - NTP daemon application interface - * - * SYNOPSIS - * #include <sys/timex.h> - * - * int system call(SYS_ntp_adjtime, mode, tptr) - * - * int SYS_ntp_adjtime defined in syscall.h header file - * struct timex *tptr pointer to timex structure - * - * NTP daemon interface - used to discipline kernel clock - * oscillator - */ - struct timex { - unsigned int mode; /* mode selector (wo) */ - long offset; /* time offset (us) (rw) */ - long frequency; /* frequency offset (scaled ppm) (rw) - */ - long maxerror; /* maximum error (us) (rw) */ - long esterror; /* estimated error (us) (rw) */ - int status; /* clock status bits (rw) */ - long constant; /* pll time constant (rw) */ - long precision; /* clock precision (us) (ro) */ - long tolerance; /* clock frequency tolerance (scaled - * ppm) (ro) */ - /* - * The following read-only structure members are implemented - * only if the PPS signal discipline is configured in the - * kernel. - */ - long ppsfreq; /* pps frequency (scaled ppm) (ro) */ - long jitter; /* pps jitter (us) (ro) */ - int shift; /* interval duration (s) (shift) (ro) - */ - long stabil; /* pps stability (scaled ppm) (ro) */ - long jitcnt; /* jitter limit exceeded (ro) */ - long calcnt; /* calibration intervals (ro) */ - long errcnt; /* calibration errors (ro) */ - long stbcnt; /* stability limit exceeded (ro) */ - }; - -The ntp_adjtime() system call is used to read and write certain time- -related kernel variables summarized below. Writing these variables can -only be done in superuser mode. To write a variable, the mode structure -member is set with one or more bits, one of which is assigned each of -the following variables in turn. The current values for all variables -are returned in any case; therefore, a mode argument of zero means to -return these values without changing anything. - -Following is a description of the timex structure members. - -mode (wo) - - This is a bit-coded variable selecting one or more structure - members, with one bit assigned each member. If a bit is set, the - value of the associated member variable is copied to the - corresponding kernel variable; if not, the member is ignored. The - bits are assigned as given in the following, with the variable name - indicated in parens. Note that the precision, tolerance and PPS - variables are determined by the kernel and cannot be changed by - ntp_adjtime(). - - MOD_OFFSET 0x0001 time offset (offset) - MOD_FREQUENCY 0x0002 frequency offset (frequency) - MOD_MAXERROR 0x0004 maximum time error (maxerror) - MOD_ESTERROR 0x0008 estimated time error (esterror) - MOD_STATUS 0x0010 clock status (status) - MOD_TIMECONST 0x0020 pll time constant (constant) - MOD_CLKB 0x4000 set clock B - MOD_CLKA 0x8000 set clock A - - Note that the MOD_CLK0 and MOD_CLK1 bits are intended for those - systems where more than one hardware clock is available for backup, - such as in Tandem Non-Stop computers. Presumably, in such cases - each clock would have its own oscillator and require a separate PLL - for each. Refinements to this model are for further study. The - interpretation of these bits is as follows: - -offset (rw) - - If selected, this member specifies the time adjustment, in - microseconds. The absolute value must be less than MAXPHASE - (128000) microseconds defined in the timex.h header file. On - return, this member contains the residual offset remaining between - a previously specified offset and the current system time, in - microseconds. - -frequency (rw) - - If selected, this member replaces the value of the time_frequency - kernel variable. The value is in ppm, with the integer part in the - high order 16 bits and fraction in the low order 16 bits. The - absolute value must be in the range less than MAXFREQ (100) ppm - defined in the timex.h header file. - - The time_freq variable represents the frequency offset of the CPU - clock oscillator. It is recalculated as each update to the system - clock is determined by the offset member of the timex structure. It - is usually set from a value stored in a file when the - synchronization daemon is first started. The current value is - usually retrieved via this member and written to the file about - once per hour. - -maxerror (rw) - - If selected, this member replaces the value of the time_maxerror - kernel variable, in microseconds. This is the same variable as in - the ntp_getime() system call. - -esterror (rw) - - If selected, this member replaces the value of the time_esterror - kernel variable, in microseconds. This is the same variable as in - the ntp_getime() system call. - -int status (rw) - - If selected, this member replaces the value of the time_status - kernel variable. This variable controls the state machine used to - insert or delete leap seconds and shows the status of the - timekeeping system, PPS signal and external oscillator, if - configured. - - STA_PLL 0x0001 enable PLL updates (r/w) - STA_PPSFREQ 0x0002 enable PPS freq discipline (r/w) - STA_PPSTIME 0x0004 enable PPS time discipline (r/w) - STA_INS 0x0010 insert leap (r/w) - STA_DEL 0x0020 delete leap (r/w) - STA_UNSYNC 0x0040 clock unsynchronized (r/w) - STA_PPSSIGNAL 0x0100 PPS signal present (r) - STA_PPSJITTER 0x0200 PPS signal jitter exceeded (r) - STA_PPSWANDER 0x0400 PPS signal wander exceeded (r) - STA_PPSERROR 0x0800 PPS signal calibration error (r) - STA_CLOCKERR 0x1000 clock hardware fault (r) - - The interpretation of these bits is as follows: - - STA_PLL set/cleared by the caller to enable PLL updates - - STA_PPSFREQ set/cleared by the caller to enable PPS frequency - discipline - - STA_PPSTIME set/cleared by the caller to enable PPS time - discipline - - STA_INS set by the caller to insert a leap second at the end - of the current day; cleared by the caller after the - event - - STA_DEL set by the caller to delete a leap second at the end - of the current day; cleared by the caller after the - event - - STA_UNSYNC set/cleared by the caller to indicate clock - unsynchronized (e.g., when no peers are reachable) - - STA_PPSSIGNAL set/cleared by the hardpps() fragment to indicate - PPS signal present - - STA_PPSJITTER set/cleared by the hardpps() fragment to indicates - PPS signal jitter exceeded - - STA_PPSWANDER set/cleared by the hardpps() fragment to indicates - PPS signal wander exceeded - - STA_PPSERROR set/cleared by the hardpps() fragment to indicates - PPS signal calibration error - - STA_CLOCKERR set/cleared by the external hardware clock driver to - indicate hardware fault - - An error condition is raised when (a) either STA_UNSYNC or - STA_CLOCKERR is set (loss of synchronization), (b) STA_PPSFREQ or - STA_PPSTIME is set and STA_PPSSIGNAL is clear (loss of PPS signal), - (c) STA_PPSTIME and STA_PPSJITTER are both set (jitter exceeded), - (d) STA_PPSFREQ is set and either STA_PPSWANDER or STA_PPSERROR is - set (wander exceeded). An error condition results in a system call - return code of TIME_ERROR. - -constant (rw) - - If selected, this member replaces the value of the time_constant - kernel variable. The value must be between zero and MAXTC (6) - defined in the timex.h header file. - - The time_constant variable determines the bandwidth or "stiffness" - of the PLL. The value is used as a shift between zero and MAXTC - (6), with the effective PLL time constant equal to a multiple of (1 - << time_constant), in seconds. For room-temperature quartz - oscillators, the recommended default value is 2, which corresponds - to a PLL time constant of about 900 s and a maximum update interval - of about 64 s. The maximum update interval scales directly with the - time constant, so that at the maximum time constant of 6, the - update interval can be as large as 1024 s. - - Values of time_constant between zero and 2 can be used if quick - convergence is necessary; values between 2 and 6 can be used to - reduce network load, but at a modest cost in accuracy. Values above - 6 are appropriate only if an precision external oscillator is - present. - -precision (ro) - - This is the current value of the time_precision kernel variable in - microseconds. - - The time_precision variable represents the maximum error in reading - the system clock, in microseconds. It is usually based on the - number of microseconds between timer interrupts (tick), 10000 us - for the SunOS kernel, 3906 us for the Ultrix kernel, 976 us for the - OSF/1 kernel. However, in cases where the time can be interpolated - between timer interrupts with microsecond resolution, such as in - the stock SunOS kernel and modified Ultrix and OSF/1 kernels, the - precision is specified as 1 us. In cases where a PPS signal or - external oscillator is available, the precision can depend on the - operating condition of the signal or oscillator. This variable is - determined by the kernel for use by the synchronization daemon, but - is otherwise not used by the kernel. - -tolerance (ro) - - This is the current value of the time_tolerance kernel variable. - The value is in ppm, with the integer part in the high order 16 - bits and fraction in the low order 16 bits. - - The time_tolerance variable represents the maximum frequency error - in ppm of the particular CPU clock oscillator and is a property of - the hardware; however, in principle it could change as result of - the presence of external discipline signals, for instance. - - The recommended value for time_tolerance MAXFREQ (200) ppm is - appropriate for room-temperature quartz oscillators used in typical - workstations. However, it can change due to the operating condition - of the PPS signal and/or external oscillator. With either the PPS - signal or external oscillator, the recommended value for MAXFREQ is - 100 ppm. - -The following members are defined only if the PPS_SYNC option is -specified in the kernel configuration file. These members are useful -primarily as a monitoring and evalutation tool. These variables can be -written only by the kernel. - -ppsfreq (ro) - - This is the current value of the pps_freq kernel variable, which is - the CPU clock oscillator frequency offset relative to the PPS - discipline signal. The value is in ppm, with the integer part in - the high order 16 bits and fraction in the low order 16 bits. - -jitter (ro) - - This is the current value of the pps_jitter kernel variable, which - is the average PPS time dispersion measured by the time-offset - median filter, in microseconds. - -shift (ro) - - This is the current value of the pps_shift kernel variable, which - determines the duration of the calibration interval as the value of - 1 << pps_shift, in seconds. -stabil (ro) - - This is the current value of the pps_stabil kernel variable, which - is the average PPS frequency dispersion measured by the frequency- - offset median filter. The value is in ppm, with the integer part in - the high order 16 bits and fraction in the low order 16 bits. - -jitcnt (ro) - - This is the current value of the pps_jitcnt kernel variable, counts - the number of PPS signals where the average jitter exceeds the - threshold MAXTIME (200 us). - -calcnt (ro) - - This is the current value of the pps_calcnt kernel variable, which - counts the number of frequency calibration intervals. The duration - of these intervals can range from 4 to 256 seconds, as determined - by the pps_shift kernel variable. - -errcnt (ro) - - This is the current value of the pps_errcnt kernel variable, which - counts the number of frequency calibration cycles where (a) the - apparent frequency offset is greater than MAXFREQ (100 ppm) or (b) - the interval jitter exceeds tick * 2. - -stbcnt (ro) - - This is the current value of the pps_discnt kernel variable, which - counts the number of calibration intervals where the average - stability exceeds the threshold MAXFREQ / 4 (25 ppm). - -7. References - -[MIL91] Mills, D.L. Internet time synchronization: the Network Time -Protocol, IEEE Trans. Communications COM-39, 10 (October 1991), -1482-1493. Also in: Yang, Z., and T.A. Marsland (Eds.). Global -States and Time in Distributed Systems, IEEE Press, Los Alamitos, -CA, 91-102. - -[MIL92a] Mills, D.L. Network Time Protocol (Version 3) specification, -implementation and analysis, RFC 1305, University of Delaware, March -1992, 113 pp. - -[MIL92b] Mills, D.L. Modelling and analysis of computer network clocks, -Electrical Engineering Department Report 92-5-2, University of Delaware, -May 1992, 29 pp. - -[MIL92c] Mills, D.L. Simple Network Time Protocol (SNTP), RFC 1361, -University of Delaware, August 1992, 10 pp. - -[MIL93] Mills, D.L. Precision synchronizatin of computer network clocks, -Electrical Engineering Department Report 93-11-1, University of -Delaware, November 1993, 66 pp. - -[LEV89] Levine, J., M. Weiss, D. Davis, D. Allan, and D. Sullivan. The -NIST automated computer time service. J. Research National Institute of -Standards and Technology 94, 5 (September-October 1989), 311-321. - -David L. Mills <mills@udel.edu> -Electrical Engineering Department -University of Delaware -Newark, DE 19716 -302 831 8247 fax 302 831 4316 -3 April 1994 diff --git a/usr.sbin/xntpd/doc/README.magic b/usr.sbin/xntpd/doc/README.magic deleted file mode 100644 index f473a9220c44..000000000000 --- a/usr.sbin/xntpd/doc/README.magic +++ /dev/null @@ -1,346 +0,0 @@ - Magic Tricks for Precision Timekeeping - - Revised 19 September 1993 - -Note: This information file is included in the NTP Version 3 -distribution (xntp3.tar.Z) as the file README.magic. This distribution -can be obtained via anonymous ftp from louie.udel.edu in the directory -pub/ntp. - -1. Introduction - -It most cases it is possible using NTP to synchronize a number of hosts -on an Ethernet or moderately loaded T1 network to a radio clock within a -few tens of milliseconds with no particular care in selecting the radio -clock or configuring the servers on the network. This may be adequate -for the majority of applications; however, modern workstations and high -speed networks can do much better than that, generally to within some -fraction of a millisecond, by using special care in the design of the -hardware and software interfaces. - -The timekeeping accuracy of a NTP-synchronized host depends on two -quantities: the delay due to hardware and software processing and the -accumulated jitter due to such things as clock reading precision and -varying latencies in hardware and software queuing. Processing delays -directly affect the timekeeping accuracy, unless minimized by systematic -analysis and adjustment. Jitter, on the other hand, can be essentially -removed, as long as the statistical properties are unbiased, by the low- -pass filtering of the phase-lock loop incorporated in the NTP local -clock model. - -This note discusses issues in the connection of external time sources -such as radio clocks and related timing signals to a primary (stratum-1) -NTP time server. Of principal concern are various techniques that can be -utilized to improve the accuracy and precision of the time accuracy and -frequency stability. Radio clocks are most often connected to a time -server using a serial asynchronous port. Much of the discussion in this -memorandum has to do with ways in which the delay incurred in this type -of connection can be controlled and ways in which the jitter due to -various causes can be minimized. - -However, there are ways other than serial ports to connect a radio -clock, including special purpose hardware devices for some -architectures, and even unusual applications of existing interface -devices, such as the audio codec provided in some systems. Many of these -methods can yield accuracies as good as any attainable with a serial -port. For those radio clocks equipped with an IRIG-B signal output, for -example, a hardware device is available for the Sun SPARCstation; see -the xntpd.8 manual page in the doc directory of the NTP Version 3 -distribution for further information. In addition, it is possible to -decode the IRIG-B signal using the audio codec included in the Sun -SPARCstation and a special kernel driver described in the irig.txt file -in the doc directory of the NTP Version 3 distribution. These devices -will not be discussed further in this memorandum. - -2. Connection via Serial Port - -Most radio clocks produce an ASCII timecode with a precision only to the -millisecond. This results in a maximum peak-to-peak (p-p) jitter in the -clock readings of one millisecond. However, assuming the read requests -are statistically independent of the clock update times, the reading -error is uniformly distributed over the millisecond, so that the average -over a large number of readings will make the clock appear 0.5 ms late. -To compensate for this, it is only necessary to add 0.5 ms to its -reading before further processing by the NTP algorithms. - -Radio clocks are usually connected to the host computer using a serial -port operating at a typical speed of 9600 baud. The on-time reference -epoch for the timecode is usually the start bit of a designated -character, usually <CR>, which is part of the timecode. The UART chip -implementing the serial port most often has a sample clock of eight to -16 times the basic baud rate. Assuming the sample clock starts midway in -the start bit and continues to midway in the first stop bit, this -creates a processing delay of 10.5 baud times, or about 1.1 ms, relative -to the start bit of the character. The jitter contribution is usually no -more than a couple of sample-clock periods, or about 26 usec p-p. This -is small compared to the clock reading jitter and can be ignored. Thus, -the UART delay can be considered constant, so the hardware contribution -to the total mean delay budget is 0.5 + 1.1 = 1.6 ms. - -In some kernel serial port drivers, in particular, the Sun zs driver, -an intentional delay is introduce in input character processing when the -first character is received after an idle period. A batch of characters -is passed to the calling program when either (a) a timeout in the -neighborhood of 10 ms expires or (b) an input buffer fills up. The -intent in this design is to reduce the interrupt load on the processor -by batching the characters where possible. Obviously, this can cause -severe problems for precision timekeeping. It is possible to patch the -zs driver to eliminate the jitter due to this cause; contact the author -for further details. However, there is a better solution which will be -described later in this note. The problem does not appear to be present -in the Serial/Parallel Controller (SPC) for the SBus, which contains -eight serial asynchronous ports along with a parallel port. The -measurements referred to below were made using this controller. - -Good timekeeping depends strongly on the means available to capture an -accurate sample of the local clock or timestamp at the instant the stop -bit of the on-time character is found; therefore, the code path delay -between the character interrupt routine and the first place a timestamp -can be captured is very important, since on some systems such as Sun -SPARCstations, this path can be astonishingly long. The Sun scheduling -mechanisms involve both a hardware interrupt queue and a software -interrupt queue. Entries are made on the hardware queue as the interrupt -is signalled and generally with the lowest latency, estimated at 20-30 -microseconds (usec) for a SPARC 4/65 IPC. Then, after minimal -processing, an entry is made on the software queue for later processing -in order of software interrupt priority. Finally, the software interrupt -unblocks the NTP daemon which calculates the current local clock offset -and introduces corrections as required. - -Opportunities exist to capture timestamps at the hardware interrupt -time, software interrupt time and at the time the NTP daemon is -activated, but these involve various degrees of kernel trespass and -hardware gimmicks. To gain some idea of the severity of the errors -introduced at each of these stages, measurements were made using a Sun -4/65 IPC and a test setup that results in an error between the host -clock and a precision time source (calibrated cesium clock) no greater -than 0.1 ms. The total delay from the on-time epoch to when the NTP -daemon is activated was measured at 8.3 ms in an otherwise idle system, -but increased on rare occasion to over 25 ms under load, even when the -NTP daemon was operated at the highest available software priority -level. Since 1.6 ms of the total delay is due to the hardware, the -remaining 6.7 ms represents the total code path delay accounting for all -software processing from the hardware interrupt to the NTP daemon. - -It is commonly observed that the latency variations (jitter) in typical -real-time applications scale as the processing delay. In the case above, -the ratio of the maximum observed delay (25 ms) to the baseline code -path delay (8.3 ms) is about three. It is natural to expect that this -ratio remain the same or less as the code path between the hardware -interrupt and where the timestamp is captured is reduced. However, in -general this requires trespass on kernel facilities and/or making use of -features not common to all or even most Unix implementations. In order -to assess the cost and benefits of increasingly more aggressive insult -to the hardware and software of the system, it is useful to construct a -budget of the code path delay at each of the timestamp opportunity -times. For instance, on Unix systems which include support for the SIGIO -facility, it is possible to intervene at the time the software interrupt -is serviced. The NTP daemon code uses this facility, when available, to -capture a timestamp and save it along with the data in a buffer for -later processing. This reduces the total code path delay from 6.7 ms to -3.5 ms on an otherwise idle system. This reduction applies to all input -processing, including network interfaces and serial ports. - -3. The CLK Mode - -By far the best place to capture the timestamp is right in the kernel -interrupt routine, but this gerally requires intruding in the code -itself, which can be intricate and architecture dependent. The next best -place is in some routine close to the interrupt routine on the code -path. There are two ways to do this, depending on the ancestry of the -Unix operating system variant. Older systems based primarily on the -original Unix 4.3bsd support what is called a line discipline module, -which is a hunk of code with more-or-less well defined interface -specifications that can get in the way, so to speak, of the code path -between the interrupt routine and the remainder of the serial port -processing. Newer systems based on System V STREAMS can do the same -thing using what is called a streams module. Both approaches are -supported in the NTP Version 3 distribution, as described in the README -files in the kernel directory of the distribution. In either case, -header and source files have to be copied to the kernel build tree and -certain tables in the kernel have to be modified. In neither case, -however, are kernel sources required. In order to take advantage of -this, the clock driver must include code to activate the feature and -extract the timestamp. At present, this support is included in the clock -drivers for the Spectracom WWVB clock (WWVB define), the PSTI/Traconex -WWV/WWVH clock (PST define) and a special one-pulse-per-second (pps) -signal (PPSCLK define) described later. If justified, support can be -easily added to most other clock drivers as well. For future reference, -these modules operating with supported drivers will be called the CLK -support. - -The CLK line discipline and STREAMS modules operate in the same way. -They look for a designated character, usually <CR>, and stuff a Unix -timestamp in the data stream following that character whenever it is -found. Eventually, the data arrive at the particular clock driver -configured in the NTP Version 3 distribution. The driver then uses the -timestamp as a precise reference epoch, subject to the earlier -processing delays and jitter budget, for future reference. In order to -gain some insight as to the effectiveness of this approach, measurements -were made using the same test setup described above. The total delay -from the on-time epoch to the instant when the timestamp is captured was -measured at 3.5 ms. Thus, the code path delay is this value less the -hardware delay 3.5 - 1.6 = 1.9 ms. - -While the improvement in accuracy in the baseline case is significant, -there is another factor, at least in Sun systems, that makes it even -more worthwhile. When processing the code path up to the CLK module, the -priority is apparently higher than for processing beyond it. In case of -heavy CPU activity, this can lead to relatively long tails in the -processing delays for the driver, which of course are avoided by -capturing the timestamp early in the code path. - -4. The PPSCLK Mode - -Many timing receivers can produce a 1-pps signal of considerably better -precision than the ASCII timecode. Using this signal, it is possible to -avoid the 1-ms p-p jitter and 1.6 ms hardware timecode adjustment -entirely. However, a device is required to interface this signal to the -hardware and operating system. In general, this requires some sort of -level converter and pulse generator that can turn the 1-pps signal on- -time transition into a valid character. An example of such a device is -described in the gadget directory of the NTP Version 3 distribution. -Although many different circuit designs could be used as well, this -particular device generates a single 26-usec start bit for each 1-pps -signal on-time transition. This appears to the UART operating at 38.4K -baud as an ASCII DEL (hex FF). - -Now, assuming a serial port can be dedicated to this purpose, a source -of 1-pps character interrupts is available and can be used to provide a -precision reference. The NTP Version 3 daemon can be configured to -utilize this feature by specifying the PPSCLK define, which requires the -CLK module and gadget box described above. The character resulting from -each 1-pps signal on-time transition is intercepted by the CLK module -and a timestamp is inserted in the data stream. An interrupt is created -for the device driver, which reads the timestamp and discards the DEL -character. Since the timestamp is captured at the on-time transition, -the seconds-fraction portion is the offset between the local clock and -the on-time epoch less the UART delay of 273 usec at 38.4K baud. If the -local clock is within +-0.5 second of this epoch, as determined by other -means, the local clock correction is taken as the offset itself, if -between zero and 0.5 s, and the offset minus one second, if between 0.5 -and 1.0 s. In the NTP daemon the resulting correction is first processed -by a multi-stage median/trimmed mean filter to remove residual jitter -and then processed by the usual NTP algorithms. - -The baseline delay between the on-time transition and the timestamp -capture was measured at 400+-10 usec on an otherwise idle test system. -As the UART delay at 38.4K baud is about 270 usec, the difference, 130 -usec, must be due to the hardware interrupt latency plus the time to -call the microtime() routine which actually reads the system clock and -microsecond counter. For these measurements the assembly-coded version -of this routine described in the ppsclock directory of the NTP Version 3 -distribution was used. This routine reduces the time to read the system -clock from 42-85 usec with the native Sun C-coded routine to about 3 -usec using the microtime() assembly-coded routine and can be ignored. -Thus, the 130 usec must be accounted for in interrupt service, register -window, context switching, streams operations and measurement -uncertainty, which is probably not unreasonable. The reason for the -difference between the this figure and the previously calculated value -of 1.9 ms for the CLK module and serial ASCII timecode is probably due -to the fact that all STREAMS modules other than the CLK module were -removed, since the serial port is not used for ordinary ASCII data. - -An interesting feature of this approach is that the 1-pps signal is not -necessarily associated with any particular radio clock and, indeed, -there may be no such clock at all. Some precision timekeeping equipment, -such as cesium clocks, VLF receivers and LORAN-C timing receivers -produce only a precision 1-pps signal and rely on other mechanisms to -resolve the second of the day and day of the year. It is possible for an -NTP-synchronized host to derive the latter information using other NTP -peers, presumably properly synchronized within +-0.5 second, and to -remove residual jitter using the 1-pps signal. This makes it quite -practical to deliver precision time to local clients when the subnet -paths to remote primary servers are heavily congested. In extreme cases -like this, it has been found useful to increase the tracking aperture -from +-128 ms to as high as +-512 ms. - -In the current implementation the radio timecode and 1-pps signal are -separately processed. The timecode capture and CLK support, if provided -by the radio driver, operate the same way whether or not the PPSCLK -support is enabled. If the local clock is reliably synchronized within -+-0.5 s and the 1-pps signal has been valid for some number of seconds, -its offset rather than whatever synchronization source has been selected -is used instead. However, while a this procedure delivers a new offset -estimate every second, the local clock is updated only as each valid -update is computed for the peer selected as the source of -synchronization. - -However, there is a hazard to the use of the 1-pps signal in this way if -the radio generating the 1-pps signal misbehaves or loses -synchronization with its transmitter. In such a case the radio might -indicate the error, but the system has no way to associate the error -with the 1-pps signal. To deal with this problem the prefer parameter -described in the xntpd.8 man page in the doc directory of the NTP -Version 3 distribution can be used both to cause the clock selection -algorithm to choose a preferred peer, all other things being equal, as -well as associate the error indications in such a way that the 1-pps -signal will be disregarded if the peer stops providing valid updates, -such as would occur in an error condition. The prefer parameter can be -used in other situations as well when preference is to be given a -particular source of synchronization. - -5. The PPS Mode - -For the ultimate accuracy and lowest jitter, it would be best to -eliminate the UART and capture the 1-pps on-time transition directly -using an appropriate interface. This is in fact possible using a -modified serial port driver and data lead in the serial port interface -cable. In this scheme, described in detail in the ppsclock directory of -the NTP Version 3 distribution, the 1-pps source is connected via the -previously described gadget box to the carrier-detect lead of a serial -port. Happily, this can be the same port used for a radio clock, for -example, or another unrelated serial device. The scheme, referred to -subsequently as the PPS mode, is specific to the SunOS 4.1.x kernel and -requires a special STREAMS module. Instructions on how to build the -kernel are also included in that directory. - -Except for special-purpose interface modules, such as the KSI/Odetics -TPRO IRIG-B decoder and the modified audio driver for the IRIG-B signal -mentioned previously, the PPS mode provides the most accurate and -precise timestamp available. There is essentially no latency and the -timestamp is captured within 20-30 usec of the on-time epoch. - -The PPS mode requires the PPSPPS define and one of the radio clock -serial ports to be selected as the PPS interface. This is the port which -handles the 1-pps signal; however, the signal path has nothing to do -with the ordinary serial data path; the two signals are not related, -other than by the need to activate the PPS mode and pass the file -descriptor to a common processing routine. Thus, for the port to be -selected for the PPS function, the define for the associated radio clock -needs to have a PPS suffix. In case of multiple radio clocks on a single -time server, the PPS suffix is necessary on only one of them; more than -one PPS suffix would be an error. - -The PPS mode works just like the CLK mode in the treatment of the prefer -parameter and indicated peer errors. As in the CLK mode, only the offset -within the second is used and only when the offset is less than +-0.5 s. -However, the precision of the clock adjustments is usually so fine that -the error budget is dominated by the inherent short-term stability of -typical computer local clock oscillators. Therefore, it is advisable to -reduce the poll interval for the preferred peer from the default 64 s to -something less, like 16 s. This is done using the minpoll and maxpoll -parameters of the peer or server command associated with the clock. -These parameters take as arguments a power of 2, in seconds, which -becomes the poll interval and, indirectly, affects the bandwidth of the -tracking loop. - -6. Results and Conclusions - -It is clear from the above that substantial improvements in timekeeping -accuracy are possible with varying degrees of hardware and software -intrusion. While the ultimate accuracy depends on the jitter and wander -characteristics of the computer local oscillator, it is possible to -reduce jitter to a negligible degree simply by processing with the NTP -phase-lock loop and local clock algorithms. The residual jitter using -the PPS mode on a Sun4 IPC is typically in the 40-100 usec range, while -the wander is rarely more than twice that under typical environmental -room conditions. - -David L. Mills <mills@udel.edu> -Electrical Engineering Department -University of Delaware -Newark, DE 19716 -302 831 8247 fax 302 831 4316 - -25 August 1993 diff --git a/usr.sbin/xntpd/doc/README.refclock b/usr.sbin/xntpd/doc/README.refclock deleted file mode 100644 index 8c6c228f3d5a..000000000000 --- a/usr.sbin/xntpd/doc/README.refclock +++ /dev/null @@ -1,1421 +0,0 @@ - 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) - - 127.127.8.40-43 16 - - RAW DCF77 100/200ms pulses (Boeder DCF77 receiver / 5ms) - - 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 diff --git a/usr.sbin/xntpd/doc/UofT b/usr.sbin/xntpd/doc/UofT deleted file mode 100644 index 54420d5f5252..000000000000 --- a/usr.sbin/xntpd/doc/UofT +++ /dev/null @@ -1,146 +0,0 @@ -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 diff --git a/usr.sbin/xntpd/doc/acts.c b/usr.sbin/xntpd/doc/acts.c deleted file mode 100644 index 7d3733b477d1..000000000000 --- a/usr.sbin/xntpd/doc/acts.c +++ /dev/null @@ -1,878 +0,0 @@ -/*
- * refclock_acts - clock driver for the NIST Automated Computer Time
- * Service aka Amalgamated Containerized Trash Service (ACTS)
- */
-#if defined(REFCLOCK) && defined(ACTS)
-
-#include <stdio.h>
-#include <ctype.h>
-#include <sys/time.h>
-
-#include "ntpd.h"
-#include "ntp_io.h"
-#include "ntp_unixtime.h"
-#include "ntp_refclock.h"
-#include "ntp_stdlib.h"
-
-/*
- * 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 is
- * designed primarily for use as a backup 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 a residence telephone in Newark, DE, costs between 14
- * and 27 cents, depending on time of day, and from a campus telephone
- * between 3 and 4 cents, although it is not clear what carrier and time
- * of day discounts apply in this case. 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 two modes, as determined by the
- * mode parameter in the server configuration command. In mode 0 the
- * driver operates continuously at intervals determined by the fudge
- * time1 parameter, as described above. In mode 1 the driver is enabled
- * only when no other sources of synchronization are available and when
- * we have gone more than MAXOUTAGE (3600 s) since last synchronized by
- * other sources of synchronization.
- *
- * 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 modem setup string is hard-coded in
- * the driver and may require changes for nonstandard modems or special
- * circumstances.
- *
- * Further information can be found in the README.refclock file in the
- * xntp3 distribution.
- *
- * 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 AUTO 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 AUTO mode) if all other synchronization sources are lost.
- * In either AUTO 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.
- */
-
-/*
- * DESCRIPTION OF THE AUTOMATED COMPUTER TELEPHONE SERVICE (ACTS)
- * (reformatted from ACTS on-line computer help information)
- *
- * The following is transmitted (at 1200 baud) following completion of
- * the telephone connection.
- *
- * National Institute of Standards and Technology
- * Telephone Time Service, Generator 3B
- * Enter question mark "?" for HELP
- * D L D
- * MJD YR MO DA H M S ST S UT1 msADV <OTM>
- * 47999 90-04-18 21:39:15 50 0 +.1 045.0 UTC(NIST) *
- * 47999 90-04-18 21:39:16 50 0 +.1 045.0 UTC(NIST) *
- * 47999 90-04-18 21:39:17 50 0 +.1 045.0 UTC(NIST) *
- * 47999 90-04-18 21:39:18 50 0 +.1 045.0 UTC(NIST) *
- * 47999 90-04-18 21:39:19 50 0 +.1 037.6 UTC(NIST) #
- * 47999 90-04-18 21:39:20 50 0 +.1 037.6 UTC(NIST) #
- * etc..etc...etc.......
- *
- * UTC = Universal Time Coordinated, the official world time referred to
- * the zero meridian.
- *
- * DST Daylight savings time characters, valid for the continental
- * U.S., are set as follows:
- *
- * 00 We are on standard time (ST).
- * 01-49 Now on DST, go to ST when your local time is 2:00 am and
- * the count is 01. The count is decremented daily at 00
- * (UTC).
- * 50 We are on DST.
- * 51-99 Now on ST, go to DST when your local time is 2:00 am and
- * the count is 51. The count is decremented daily at 00
- * (UTC).
- *
- * The two DST characters provide up to 48 days advance notice of a
- * change in time. The count remains at 00 or 50 at other times.
- *
- * LS Leap second flag is set to "1" to indicate that a leap second is
- * to be added as 23:59:60 (UTC) on the last day of the current UTC
- * month. The LS flag will be reset to "0" starting with 23:59:60
- * (UTC). The flag will remain on for the entire month before the
- * second is added. Leap seconds are added as needed at the end of
- * any month. Usually June and/or December are chosen.
- *
- * The leap second flag will be set to a "2" to indicate that a
- * leap second is to be deleted at 23:59:58--00:00:00 on the last
- * day of the current month. (This latter provision is included per
- * international recommendation, however it is not likely to be
- * required in the near future.)
- *
- * DUT1 Approximate difference between earth rotation time (UT1) and
- * UTC, in steps of 0.1 second: DUT1 = UT1 - UTC.
- *
- * MJD Modified Julian Date, often used to tag certain scientific data.
- *
- * The full time format is sent at 1200 baud, 8 bit, 1 stop, no parity.
- * The format at 300 Baud is also 8 bit, 1 stop, no parity. At 300 Baud
- * the MJD and DUT1 values are deleted and the time is transmitted only
- * on even seconds.
- *
- * Maximum on line time will be 56 seconds. If all lines are busy at any
- * time, the oldest call will be terminated if it has been on line more
- * than 28 seconds, otherwise, the call that first reaches 28 seconds
- * will be terminated.
- *
- * Current time is valid at the "on-time" marker (OTM), either "*" or
- * "#". The nominal on-time marker (*) will be transmitted 45 ms early
- * to account for the 8 ms required to send 1 character at 1200 Baud,
- * plus an additional 7 ms for delay from NIST to the user, and
- * approximately 30 ms "scrambler" delay inherent in 1200 Baud modems.
- * If the caller echoes all characters, NIST will measure the round trip
- * delay and advance the on-time marker so that the midpoint of the stop
- * bit arrives at the user on time. The amount of msADV will reflect the
- * actual required advance in milliseconds and the OTM will be a "#".
- *
- * (The NIST system requires 4 or 5 consecutive delay measurements which
- * are consistent before switching from "*" to "#". If the user has a
- * 1200 Baud modem with the same internal delay as that used by NIST,
- * then the "#" OTM should arrive at the user within +-2 ms of the
- * correct time.
- *
- * However, NIST has studied different brands of 1200 Baud modems and
- * found internal delays from 24 ms to 40 ms and offsets of the "#" OTM
- * of +-10 ms. For many computer users, +-10 ms accuracy should be more
- * than adequate since many computer internal clocks can only be set
- * with granularity of 20 to 50 ms. In any case, the repeatability of
- * the offset for the "#" OTM should be within +-2 ms, if the dial-up
- * path is reciprocal and the user doesn't change the brand or model of
- * modem used.
- *
- * This should be true even if the dial-up path on one day is a land-
- * line of less than 40 ms (one way) and on the next day is a satellite
- * link of 260 to 300 ms. In the rare event that the path is one way by
- * satellite and the other way by land line with a round trip
- * measurement in the range of 90 to 260 ms, the OTM will remain a "*"
- * indicating 45 ms advance.
- *
- * For user comments write:
- * NIST-ACTS
- * Time and Frequency Division
- * Mail Stop 847
- * 325 Broadway
- * Boulder, CO 80303
- *
- * Software for setting (PC)DOS compatable machines is available on a
- * 360-kbyte diskette for $35.00 from: NIST Office of Standard Reference
- * Materials B311-Chemistry Bldg, NIST, Gaithersburg, MD, 20899, (301)
- * 975-6776
- */
-
-/*
- * Interface definitions
- */
-#define DEVICE "/dev/acts%d" /* device name and unit */
-#define SPEED232 B1200 /* uart speed (1200 cowardly baud) */
-#define PRECISION (-10) /* precision assumed (about 1 ms) */
-#define REFID "ACTS" /* reference ID */
-#define DESCRIPTION "NIST Automated Computer Time Service" /* WRU */
-
-#define MODE_AUTO 0 /* automatic mode */
-#define MODE_BACKUP 1 /* backup mode */
-#define MODE_MANUAL 2 /* manual mode */
-
-#define NSAMPLES 3 /* stages of median filter */
-#define MSGCNT 10 /* we need this many ACTS messages */
-#define SMAX 80 /* max token string length */
-#define LENCODE 50 /* length of valid timecode string */
-#define ACTS_MINPOLL 10 /* log2 min poll interval (1024 s) */
-#define ACTS_MAXPOLL 14 /* log2 max poll interval (16384 s) */
-#define MAXOUTAGE 3600 /* max outage before ACTS kicks in (s) */
-
-/*
- * Modem control strings. These may have to be changed for some modems.
- *
- * AT command prefix
- * B1 initiate call negotiation using Bell 212A
- * &C1 enable carrier detect
- * &D2 hang up and return to command mode on DTR transition
- * E0 modem command echo disabled
- * l1 set modem speaker volume to low level
- * M1 speaker enabled untill carrier detect
- * Q0 return result codes
- * V1 return result codes as English words
- */
-#define MODEM_SETUP "ATB1&C1&D2E0L1M1Q0V1" /* modem setup */
-#define MODEM_HANGUP "ATH" /* modem disconnect */
-
-/*
- * Timeouts
- */
-#define IDLE 60 /* idle timeout (s) */
-#define WAIT 2 /* wait timeout (s) */
-#define ANSWER 30 /* answer timeout (s) */
-#define CONNECT 10 /* connect timeout (s) */
-#define TIMECODE 15 /* timecode timeout (s) */
-
-/*
- * Imported from ntp_timer module
- */
-extern u_long current_time; /* current time (s) */
-extern u_long last_time; /* last clock update time (s) */
-extern struct event timerqueue[]; /* inner space */
-
-/*
- * Imported from ntpd module
- */
-extern int debug; /* global debug flag */
-
-/*
- * Imported from ntp_config module
- */
-extern char sys_phone[][MAXDIAL]; /* modem dial strings */
-
-/*
- * Imported from ntp_proto module
- */
-extern struct peer *sys_peer; /* who is running the show */
-extern u_char sys_poll; /* log2 of system poll interval */
-extern struct peer *sys_peer; /* system peer structure pointer */
-
-/*
- * Tables to compute the ddd of year form icky dd/mm timecode. Viva la
- * leap.
- */
-static day1tab[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
-static day2tab[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
-
-/*
- * Unit control structure
- */
-struct actsunit {
- struct event timer; /* timeout timer */
- int pollcnt; /* poll message counter */
-
- int state; /* the first one was Delaware */
- int run; /* call program run switch */
- int msgcnt; /* count of ACTS messages received */
- long redial; /* interval to next automatic call */
- double msADV; /* millisecond advance of last message */
-};
-
-/*
- * Function prototypes
- */
-static int acts_start P((int, struct peer *));
-static void acts_shutdown P((int, struct peer *));
-static void acts_receive P((struct recvbuf *));
-static void acts_poll P((int, struct peer *));
-static void acts_timeout P((struct peer *));
-static void acts_disc P((struct peer *));
-static int acts_write P((struct peer *, char *));
-
-/*
- * Transfer vector
- */
-struct refclock refclock_acts = {
- acts_start, /* start up driver */
- acts_shutdown, /* shut down driver */
- acts_poll, /* transmit poll message */
- noentry, /* not used (old acts_control) */
- noentry, /* not used (old acts_init) */
- noentry, /* not used (old acts_buginfo) */
- NOFLAGS /* not used */
-};
-
-
-/*
- * acts_start - open the devices and initialize data for processing
- */
-static int
-acts_start(unit, peer)
- int unit;
- struct peer *peer;
-{
- register struct actsunit *up;
- struct refclockproc *pp;
- int fd;
- char device[20];
- int dtr = TIOCM_DTR;
-
- /*
- * Open serial port. Use ACTS line discipline, if available. It
- * pumps a timestamp into the data stream at every on-time
- * character '*' found. Note: the port must have modem control
- * or deep pockets for the phone bill. HP-UX 9.03 users should
- * have very deep pockets.
- */
- (void)sprintf(device, DEVICE, unit);
- if (!(fd = refclock_open(device, SPEED232, LDISC_ACTS)))
- return (0);
- if (ioctl(fd, TIOCMBIC, (char *)&dtr) < 0) {
- syslog(LOG_ERR, "clock %s ACTS no modem control",
- ntoa(&peer->srcadr));
- return (0);
- }
-
- /*
- * Allocate and initialize unit structure
- */
- if (!(up = (struct actsunit *)
- emalloc(sizeof(struct actsunit)))) {
- (void) close(fd);
- return (0);
- }
- memset((char *)up, 0, sizeof(struct actsunit));
- pp = peer->procptr;
- pp->io.clock_recv = acts_receive;
- pp->io.srcclock = (caddr_t)peer;
- pp->io.datalen = 0;
- pp->io.fd = fd;
- if (!io_addclock(&pp->io)) {
- (void) close(fd);
- free(up);
- return (0);
- }
- pp->unitptr = (caddr_t)up;
-
- /*
- * Initialize miscellaneous variables
- */
- peer->precision = PRECISION;
- pp->clockdesc = DESCRIPTION;
- memcpy((char *)&pp->refid, REFID, 4);
- peer->minpoll = ACTS_MINPOLL;
- peer->maxpoll = ACTS_MAXPOLL;
-
- /*
- * Initialize modem and kill DTR. We skedaddle if this comes
- * bum.
- */
- if (!acts_write(peer, MODEM_SETUP)) {
- (void) close(fd);
- free(up);
- return (0);
- }
-
- /*
- * Set up the driver timeout
- */
- up->timer.peer = (struct peer *)peer;
- up->timer.event_handler = acts_timeout;
- up->timer.event_time = current_time + WAIT;
- TIMER_INSERT(timerqueue, &up->timer);
- return (1);
-}
-
-
-/*
- * acts_shutdown - shut down the clock
- */
-static void
-acts_shutdown(unit, peer)
- int unit;
- struct peer *peer;
-{
- register struct actsunit *up;
- struct refclockproc *pp;
-
- pp = peer->procptr;
- up = (struct actsunit *)pp->unitptr;
- TIMER_DEQUEUE(&up->timer);
- io_closeclock(&pp->io);
- free(up);
-}
-
-
-/*
- * acts_receive - receive data from the serial interface
- */
-static void
-acts_receive(rbufp)
- struct recvbuf *rbufp;
-{
- register struct actsunit *up;
- struct refclockproc *pp;
- struct peer *peer;
- char str[SMAX];
- int i;
- l_fp tstmp;
- u_fp disp;
- char hangup = '%'; /* ACTS hangup */
- int day; /* day of the month */
- int month; /* month of the year */
- u_long mjd; /* Modified Julian Day */
- u_int dst; /* daylight/standard time indicator */
- u_int leap; /* leap-second indicator */
- double dut1; /* DUT adjustment */
- double msADV; /* ACTS transmit advance (ms) */
- char utc[10]; /* this is NIST and you're not */
- char flag; /* calibration flag */
-
- /*
- * Initialize pointers and read the timecode and timestamp. If
- * the OK modem status code, leave it where folks can find it.
- */
- peer = (struct peer *)rbufp->recv_srcclock;
- pp = peer->procptr;
- up = (struct actsunit *)pp->unitptr;
- pp->lencode = refclock_gtlin(rbufp, pp->lastcode, BMAX,
- &pp->lastrec);
- if (pp->lencode == 0) {
- if (strcmp(pp->lastcode, "OK") == 0)
- pp->lencode = 2;
- return;
- }
-#ifdef DEBUG
- if (debug)
- printf("acts: timecode %d %s\n", pp->lencode,
- pp->lastcode);
-#endif
-
- switch (up->state) {
-
- case 0:
-
- /*
- * State 0. We are not expecting anything. Probably
- * modem disconnect noise. Go back to sleep.
- */
- return;
-
- case 1:
-
- /*
- * State 1. We are waiting for the call to be answered.
- * All we care about here is CONNECT as the first token
- * in the string. If the modem signals BUSY, ERROR, NO
- * ANSWER, NO CARRIER or NO DIALTONE, we immediately
- * hang up the phone. If CONNECT doesn't happen after
- * ANSWER seconds, hang up the phone. If everything is
- * okay, start the connect timeout and slide into state
- * 2.
- */
- (void)strncpy(str, strtok(pp->lastcode, " "), SMAX);
- if (strcmp(str, "BUSY") == 0 || strcmp(str, "ERROR") ==
- 0 || strcmp(str, "NO") == 0) {
- TIMER_DEQUEUE(&up->timer);
- syslog(LOG_NOTICE,
- "clock %s ACTS modem status %s",
- ntoa(&peer->srcadr), pp->lastcode);
- acts_disc(peer);
- } else if (strcmp(str, "CONNECT") == 0) {
- TIMER_DEQUEUE(&up->timer);
- up->timer.event_time = current_time + CONNECT;
- TIMER_INSERT(timerqueue, &up->timer);
- up->msgcnt = 0;
- up->state++;
- }
- return;
-
- case 2:
-
- /*
- * State 2. The call has been answered and we are
- * waiting for the first ACTS message. If this doesn't
- * happen within the timecode timeout, hang up the
- * phone. We probably got a wrong number or ACTS is
- * down.
- */
- TIMER_DEQUEUE(&up->timer);
- up->timer.event_time = current_time + TIMECODE;
- TIMER_INSERT(timerqueue, &up->timer);
- up->state++;
- }
-
- /*
- * Real yucky things here. Ignore everything except timecode
- * messages, as determined by the message length. We told the
- * terminal routines to end the line with '*' and the line
- * discipline to strike a timestamp on that character. However,
- * when the ACTS echo-delay scheme works, the '*' eventually
- * becomes a '#'. In this case the message is ended by the <CR>
- * that comes about 200 ms after the '#' and the '#' cannot be
- * echoed at the proper time. But, this may not be a lose, since
- * we already have good data from prior messages and only need
- * the millisecond advance calculated by ACTS. So, if the
- * message is long enough and has an on-time character at the
- * right place, we consider the message (but not neccesarily the
- * timestmap) to be valid.
- */
- if (pp->lencode != LENCODE)
- return;
-
- /*
- * We apparently have a valid timecode message, so dismember it
- * with sscan(). This routine does a good job in spotting syntax
- * errors without becoming overly pedantic.
- *
- * D L D
- * MJD YR MO DA H M S ST S UT1 msADV OTM
- * 47222 88-03-02 21:39:15 83 0 +.3 045.0 UTC(NBS) *
- */
- if (sscanf(pp->lastcode,
- "%5ld %2d-%2d-%2d %2d:%2d:%2d %2d %1d %3lf %5lf %s %c",
- &mjd, &pp->year, &month, &day, &pp->hour, &pp->minute,
- &pp->second, &dst, &leap, &dut1, &msADV, utc, &flag) != 13) {
- refclock_report(peer, CEVNT_BADREPLY);
- return;
- }
-
- /*
- * Some modems can't be trusted (the Practical Peripherals
- * 9600SA comes to mind) and, even if they manage to unstick
- * ACTS, the millisecond advance is wrong, so we use CLK_FLAG2
- * to disable echoes, if neccessary.
- */
- if ((flag == '*' || flag == '#') && !(pp->sloppyclockflag &
- CLK_FLAG2))
- (void)write(pp->io.fd, &flag, 1);
-
- /*
- * Yes, I know this code incorrectly thinks that 2000 is a leap
- * year. The ACTS timecode format croaks then anyway. Life is
- * short. Would only the timecode mavens resist the urge to
- * express months of the year and days of the month in favor of
- * days of the year.
- */
- if (month < 1 || month > 12 || day < 1) {
- refclock_report(peer, CEVNT_BADTIME);
- return;
- }
- if (pp->year % 4) {
- if (day > day1tab[month - 1]) {
- refclock_report(peer, CEVNT_BADTIME);
- return;
- }
- for (i = 0; i < month - 1; i++)
- day += day1tab[i];
- } else {
- if (day > day2tab[month - 1]) {
- refclock_report(peer, CEVNT_BADTIME);
- return;
- }
- for (i = 0; i < month - 1; i++)
- day += day2tab[i];
- }
- pp->day = day;
- if (leap == 1)
- pp->leap = LEAP_ADDSECOND;
- else if (pp->leap == 2)
- pp->leap = LEAP_DELSECOND;
- else
- pp->leap = 0;
- pp->lasttime = current_time;
-
- /*
- * Colossal hack here. We process each sample in a trimmed-mean
- * filter and determine the reference clock offset and
- * dispersion. The fudge time1 value is added to each sample as
- * received. If we collect MSGCNT samples before the '#' on-time
- * character, we use the results of the filter as is. If the '#'
- * is found before that, the adjusted msADV is used to correct
- * the propagation delay.
- */
- up->msgcnt++;
- if (flag == '#') {
- L_CLR(&tstmp);
- TVUTOTSF((long)((msADV - up->msADV) * 1000.),
- tstmp.l_uf);
- L_ADD(&pp->offset, &tstmp);
- } else {
- up->msADV = msADV;
- if (!refclock_process(pp, up->msgcnt, up->msgcnt -
- up->msgcnt / 3)) {
- refclock_report(peer, CEVNT_BADTIME);
- return;
- } else if (up->msgcnt < MSGCNT)
- return;
- }
-
- /*
- * We have a filtered sample offset ready for peer processing.
- * We use lastrec as both the reference time and receive time in
- * order to avoid being cute, like setting the reference time
- * later than the receive time, which may cause a paranoid
- * protocol module to chuck out the data. Finaly, we unhook the
- * timeout, arm for the next call, fold the tent and go home.
- * The little dance with the '%' character is an undocumented
- * ACTS feature that hangs up the phone real quick without
- * waiting for carrier loss or long-space disconnect, but we do
- * these clumsy things anyway.
- */
- disp = LFPTOFP(&pp->fudgetime2);
- record_clock_stats(&peer->srcadr, pp->lastcode);
- refclock_receive(peer, &pp->offset, 0, pp->dispersion +
- (u_fp)disp, &pp->lastrec, &pp->lastrec, pp->leap);
- pp->sloppyclockflag &= ~CLK_FLAG1;
- up->pollcnt = 0;
- TIMER_DEQUEUE(&up->timer);
- (void)write(pp->io.fd, &hangup, 1);
- up->state = 0;
- acts_disc(peer);
-}
-
-
-/*
- * acts_poll - called by the transmit routine
- */
-static void
-acts_poll(unit, peer)
- int unit;
- struct peer *peer;
-{
- register struct actsunit *up;
- struct refclockproc *pp;
-
- /*
- * If the driver is running, we set the enable flag (fudge
- * flag1), which causes the driver timeout routine to initiate a
- * call to ACTS. If not, the enable flag can be set using
- * xntpdc. If this is the sustem peer, then follow the system
- * poll interval.
- */
- pp = peer->procptr;
- up = (struct actsunit *)pp->unitptr;
- if (up->run) {
- pp->sloppyclockflag |= CLK_FLAG1;
- if (peer == sys_peer)
- peer->hpoll = sys_poll;
- else
- peer->hpoll = peer->minpoll;
- }
-}
-
-
-/*
- * acts_timeout - called by the timer interrupt
- */
-static void
-acts_timeout(peer)
- struct peer *peer;
-{
- register struct actsunit *up;
- struct refclockproc *pp;
- int dtr = TIOCM_DTR;
-
- /*
- * If a timeout occurs in other than state 0, the call has
- * failed. If in state 0, we just see if there is other work to
- * do.
- */
- pp = peer->procptr;
- up = (struct actsunit *)pp->unitptr;
- if (up->state) {
- acts_disc(peer);
- return;
- }
- switch (peer->ttl) {
-
- /*
- * In manual mode the ACTS calling program is activated
- * by the xntpdc program using the enable flag (fudge
- * flag1), either manually or by a cron job.
- */
- case MODE_MANUAL:
- up->run = 0;
- break;
-
- /*
- * In automatic mode the ACTS calling program runs
- * continuously at intervals determined by the sys_poll
- * variable.
- */
- case MODE_AUTO:
- if (!up->run)
- pp->sloppyclockflag |= CLK_FLAG1;
- up->run = 1;
- break;
-
- /*
- * In backup mode the ACTS calling program is disabled,
- * unless no system peer has been selected for MAXOUTAGE
- * (3600 s). Once enabled, it runs until some other NTP
- * peer shows up.
- */
- case MODE_BACKUP:
- if (!up->run && sys_peer == 0) {
- if (current_time - last_time > MAXOUTAGE) {
- up->run = 1;
- peer->hpoll = peer->minpoll;
- syslog(LOG_NOTICE,
- "clock %s ACTS backup started ",
- ntoa(&peer->srcadr));
- }
- } else if (up->run && sys_peer->refclktype !=
- REFCLK_NIST_ACTS) {
- peer->hpoll = peer->minpoll;
- up->run = 0;
- syslog(LOG_NOTICE,
- "clock %s ACTS backup stopped",
- ntoa(&peer->srcadr));
- }
- break;
-
- default:
- syslog(LOG_NOTICE,
- "clock %s ACTS invalid mode", ntoa(&peer->srcadr));
-
- }
-
- /*
- * The fudge flag1 is used as an enable/disable; if set either
- * by the code or via xntpdc, the ACTS calling program is
- * started; if reset, the phones stop ringing.
- */
- if (!(pp->sloppyclockflag & CLK_FLAG1)) {
- up->pollcnt = 0;
- up->timer.event_time = current_time + IDLE;
- TIMER_INSERT(timerqueue, &up->timer);
- return;
- }
-
- /*
- * Initiate a call to the ACTS service. If we wind up here in
- * other than state 0, a successful call could not be completed
- * within minpoll seconds. We advance to the next modem dial
- * string. If none are left, we log a notice and clear the
- * enable flag. For future enhancement: call the site RP and
- * leave an obscene message in his voicemail.
- */
- if (sys_phone[up->pollcnt][0] == '\0') {
- refclock_report(peer, CEVNT_TIMEOUT);
- syslog(LOG_NOTICE,
- "clock %s ACTS calling program terminated",
- ntoa(&peer->srcadr));
- pp->sloppyclockflag &= ~CLK_FLAG1;
-#ifdef DEBUG
- if (debug)
- printf("acts: calling program terminated\n");
-#endif
- up->pollcnt = 0;
- up->timer.event_time = current_time + IDLE;
- TIMER_INSERT(timerqueue, &up->timer);
- return;
- }
-
- /*
- * Raise DTR, call ACTS and start the answer timeout. We think
- * it strange if the OK status has not been received from the
- * modem, but plow ahead anyway.
- */
- if (strcmp(pp->lastcode, "OK") != 0)
- syslog(LOG_NOTICE, "clock %s ACTS no modem status",
- ntoa(&peer->srcadr));
- (void)ioctl(pp->io.fd, TIOCMBIS, (char *)&dtr);
- (void)acts_write(peer, sys_phone[up->pollcnt]);
- syslog(LOG_NOTICE, "clock %s ACTS calling %s\n",
- ntoa(&peer->srcadr), sys_phone[up->pollcnt]);
- up->state = 1;
- up->pollcnt++;
- pp->polls++;
- up->timer.event_time = current_time + ANSWER;
- TIMER_INSERT(timerqueue, &up->timer);
-}
-
-
-/*
- * acts_disc - disconnect the call and wait for the ruckus to cool
- */
-static void
-acts_disc(peer)
- struct peer *peer;
-{
- register struct actsunit *up;
- struct refclockproc *pp;
- int dtr = TIOCM_DTR;
-
- /*
- * We should never get here other than in state 0, unless a call
- * has timed out. We drop DTR, which will reliably get the modem
- * off the air, even while ACTS is hammering away full tilt.
- */
- pp = peer->procptr;
- up = (struct actsunit *)pp->unitptr;
- (void)ioctl(pp->io.fd, TIOCMBIC, (char *)&dtr);
- if (up->state > 0) {
- up->state = 0;
- syslog(LOG_NOTICE, "clock %s ACTS call failed %d",
- ntoa(&peer->srcadr), up->state);
-#ifdef DEBUG
- if (debug)
- printf("acts: call failed %d\n", up->state);
-#endif
- }
- up->timer.event_time = current_time + WAIT;
- TIMER_INSERT(timerqueue, &up->timer);
-}
-
-
-/*
- * acts_write - write a message to the serial port
- */
-int
-acts_write(peer, str)
- struct peer *peer;
- char *str;
-{
- register struct actsunit *up;
- struct refclockproc *pp;
- int len;
- int code;
- char cr = '\r';
-
- /*
- * Not much to do here, other than send the message, handle
- * debug and report faults.
- */
- pp = peer->procptr;
- up = (struct actsunit *)pp->unitptr;
- len = strlen(str);
-#ifdef DEBUG
- if (debug)
- printf("acts: state %d send %d %s\n", up->state, len,
- str);
-#endif
- code = write(pp->io.fd, str, len) == len;
- code |= write(pp->io.fd, &cr, 1) == 1;
- if (!code)
- refclock_report(peer, CEVNT_FAULT);
- return (code);
-}
-
-#endif
diff --git a/usr.sbin/xntpd/doc/notes.txt b/usr.sbin/xntpd/doc/notes.txt deleted file mode 100644 index 1dd59f25b3ac..000000000000 --- a/usr.sbin/xntpd/doc/notes.txt +++ /dev/null @@ -1,1258 +0,0 @@ - Notes on Xntpd Configuration - - David L. Mills (mills@udel.edu) - University of Delaware - 14 January 1993 - -Introduction - -This document is a collection of notes concerning the use of xntpd and -related programs, and on coping with the Network Time Protocol (NTP) in -general. It is a major rewrite and update of an earlier document written -by Dennis Ferguson of the University of Toronto dated 5 November 1989. -It includes many changes and additions resulting from the NTP Version 3 -specification and new implementation features. It supersedes the earlier -document, which should no longer be used for new configurations. - -Xntpd is a complete implementation of the NTP Version 3 specification as -defined in RFC 1305. It also retains compatibility with both NTP Version -2, as defined in RFC 1119, and NTP Version 1, as defined in RFC 1059, -although this compatibility is sometimes strained and only -semiautomatic. In order to support in principle the ultimate precision -of about 232 picoseconds in the NTP specification, xntpd does no -floating-point arithmetic and instead manipulates the 64-bit NTP -timestamps as unsigned 64-bit integers. Xntpd fully implements NTP -Versions 2 and 3 authentication and a mode-6 control-message facility. -As extensions to the specification, a flexible address-and-mask -restriction facility has been included, along with a private mode-7 -control-message facility used to remotely reconfigure the system and -monitor a considerable amount of internal detail. - -The code is biased towards the needs of a busy time server with -numerous, possibly hundreds, of clients and other servers. Tables are -hashed to allow efficient handling of many associations, though at the -expense of additional overhead when the number of associations is small. -Many fancy features have been included to permit efficient management -and monitoring of a busy primary server, features which are simply -excess baggage for a server on a high stratum client. The code was -written with near demonic attention to details which can affect -precision and as a consequence should be able to make good use of high -performance, special purpose hardware such as precision oscillators and -radio clocks. The present code supports a number of radio clocks, -including those for the WWV, CHU, WWVB, DCF77, GOES and GPS radio and -satellite services. The server methodically avoids the use of Unix- -specific library routines where possible by implementing local versions, -in order to aid in porting the code to perverse Unix and non-Unix -platforms. - -While this implementation slavishly obeys the NTP specification RFC -1305, it has been specifically tuned to achieve the highest accuracy -possible on whatever hardware and operating-system platform is -available. In general, its precision is limited only by that of the -onboard time-of-day clock maintained by the hardware and operating -system, while its stability is limited only by that of the onboard -frequency source, usually an uncompensated crystal oscillator. On modern -RISC-based processors connected directly to radio clocks via serial- -asynchronous interfaces, the accuracy is usually limited by that of the -radio clock and interface to the order of a few milliseconds. The code -includes special features to support a one-pulse-per-second (1-pps) -signal generated by some radio clocks. When used in conjunction with a -suitable hardware level converter, the accuracy can be improved to the -order of 100 microseconds. Further improvement is possible using an -outboard, stabilized frequency source, in which the accuracy and -stability are limited only by the characteristics of that source. - -The xntp3 distribution includes, in addition to the daemon itself -(xntpd), several utility programs, including two remote-monitoring -programs (ntpq, xntpdc), a remote clock-setting program similar to the -Unix rdate program (ntpdate), a traceback utility useful to discover -suitable synchronization sources (ntptrace), and various programs used -to configure the local platform and calibrate the intrinsic errors. NTP -has been ported to a large number of platforms, including most RISC and -CISC workstations and mainframes manufactured today. Example -configuration files for many models of these machines are included in -the xntp3 distribution. While in most cases the standard version of the -implementation runs with no hardware or operating-system modifications, -not all features of the distribution are available on all platforms. For -instance, a special feature allowing Sun 4s to achieve accuracies in the -order of 100 microseconds requires some minor changes and additions to -the kernel and input/output support. - -There are, however, several drawbacks to all of this. Xntpd is very, -very fat. This is rotten if your intended platform for the daemon is -memory-limited. Xntpd uses SIGIO for all input, a facility which appears -to not enjoy universal support and whose use seems to exercise the parts -of your vendors' kernels which are most likely to have been done poorly. -The code is unforgiving in the face of kernel problems which affect -performance, and generally requires that you repair the problems in -order to achieve acceptable performance. The code has a distinctly -experimental flavour and contains features which could charitably be -termed failed experiments, but which have not been hacked out yet. There -is code which has not been thoroughly tested (e.g. leap-second support) -due to the inconvenience of setting up tests. Much was learned from the -addition of support for a variety of radio clocks, with the result that -this support could use some rewriting. - -How NTP Works - -The approach used by NTP to achieve reliable time synchronization from a -set of possibly unreliable remote time servers is somewhat different -than other such protocols. In particular, NTP does not attempt to -synchronize clocks to each other. Rather, each server attempts to -synchronize to UTC (i.e., Universal Coordinated Time) using the best -available source and available transmission paths to that source. This -is a fine point which is worth understanding. A group of NTP- -synchronized clocks may be close to each other in time, but this is not -a consequence of the clocks in the group having synchronized to each -other, but rather because each clock has synchronized closely to UTC via -the best source it has access to. As such, trying to synchronize a set -of clocks to a set of servers whose time is not in mutual agreement may -not result in any sort of useful synchronization of the clocks, even if -you don't care about UTC. NTP operates on the premise that there is one -true standard time, and that if several servers which claim -synchronization to standard time disagree about what that time is, then -one or more of them must be broken. There is no attempt to resolve -differences more gracefully since the premise is that substantial -differences cannot exist. In essence, NTP expects that the time being -distributed from the root of the synchronization subnet will be derived -from some external source of UTC (e.g. a radio clock). This makes it -somewhat inconvenient (though not impossible) to synchronize hosts -together without a reliable source of UTC to synchronize them to. If -your network is isolated and you cannot access other people's servers -across the Internet, a radio clock may make a good investment. - -Time is distributed through a hierarchy of NTP servers, with each server -adopting a "stratum" which indicates how far away from an external -source of UTC it is operating at. Stratum-1 servers, which are at the -top of the pile (or bottom, depending on your point of view), have -access to some external time source, usually a radio clock synchronized -to time signal broadcasts from radio stations which explicitly provide a -standard time service. A stratum-2 server is one which is currently -obtaining time from a stratum-1 server, a stratum-3 server gets its time -from a stratum-2 server, and so on. To avoid long lived synchronization -loops the number of strata is limited to 15. - -Each client in the synchronization subnet (which may also be a server -for other, higher stratum clients) chooses exactly one of the available -servers to synchronize to, usually from among the lowest stratum servers -it has access to. It is thus possible to construct a synchronization -subnet where each server has exactly one source of lower stratum time to -synchronize to. This is, however, not an optimal configuration, for -indeed NTP operates under another premise as well, that each server's -time should be viewed with a certain amount of distrust. NTP really -prefers to have access to several sources of lower stratum time (at -least three) since it can then apply an agreement algorithm to detect -insanity on the part of any one of these. Normally, when all servers are -in agreement, NTP will choose the best of these, where "best" is defined -in terms of lowest stratum, closest (in terms of network delay) and -claimed precision, along with several other considerations. The -implication is that, while one should aim to provide each client with -three or more sources of lower stratum time, several of these will only -be providing backup service and may be of lesser quality in terms of -network delay and stratum (i.e. a same-stratum peer which receives time -from lower stratum sources the local server doesn't access directly can -also provide good backup service). - -Finally, there is the issue of association modes. There are a number of -modes in which NTP servers can associate with each other, with the mode -of each server in the pair indicating the behaviour the other server can -expect from it. In particular, when configuring a server to obtain time -from other servers, there is a choice of two modes which may be -alternatively used. Configuring an association in symmetric-active mode -(usually indicated by a "peer" declaration in configuration files) -indicates to the remote server that one wishes to obtain time from the -remote server and that one is also willing to supply time to the remote -server if need be. This mode is appropriate in configurations involving -a number of redundant time servers interconnected via diverse network -paths, which is presently the case for most stratum-1 and stratum-2 -servers on the Internet today. Configuring an association in client mode -(usually indicated by a "server" declaration in configuration files) -indicates that one wishes to obtain time from the remote server, but that -one is not willing to provide time to the remote server. This mode is -appropriate for file-server and workstation clients that do not provide -synchronization to other local clients. Client mode is also useful for -boot-date-setting programs and the like, which really have no time to -provide and which don't retain state about associations over the longer -term. - -Configuring Your Subnet - -At startup time the xntpd daemon running on a host reads the initial -configuration information from a file, usually /etc/ntp.conf, unless a -different name has been specified at compile time. Putting something in -this file which will enable the host to obtain time from somewhere else -is usually the first big hurdle after installation of the software -itself, which is described in other documents included in the xntp3 -distribution. At its simplest, what you need to do in the configuration -file is declare the servers that the daemon should poll for time -synchronization. In principle, no such list is needed if some other time -server explicitly mentions the host and is willing to provide -synchronization; however, this is considered dangerous, unless the -access control or authentication features (described later) are in use. - -In the case of a workstation operating in an enterprise network for a -public or private organization, there is often an administrative -department that coordinates network services, including NTP. Where -available, the addresses of appropriate servers can be provided by that -department. However, if this infrastructure is not available, it is -necessary to explore some portion of the existing NTP subnet now running -in the Internet. There are at present many thousands of time servers -running NTP in the Internet, a significant number of which are willing -to provide a public time-synchronization service. Some of these are -listed in a file maintained on the Internet host louie.udel.edu -(128.175.1.3) on the path pub/ntp/doc/clock.txt. This file is updated on -a regular basis using information provided voluntarily by various site -administrators. There are other ways to explore the nearby subnet using -the ntptrace and ntpq programs. See the man pages for further -information on these programs. - -It is vital to carefully consider the issues of robustness and -reliability when selecting the sources of synchronization. Normally, not -less than three sources should be available, preferably selected to -avoid common points of failure. It is usually better to choose sources -which are likely to be "close" to you in terms of network topology, -though you shouldn't worry overly about this if you are unable to -determine who is close and who isn't. Normally, it is much more serious -when a server becomes faulty and delivers incorrect time than when it -simply stops operating, since an NTP-synchronized host normally can -coast for hours or even days without its clock accumulating serious -error over one second, for instance. Selecting at least three sources -from different operating administrations, where possible, is the minimum -recommended, although a lesser number could provide acceptable service -with a degraded degree of robustness. - -Normally, it is not considered good practice for a single workstation to -request synchronization from a primary (stratum-1) time server. At -present, these servers provide synchronization for hundreds of clients -in many cases and could, along with the network access paths, become -seriously overloaded if large numbers of workstation clients requested -synchronization directly. Therefore, workstations located in sparsely -populated administrative domains with no local synchronization -infrastructure should request synchronization from nearby stratum-2 -servers instead. In most cases the keepers of those servers listed in -the clock.txt file provide unrestricted access without prior permission; -however, in all cases it is considered polite to notify the -administrator listed in the file upon commencement of regular service. -In all cases the access mode and notification requirements listed in the -file must be respected. - -In the case of a gateway or file server providing service to a -significant number of workstations or file servers in an enterprise -network it is even more important to provide multiple, redundant sources -of synchronization and multiple, diversity-routed, network access paths. -The preferred configuration is at least three administratively -coordinated time servers providing service throughout the administrative -domain including campus networks and subnetworks. Each of these should -obtain service from at least two different outside sources of -synchronization, preferably via different gateways and access paths. -These sources should all operate at the same stratum level, which is one -less than the stratum level to be used by the local time servers -themselves. In addition, each of these time servers should peer with all -of the other time servers in the local administrative domain at the -stratum level used by the local time servers, as well as at least one -(different) outside source at this level. This configuration results in -the use of six outside sources at a lower stratum level (toward the -primary source of synchronization, usually a radio clock), plus three -outside sources at the same stratum level, for a total of nine outside -sources of synchronization. While this may seem excessive, the actual -load on network resources is minimal, since the interval between polling -messages exchanged between peers usually ratchets back to no more than -one message every 17 minutes. - -The stratum level to be used by the local time servers is an engineering -choice. As a matter of policy, and in order to reduce the load on the -primary servers, it is desirable to use the highest stratum consistent -with reliable, accurate time synchronization throughout the -administrative domain. In the case of enterprise networks serving -hundreds or thousands of client file servers and workstations, -conventional practice is to obtain service from stratum-1 primary -servers such as listed in the clock.txt file. When choosing sources away -from the primary sources, the particular synchronization path in use at -any time can be verified using the ntptrace program included in the -xntp3 distribution. It is important to avoid loops and possible common -points of failure when selecting these sources. Note that, while NTP -detects and rejects loops involving neighboring servers, it does not -detect loops involving intervening servers. In the unlikely case that -all primary sources of synchronization are lost throughout the subnet, -the remaining servers on that subnet can form temporary loops and, if -the loss continues for an interval of many hours, the servers will drop -off the subnet and free-run with respect to their internal (disciplined) -timing sources. - -In many cases the purchase of one or more radio clocks is justified, in -which cases good engineering practice is to use the configurations -described above and connect the radio clock to one of the local servers. -This server is then encouraged to participate in a special primary- -server subnetwork in which each radio-equipped server peers with several -other similarly equipped servers. In this way the radio-equipped server -may provide synchronization, as well as receive synchronization, should -the local or remote radio clock(s) fail or become faulty. Xntpd treats -attached radio clock(s) in the same way as other servers and applies the -same criteria and algorithms to the time indications, so can detect when -the radio fails or becomes faulty and switch to alternate sources of -synchronization. It is strongly advised, and in practice for most -primary servers today, to employ the authentication or access-control -features of the xntp3 distribution in order to protect against hostile -penetration and possible destabilization of the time service. - -Using this or similar strategies, the remaining hosts in the same -administrative domain can be synchronized to the three (or more) -selected time servers. Assuming these servers are synchronized directly -to stratum-1 sources and operate normally as stratum-2, the next level -away from the primary source of synchronization, for instance various -campus file servers, will operate at stratum 3 and dependent -workstations at stratum 4. Engineered correctly, such a subnet will -survive all but the most exotic failures or even hostile penetrations of -the various, distributed timekeeping resources. - -The above arrangement should provide very good, robust time service with -a minimum of traffic to distant servers and with manageable loads on the -local servers. While it is theoretically possible to extend the -synchronization subnet to even higher strata, this is seldom justified -and can make the maintenance of configuration files unmanageable. -Serving time to a higher stratum peer is very inexpensive in terms of -the load on the lower stratum server if the latter is located on the -same concatenated LAN. When justified by the accuracy expectations, NTP -can be operated in broadcast mode, so that clients need only listen for -periodic broadcasts and do not need to send anything. - -When planning your network you might, beyond this, keep in mind a few -generic don'ts, in particular: - -1. Don't synchronize a local time server to another peer at the same - stratum, unless the latter is receiving time from lower stratum - sources the former doesn't talk to directly. This minimizes the - occurance of common points of failure, but does not eliminate them - in cases where the usual chain of associations to the primary - sources of synchronization are disrupted due to failures. -2. Don't configure peer associations with higher stratum servers. Let - the higher strata configure lower stratum servers, but not the - reverse. This greatly simplifies configuration file maintenance, - since there is usually much greater configuration churn in the high - stratum clients such as personal workstations. - -3. Don't synchronize more than one time server in a particular - administrative domain to the same time server outside that domain. - Such a practice invites common points of failure, as well as raises - the possibility of massive abuse, should the configuration file be - automatically distributed do a large number of clients. - -There are many useful exceptions to these rules. When in doubt, however, -follow them. - -Dennis Ferguson writes: Note that mention was made of machines with -"good" clocks versus machines with "bad" ones. There are two things that -make a clock good, the precision of the clock (e.g. how many low order -bits in a time value are actually significant) and the frequency of -occurance (or lack thereof) of such things as lost clock interrupts. -Among the most common computers I have observed there to be a fairly -simple algorithm for determining the goodness of its clock. If the -machine is a Vax, it probably has a good clock (the low order bit in the -time is in the microseconds and most of these seem to manage to get -along without losing clock interrupts). If the machine is a Sun 3 it -probably doesn't (the low order clock bit is at the 10 or 20 millisecond -mark and Sun 3s like to lose clock interrupts, particularly if they have -a screen and particularly if they run SunOS 4.0.x). If you have IBM RTs -running AOS 4.3, they have fair clocks (low order clock bit at about a -millisecond and they don't lose clock interrupts, though they do have -trouble with clock rollovers while reading the low order clock bits) but -I recommend them as low stratum NTP servers anyway since they aren't -much use as anything else. Sun 4s running SunOS 4.1.1 make very good -time servers, once some native foolishness mentioned below is -surmounted. [However, it is very important to avoid using the keyboard -firmware, which can cause severe interrupt latencies, in favor of the -software drivers ordinarily used in conjunction with a windowing system. -- DLM] For other machines you are on your own since I don't have enough -data points to venture an opinion. In any event, if at all possible you -should try to use machines with good clocks for the lower strata. - -Configuring Your Server or Client - -As mentioned previously, the configuration file is usually called -/etc/ntp.conf. This is an ASCII file conforming to the usual comment and -whitespace conventions. A working configuration file might look like (In -this and other examples, do not copy this directly.): - - # peer configuration for 128.100.100.7 - # (expected to operate at stratum 2) - - server 128.4.1.1 # rackety.udel.edu - server 128.8.10.1 # umd1.umd.edu - server 192.35.82.50 # lilben.tn.cornell.edu - driftfile /etc/ntp.drift - -This particular host is expected to operate as a client at stratum 2 by -virtue of the "server" keyward and the fact that two of the three -servers declared (the first two, actually) have radio clocks and usually -run at stratum 1. The third server in the list has no radio clock, but -is known to maintain associations with a number of stratum 1 peers and -usually operates at stratum 2. Of particular importance with the last -host is that it maintains associations with peers besides the two -stratum 1 peers mentioned. This can be verified using the ntpq program -included in the xntp3 distribution. When configured using the "server" -keyword, this host can receive synchronization from any of the listed -servers, but can never provide synchronization to them. - -Unless restricted using facilities described later, this host can -provide synchronization to dependent clients, which do not have to be -listed in the configuration file. Associations maintained for these -clients are transitory and result in no persistent state in the host. -These clients are normally not visible using the ntpq program included -in the xntp3 distribution; however, xntpd includes a monitoring feature -(described later) which caches a minimal amount of client information -useful for debugging administrative purposes. - -A time server expected to both receive synchronization from another -server, as well as to provide synchronization to it, is delared using -the "peer" keyword instead of the "server" keyword. In all other aspects -the server operates the same in either mode and can provide -synchronization to dependent clients or other peers. It is considered -good engineering practice to declare time servers outside the -administrative domain as "peer" and those inside as "server" in order to -provide redundancy in the global Internet, while minimizing the -possibility of instability within the domain itself. A time server in -one domain can in principle heal another domain temporarily isolated -from all other sources of synchronization. However, it is probably -unwise for a casual workstation to bridge fragments of the local domain -which have become temporarily isolated. - -Note the inclusion of a "driftfile" declaration. One of the things the -NTP daemon does when it is first started is to compute the error in the -intrinsic frequency of the clock on the computer it is running on. It -usually takes about a day or so after the daemon is started to compute a -good estimate of this (and it needs a good estimate to synchronize -closely to its server). Once the initial value is computed, it will -change only by relatively small amounts during the course of continued -operation. The "driftfile" declaration indicates to the daemon the name -of a file where it may store the current value of the frequency error so -that, if the daemon is stopped and restarted, it can reinitialize itself -to the previous estimate and avoid the day's worth of time it will take -to recompute the frequency estimate. Since this is a desireable feature, -a "driftfile" declaration should always be included in the configuration -file. - -An implication in the above is that, should xntpd be stopped for some -reason, the local platform time will diverge from UTC by an amount that -depends on the intrinsic error of the clock oscillator and the time -since last synchronized. In view of the length of time necessary to -refine the frequency estimate, every effort should be made to operate -the daemon on a continuous basis and minimize the intervals when for -some reason it is not running. - -Xntpd3 Versus Previous Versions - -There are several items of note when dealing with a mixture of xntp3 and -and previous distributions of xntp (NTP Version 2 xntpd) and ntp3.4 (NTP -Version 1 ntpd). The xntp3 implementation of xntpd is an NTP Version 3 -implementation. As such, by default when no additional information is -available concerning the preferences of the peer, xntpd claims to be -version 3 in the packets that it sends. - -An NTP implementation conforming to a previous version specification -ordinarily discards packets from a later version. However, in most -respects documented in RFC 1305, the previous version is compatible with -the version-3 algorithms and protocol. Ntpd, while implementing most of -the version-2 algorithms, still believes itself to be a version-1 -implementation. The sticky part here is that, when either xntpd version -2 or ntpd version 1 receives a packet claiming to be from a version-3 -server, it discards it without further processing. Hence there is a -danger that in some situations synchronization with previous versions -will fail. - -Xntpd is aware of this problem. In particular, when xntpd is polled -first by a host claiming to be a previous version 1 or version 2 -implementation, xntpd claims to be a version 1 or 2 implementation, -respectively, in packets returned to the poller. This allows xntpd to -serve previous version clients transparently. The trouble occurs when an -previous version is to be included in an xntpd configuration file. With -no further indication, xntpd will send packets claiming to be version 3 -when it polls. To get around this, xntpd allows a qualifier to be added -to configuration entries to indicate which version to use when polling. -Hence the entry - - # specify NTP version 1 - - peer 130.43.2.2 version 1 # apple.com (running ntpd version 1) - peer 130.43.2.2 version 2 # apple.com (running xntpd version 2) - -will cause version 1 packets to be sent to the host address 130.43.2.2. -If you are testing xntpd against previous version servers you will need -to be careful about this. Note that, as indicated in the RFC 1305 -specification, there is no longer support for the original NTP -specification, popularly called NTP Version 0. - -There are a few other items to watch when converting an ntpd -configuration file for use with xntpd. The first is to reconsider the -precision entry from the configuration file, if there is one. There was -a time when the precision claimed by a server was mostly commentary, -with no particularly useful purpose. This is no longer the case, -however, and so changing the precision a server claims should only be -done with some consideration as to how this alters the performance of -the server. The default precision claimed by xntpd will be right for -most situations. A section later on will deal with when and how it is -appropriate to change a server's precision without doing things you -don't intend. - -Second, note that in the example configuration file above numeric -addresses are used in the peer and server declarations. It is also -possible to use names requiring resolution instead, but only if some -additional configuration is done (xntpd doesn't include the resolver -routines itself, and requires that a second program be used to do name -resolution). If you find numeric addresses offensive, see below. - -Finally, "passive" and "client" entries in an ntpd configuration file -have no useful equivalent semantics for xntpd and should be deleted. -Xntpd won't reset the kernel variable tickadj when it starts, so you can -remove anything dealing with this in the configuration file. The -configuration of radio clock peers is done using different language in -xntpd configuration files, so you will need to delete these entries from -your ntpd configuration file and see below for the equivalent language. - -Traffic Monitoring - -Xntpd handles peers whose stratum is higher than the stratum of the -local server and pollers using client mode by a fast path which -minimizes the work done in responding to their polls, and normally -retains no memory of these pollers. Sometimes, however, it is -interesting to be able to determine who is polling the server, and how -often, as well as who has been sending other types of queries to the -server. - -To allow this, xntpd implements a traffic monitoring facility which -records the source address and a minimal amount of other information -from each packet which is received by the server. This can be enabled by -adding the following line to the server's configuration file: - - # enable monitoring feature - - monitor yes - -The recorded information can be displayed using the xntpdc query -program, described briefly below. - -Address-and-Mask Restrictions - -The address-and-mask configuration facility supported by xntpd is quite -flexible and general, but is not an integral part of the NTP Version 3 -specification. The major drawback is that, while the internal -implementation is very nice, the user interface sucks. For this reason -it is probably worth doing an example here. Briefly, the facility works -as follows. There is an internal list, each entry of which holds an -address, a mask and a set of flags. On receipt of a packet, the source -address of the packet is compared to each entry in the list, with a -match being posted when the following is true: - - (source_addr & mask) == (address & mask) - -A particular source address may match several list entries. In this case -the entry with the most one bits in the mask is chosen. The flags -associated with this entry are used to control the access. - -In the current implementation the flags always add restrictions. In -effect, an entry with no flags set leaves matching hosts unrestricted. -An entry can be added to the internal list using a "restrict" -declaration. The flags associated with the entry are specified -textually. For example, the "notrust" flag indicates that hosts matching -this entry, while treated normally in other respects, shouldn't be -trusted to provide synchronization even if otherwise so enabled. The -"nomodify" flag indicates that hosts matching this entry should not be -allowed to do run time configuration. There are many more flags, see the -xntpd.8 man page. - -Now the example. Suppose you are running the server on a host whose -address is 128.100.100.7. You would like to ensure that run time -reconfiguration requests can only be made from the local host and that -the server only ever synchronizes to one of a pair of off-campus servers -or, failing that, a time source on net 128.100. The following entries in -the configuration file would implement this policy: - - # by default, don't trust and don't allow modifications - - restrict default notrust nomodify - - # these guys are trusted for time, but no modifications allowed - - restrict 128.100.0.0 mask 255.255.0.0 nomodify - restrict 128.8.10.1 nomodify - restrict 192.35.82.50 nomodify - - # the local addresses are unrestricted - - restrict 128.100.100.7 - restrict 127.0.0.1 - -The first entry is the default entry, which all hosts match and hence -which provides the default set of flags. The next three entries indicate -that matching hosts will only have the nomodify flag set and hence will -be trusted for time. If the mask isn't specified in the restrict -keyward, it defaults to 255.255.255.255. Note that the address -128.100.100.7 matches three entries in the table, the default entry -(mask 0.0.0.0), the entry for net 128.100 (mask 255.255.0.0) and the -entry for the host itself (mask 255.255.255.255). As expected, the flags -for the host are derived from the last entry since the mask has the most -bits set. - -The only other thing worth mentioning is that the restrict declarations -apply to packets from all hosts, including those that are configured -elsewhere in the configuration file and even including your clock -pseudopeer(s), in any. Hence, if you specify a default set of -restrictions which you don't wish to be applied to your configured -peers, you must remove those restrictions for the configured peers with -additional restrict declarations mentioning each peer separately. - -Authentication - -Xntpd supports the optional authentication procedure specified in the -NTP Version 2 and 3 specifications. Briefly, when an association runs in -authenticated mode, each packet transmitted has appended to it a 32-bit -key ID and a 64-bit crypto checksum of the contents of the packet -computed using either the Data Encryption Standard (DES) or Message -Digest (MD5) algorithms. Note that while either of these algorithms -provide sufficient protection from message-modification attacks, -distribution of the former algorithm implementation is restricted to the -U.S. and Canada, while the latter presently is free from such -restrictions. With either algorithm the receiving peer recomputes the -checksum and compares it with the one included in the packet. For this -to work, the peers must share at least one encryption key and, -furthermore, must associate the shared key with the same key ID. - -This facility requires some minor modifications to the basic packet -processing procedures, as required by the specification. These -modifications are enabled by the "authenticate" configuration -declaration. In particular, in authenticated mode, peers which send -unauthenticated packets, peers which send authenticated packets which -the local server is unable to decrypt and peers which send authenticated -packets encrypted using a key we don't trust are all marked -untrustworthy and unsuitable for synchronization. Note that, while the -server may know many keys (identified by many key IDs), it is possible -to declare only a subset of these as trusted. This allows the server to -share keys with a client which requires authenticated time and which -trusts the server but which is not trusted by the server. Also, some -additional configuration language is required to specify the key ID to -be used to authenticate each configured peer association. Hence, for a -server running in authenticated mode, the configuration file might look -similar to the following: - - # peer configuration for 128.100.100.7 - # (expected to operate at stratum 2) - # fully authenticated this time - - peer 128.100.49.105 key 22 # suzuki.ccie.utoronto.ca - peer 128.8.10.1 key 4 # umd1.umd.edu - peer 192.35.82.50 key 6 # lilben.tn.cornell.edu - authenticate yes # enable authentication - keys /usr/local/bin/ntp.keys # path for key file - trustedkey 1 2 14 15 # define trusted keys - requestkey 15 # key (7) for accessing server variables - controlkey 15 # key (6) for accessing server variables - - #authdelay 0.000047 # authentication delay (Sun4c/50 IPX DES) - authdelay 0.000094 # authentication delay (Sun4c/50 IPX MD5) - -There are a couple of previously unmentioned things in here. The -"authenticate yes" line enables authentication processing, while the -"keys /usr/local/bin/ntp.keys" specifies the path to the keys file (see -below and the xntpd.8 man page for detaiils of the file format). The -"trustedkey" declaration identifies those keys that are known to be -uncompromised; the remainder presumably represent the expired or -possibly compromised keys. Both sets of keys must be declared by key -identifier in the ntp.keys file described below. This provides a way to -retire old keys while minimrequestkey 15izing the frequency of delicate -key-distribution procedures. The "requestkey 15" line establishes the -key to be used for mode-6 control messages as specified in RFC 1305 and -used by the ntpq utility program, while the "controlkey 15" establishes -the key to be used for mode-7 private control messages used by the -xntpdc utility program these keys are used to prevent unauthorized -modification of daemon variables. - -The "authdelay" declaration is an estimate of the amount of processing -time taken between the freezing of a transmit timestamp and the actual -transmission of the packet when authentication is enabled (i.e. more or -less the time it takes for the DES or MD5 routine to encrypt a single -block), and is used as a correction for the transmit timestamp. This can -be computed for your CPU by the authspeed program included in the -authstuff directory in the xntp3 distribution. The usage is illustrated -to the following: - - # for DES keys - - authspeed -n 30000 auth.samplekeys - - # for MD5 keys - - authspeed -nd 30000 auth.samplekeys - -Additional utility programs included in the authstuff directory can be -used to generate random keys, certify implementation correctness and -display sample keys. As a general rule, keys should be chosen randomly, -except possibly the request and control keys, which must be entered by -the user as a password. - -The ntp.keys file contains the list of keys and associated key IDs the -server knows about (for obvious reasons this file is better left -unreadable by anyone except the server). The contents of this file might -look like: - - # ntp keys file (ntp.keys) - - 1 N 29233E0461ECD6AE # des key in NTP format - 2 M RIrop8KPPvQvYotM # md5 key as an ASCII random string - 14 M sundial # md5 key as an ASCII string - 15 A sundial # des key as an ASCII string - - # the following 3 keys are identical - - 10 A SeCReT - 10 N d3e54352e5548080 - 10 S a7cb86a4cba80101 - -In the keys file the first token on each line indicates the key ID, the -second token the format of the key and the third the key itself. There -are four key formats. An "A" indicates a DES key written as a 1-to-8 -character string in 7-bit ASCII representation, with each character -standing for a key octet (like a Unix password). An "S" indicates a DES -key written as a hex number in the DES standard format, with the low -order bit (LSB) of each octet being the (odd) parity bit. An "N" -indicates a DES key again written as a hex number, but in NTP standard -format with the high order bit of each octet being the (odd) parity bit -(confusing enough?). An "M" indicates an MD5 key written as a 1-to-31 -character ASCII string in the "A" format. Note that, because of the -simple tokenizing routine, the characters ' ', '#', '\t', '\n' and '\0' -can't be used in either a DES or MD5 ASCII key. Everything else is fair -game, though. Key 0 (zero) is used for special purposes and should not -appear in this file. - -The big trouble with the authentication facility is the keys file. It is -a maintenance headache and a security problem. This should be fixed some -day. Presumably, this whole bag of worms goes away if/when a generic -security regime for the Internet is established. - -Query Programs - -Three utility query programs are included with the xntp3 distribution, -ntpq, ntptrace and xntpdc. Ntpq is a rather handy program which sends -queries and receives responses using NTP standard mode-6 control -messages. Since it uses the standard control protocol specified in RFC -1305, it may be used with NTP Version 2 and Version 3 implementations -for both Unix and Fuzzball, but not Version 1 implementations. It is -most useful to query remote NTP implementations to assess timekeeping -accuracy and expose bugs in configuration or operation. - -Ntptrace can be used to display the current synchronization path from a -selected host through possibly intervening servers to the primary source -of synchronization, usually a radio clock. It works with both version 2 -and version 3 servers, but not version 1. - -Xnptdc is a horrid program which uses NTP private mode-7 control -messages to query local or remote servers. The format and and contents -of these messages are specific to xntpd. The program does allow -inspection of a wide variety of internal counters and other state data, -and hence does make a pretty good debugging tool, even if it is -frustrating to use. The other thing of note about xntpdc is that it -provides a user interface to the run time reconfiguration facility. - -See the respective man pages for details on the use of these programs. -The primary reason for mentioning them here is to point out an -inconsistancy which can be awfully annoying if it catches you, and which -is worth keeping firmly in mind. Both xntpdc and xntpd demand that -anything which has dimensions of time be specified in units of seconds, -both in the configuration file and when doing run time reconfiguration. -Both programs also print the values in seconds. Ntpq on the other hand, -obeys the standard by printing all time values in milliseconds. This -makes the process of looking at values with ntpq and then changing them -in the configuration file or with xntpdc very prone to errors (by three -orders of magnitude). I wish this problem didn't exist, but xntpd and -its love of seconds predate the mode-6 protocol and the latter's -(Fuzzball-inspired) millisecond orientation, making the inconsistancy -irresolvable without considerable work. - -Run Time Reconfiguration - -Xntpd was written specifically to allow its configuration to be fully -modifiable at run time. Indeed, the only way to configure the server is -at run time. The configuration file is read only after the rest of the -server has been initialized into a running, but default unconfigured, -state. This facility was included not so much for the benefit of Unix, -where it is handy but not strictly essential, but rather for dedicated -platforms where the feature is more important for maintenance. -Nevertheless, run time configuration works very nicely for Unix servers -as well. - -Nearly all of the things it is possible to configure in the -configuration file may be altered via NTP mode-7 messages using the -xntpdc program. Mode-6 messages may also provide some limited -configuration functionality (though the only thing you can currently do -with mode-6 messages is set the leap-second warning bits) and the ntpq -program provides generic support for the latter. The leap bits that can be -set in the leap_warning variable (up to one month ahead) and in the -leap_indication variable have a slightly different encoding than the -usual interpretation: - - Value Action - 00 The daemon passes the leap bits of its - synchronisation source (usual mode of operation) - 01/10 A leap second is added/deleted - 11 Leap information from the sychronisation source - is ignored (thus LEAP_NOWARNING is passed on) - -Mode-6 and mode-7 messages which would modify the configuration of the -server are required to be authenticated using standard NTP -authentication. To enable the facilities one must, in addition to -specifying the location of a keys file, indicate in the configuration -file the key IDs to be used for authenticating reconfiguration commands. -Hence the following fragment might be added to a configuration file to -enable the mode-6 (ntpq) and mode-7 (xntpdc) facilities in the daemon: - - # specify mode-6 and mode-7 trusted keys - - requestkey 65535 # for mode-7 requests - controlkey 65534 # for mode-6 requests - -If the "requestkey" and/or the "controlkey" configuration declarations -are omitted from the configuration file, the corresponding run time -reconfiguration facility is disabled. - -The query programs require the user to specify a key ID and a key to use -for authenticating requests to be sent. The key ID provided should be -the same as the one mentioned in the configuration file, while the key -should match that corresponding to the key ID in the keys file. As the -query programs prompt for the key as a password, it is useful to make -the request and control authentication keys typable (in ASCII format) -from the keyboard. - -Name Resolution - -Xntpd includes the cability to specify host names requiring resolution -in "peer" and "server" declarations in the configuration file. There are -several reasons why this was not permitted in the past. Chief among -these is the fact that name service is unreliable and the interface to -the Unix resolver routines is synchronous. The hangups and delays -resulting from name-resolver clanking can be unacceptable once the NTP -server is running (and remember it is up and running before the -configuration file is read). However, it is advantageous to resolve time -server names, since their addresses are occasionally changed. - -Instead of running the resolver itself the daemon can defer this task to -a separate program, xntpres. When the daemon comes across a "peer" or -"server" entry with a non-numeric host address it records the relevant -information in a temporary file and continues on. When the end of the -configuration file has been reached and one or more entries requiring -name resolution have been found, the server runs an instance of xntpres -with the temporary file as an argument. The server then continues on -normally but with the offending peers/servers omitted from its -configuration. - -When xntpres successfully resolves a name from this file, it configures -the associated entry into the server using the same mode-7 run time -reconfiguration facility that xntpdc uses. If temporary resolver -failures occur, xntpres will periodically retry the offending requests -until a definite response is received. The program will continue to run -until all entries have been resolved. -There are several configuration requirements if xntpres is to be used. -The path to the xntpres program must be made known to the daemon via a -"resolver" configuration entry, and mode-7 run time reconfiguration must -be enabled. The following fragment might be used to accomplish this: - - # specify host name resolver data - - resolver /local/etc/xntpres - keys /etc/ntp.keys - requestkey 65535 - -Note that xntpres sends packets to the server with a source address of -127.0.0.1. You should obviously avoid "restrict" modification requests -from this address or xntpres will fail. - -Dealing with Frequency Tolerance Violations (Tickadj and Friends) - -The NTP Version 3 specification RFC 1305 calls for a maximum oscillator -frequency tolerance of +-100 parts-per-million (ppm), which is -representative of those components suitable for use in relatively -inexpensive workstation platforms. For those platforms meeting this -tolerance, NTP will automatically compensate for the frequency errors of -the individual oscillator and no further adjustments are required, -either to the configuration file or to various kernel variables. - -However, in the case of certain notorious platforms, in particular Sun -4s, the 100-ppm tolerance is routinely violated. In such cases it may be -necessary to adjust the values of certain kernel variables; in -particular, "tick" and "tickadj". The variable tick is the increment in -microseconds added to the system time on each interval-timer interrupt, -while the variable tickadj is used by the time adjustment code as a slew -rate. When the time is being adjusted via a call to the system routine -adjtime(), the kernel increases or reduces tick by tickadj microseconds -until the specified adjustment has been completed. Unfortunately, in -most Unix implementations the tick increment must be either zero or -plus/minus exactly tickadj microseconds, meaning that adjustments are -truncated to be an integral multiple of tickadj (this latter behaviour -is a misfeature, and is the only reason the xntpd code needs to concern -itself with the internal implementation of adjtime() at all). In -addition, the stock Unix implementation considers it an error to request -another adjustment before a prior one has completed. - -Thus, to make very sure it avoids problems related to the roundoff, the -xntpd daemon reads the values of tick and tickadj from /dev/kmem when it -starts. It then ensures that all adjustments given to adjtime() are an -even multiple of tickadj microseconds and computes the largest -adjustment that can be completed in the adjustment interval (using both -the value of tickadj and the value of tick) so it can avoid exceeding -this limit. - -Unfortunately, the value of tickadj set by default is almost always too -large for xntpd. NTP operates by continuously making small adjustments -to the clock, usually at one-second intervals. If tickadj is set too -large, the adjustments will disappear in the roundoff; while, if tickadj -is too small, NTP will have difficulty if it needs to make an occasional -large adjustment. While the daemon itself will read the kernel's values -of tick and tickadj, it will not change the values, even if they are -unsuitable. You must do this yourself before the daemon is started, -either with adb or, in the running kernel only, with the tickadj program -included in the util directory of the xntp3 distribution. Note that the -latter program will also computes an optimal value of tickadj for NTP -use based on the kernel's value of tick. - -The tickadj program can reset several other kernel variables if asked. -It can also change the value of tick if asked, this being necessary on a -few machines with very broken clocks, like Sun 4s. With these machines -it should also set the value of the kernel dosynctodr variable to zero. -This variable controls whether to synchronize the system clock to the -time-of-day clock, something you really don't want to be happen when -xntpd is trying to keep it under control. - -In order to maintain reasonable correctness bounds, as well as -reasonably good accuracy with acceptable polling intervals, xntpd will -complain if the frequency error is greater than 100 ppm. For machines -with a value of tick in the 10-ms range, a change of one in the value of -tick will change the frequency by about 100 ppm. In order to determine -the value of tick for a particular CPU, disconnect the machine from all -sources of time (dosynctodr = 0) and record its actual time compared to -an outside source (eyeball-and-wristwatch will do) over a day or more. -Multiply the time change over the day by 0.116 and add or subtract the -result to tick, depending on whether the CPU is fast or slow. An example -call to tickadj useful on Sun 4s is: - - tickadj -t 9999 -a 5 -s - -which sets tick 100 ppm fast, tickadj to 5 microseconds and turns off -the clock/calendar chip fiddle. This line can be added to the rc.local -configuration file to automatically set the kernel variables at boot -time. - -All this stuff about diddling kernel variables so the NTP daemon will -work is really silly. If vendors would ship machines with clocks that -kept reasonable time and would make their adjtime() system call apply -the slew it is given exactly, independent of the value of tickadj, all -this could go away. - -Tuning Your Subnet - -There are several parameters available for tuning the NTP subnet for -maximum accuracy and minimum jitter. Two important parameters are the -the "precision" and "prefer" configuration declarations. The precision -declaration specifies the number of significant bits of the system clock -representation relative to one second. For instance, the default value -of -6 corresponds to 1/64 second or about 16 milliseconds. - -The NTP protocol makes use of the precision parameter in several places. -It is included in packets sent to peers and is used by them to calculate -the maximum absolute error and maximum statistical error. When faced -with selecting one of several servers of the same stratum and about the -same network path delay for synchronization purposes, clients will -usually prefer to synchronize to those servers claiming the smallest -(most negative) precision, since this maximizes the accuracy and -minimizes the jitter apparent to application programs running on the -client platform. Therefore, when the maximum attainable accuracy is -required, it is important that every platform configure an accurate -value for the precision variable. This can be done using the optional -"precision" declaration in the configuration file: - - # precision declaration - - precision -18 # for microsecond clocks (Sun 4s, DEC 5000/240) - -When more than one eligible server exists, the NTP clock-selection and -combining algorithms act to winnow out all except the "best" set of -servers using several criteria based on differences between the readings -of different servers and between successive readings of the same server. -The result is usually a set of surviving servers that are apparently -statistically equivalent in accuracy, jitter and stability. The -population of survivors remaining in this set depends on the individual -server characteristics measured during the selection process and may -vary from time to time as the result of normal statistical variations. -In LANs with high speed RISC-based time servers, the population can -become somewhat unstable, with individual servers popping in and out of -the surviving population, generally resulting in a regime called -clockhopping. - -When only the smallest residual jitter can be tolerated, it may be -convenient to elect one of the servers at each stratum level as the -preferred one using the keyword "prefer" on the configuration -declaration for the selected server: - - # prefered server declaration - - peer 128.4.1.1 prefer # preferred server - -The preferred server will always be included in the surviving -population, regardless of its characteristics and as long as it survives -preliminary sanity checks and validation procedures. - -The most useful application of the prefer keyword is in high speed LANs -equipped with precision radio clocks, such as a GPS receiver. In order -to insure robustness, the hosts need to include outside peers as well as -the GPS-equipped server; however, as long as that server is running, the -synchronization preference should be that server. The keyword should -normally be used in all cases in order to prefer an attached radio -clock. It is probably inadvisable to use this keyword for peers outside -the LAN, since it interferes with the carefully crafted judgement of the -selection and combining algorithms. - -Provisions for Leap Seconds and Accuracy Metrics - -Xntpd understands leap seconds and will attempt to take appropriate -action when one occurs. In principle, every host running xntpd will -insert a leap second in the local timescale in precise synchronization -with UTC. This requires that the leap-warning bits be manually activated -some time prior to the occurance of a leap second at the primary -(stratum 1) servers. Subsequently, these bits are propagated throughout -the subnet depending on these servers by the NTP protocol itself and -automatically implemented by xntpd and the time-conversion routines of -each host. The implementation is independent of the idiosyncracies of -the particular radio clock, which vary widely among the various devices, -as long as the idiosyncratic behavior does not last for more than about -20 minutes following the leap. Provisions are included to modify the -behavior in cases where this cannot be guaranteed. - -While provisions for leap seconds have been carefully crafted so that -correct timekeeping immediately before, during and after the occurance -of a leap second is scrupulously correct, stock Unix systems are mostly -inept in responding to the available information. This caveat goes also -for the maximum-error and statistical-error bounds carefully calculated -for all clients and servers, which could be very useful for application -programs needing to calibrate the delays and offsets to achieve a near- -simulataneous commit procedure, for example. While this information is -maintained in the xntpd data structures, there is at present no way for -application programs to access it. This may be a topic for further -development. - -Clock Support Overview - -Xntpd was designed to support radio (and other external) clocks and does -some parts of this function with utmost care. Clocks are treated by the -protocol as ordinary NTP peers, even to the point of referring to them -with an (invalid) IP host address. Clock addresses are of the form -127.127.t.u, where t specifies the particular type of clock (i.e. refers -to a particular clock driver) and u is a unit number whose -interpretation is clock-driver dependent. This is analogous to the use -of major and minor device numbers by Unix and permits multiple -instantiations of clocks of the same type on the same server, should -such magnificant redundancy be required. - -Because clocks look much like peers, both configuration file syntax and -run time reconfiguration commands can be be used to control clocks in -the same way as ordinary peers. Clocks are configured via "server" -declarations in the configuration file, can be started and stopped using -xntpdc and are subject to address-and-mask restrictions much like a -normal peer, should this stretch of imagination ever be useful. As a -concession to the need to sometimes transmit additional information to -clock drivers, an additional configuration file is available: the -"fudge" statement. This enables one to specify the values two time -quantities, two integral values and two flags, the use of which is -dependent on the particular clock driver. For example, to configure a -PST radio clock which can be accessed through the serial device -/dev/pst1, with propagation delays to WWV and WWVH of 7.5 and 26.5 -milliseconds, respectively, on a machine with an imprecise system clock -and with the driver set to disbelieve the radio clock once it has gone -30 minutes without an update, one might use the following configuration -file entries: - - # radio clock fudge fiddles - - server 127.127.3.1 - fudge 127.127.3.1 time1 0.0075 time2 0.0265 - fudge 127.127.3.1 value2 30 flag1 1 - -Additional information on the interpretation of these data with respect -to various radio clock drivers is given in the xntpd.8 man page. - -Towards the Ultimate Tick - -This section consideres issues in providing precision time -synchronization in NTP subnets which need the highest quality time -available in the present technology. These issues are important in -subnets supporting real-time services such as distributed multimedia -conferencing and wide-are experiment control and monitoring. - -In the Internet of today synchronization paths often span continents and -oceans with moderate to high variations in delay due to traffic spasms. -NTP is specifically designed to minimize timekeeping jitter due to delay -variations using intricately crafted filtering and selection algorithms; -however, in cases where these variations are as much as a second or -more, the residual jitter following these algorithms may still be -excessive. Sometimes, as in the case of some isolated NTP subnets where -a local source of precision time is available, such as a 1-pps signal -produced by a calibrated cesium clock, it is possible to remove the -jitter and retime the local clock oscillator of the NTP server. This has -turned out to be a useful feature to improve the synchronization quality -of time distributed in remote places where radio clocks are not -available. In these cases special features of the xntp3 distribution are -used together with the 1-pps signal to provide a jitter-free timing -signal, while NTP itself is used to provide the coarse timing and -resolve the seconds numbering. - -Most available radio clocks can provide time to an accuracy in the order -of milliseconds, depending on propagation conditions, local noise levels -and so forth. However, as a practical matter, all clocks can -occasionally display errors significantly exceeding nominal -specifications. Usually, the algorithms used by NTP for ordinary network -peers, as well as radio clock "peers" will detect and discard these -errors as discrepancies between the disciplined local clock oscillator -and the decoded time message produced by the radio clock. Some radio -clocks can produce a special 1-pps signal which can be interfaced to the -server platform in a number of ways and used to substantially improve -the (disciplined) clock oscillator jitter and wander characteristics by -at least an order of magnitude. Using these features it is possible to -achieve accuracies in the order of 100 microseconds with a fast RISC- -based platform. - -There are three ways to implement 1-pps support, depending on the radio -clock model, platform model and serial line interface. Each of these -requires circuitry to convert the TTL signal produced by most clocks to -the the EIA levels used by most serial interfaces. An example of a -device designed to do this is presented in the gadget subdirectory -included in the xntp3 distribtuion. Besides being useful for this -purpose, this device includes an inexpensive modem designed for use with -the Canadian CHU time/frequency radio station. - -In order to select the appropriate implementation, it is important to -understand the underlying 1-pps mechanism used by xntpd. The 1-pps -suport depends on a continuous source of 1-pps pulses used to calculate -an offset within +-500 milliseconds relative to the local clock. The -serial timecode produced by the radio or the time determined by NTP in -absence of the radio is used to adjust the local clock within +-128 -milliseconds of the actual time. As long as the local clock is within -this interval the 1-pps support is used to discipline the local clock -and the timecode used only to verify that the local clock is in fact -within the interval. Outside this interval the 1-pps support is disabled -and the timecode used directly to control the local clock. - -The first method of implementation uses a dedicated serial port and -either the bsd line discipline or System V streams module, which can be -found in the kernel directory of the xntp3 distribution. This method can -be used with any radio clock or in the absence of any clock. The line -discipline and streams modules take receive timestamps in the kernel, -specifically the interrupt routine of the serial port hardware driver. -Using this method the port is dedicated to serve the 1-pps signal and -cannot be used for other purposes. Instructions for implementing the -feature, which requires rebuilding the kernel, are included in the -modules themselves. Note that xndpd must be compiled with the -DPPSDEV -compiler switch in this case. There is an inherent error in this method -due to the latency of the interrupt system and remaining serial-line -protocol modules in the order of a millisecond with Sun 4s. While the -jitter in this latency is unavoidable, the systematic component can be -calibrated out using a special configuration declaration: - - # pps delay and baud rate - - pps delay .0017 baud 19200 # pps delay (ms) and baud rate - -Note that the delay defaults to zero and the baud to 38400. - -The second method uses mechanisms embedded in the radio clock driver, -which call the 1-pps support directly and do not require a dedicated -serial port. Currently, only the DCF77 (German radio time service) -driver uses this method. Instructions for implementing this are given in -README files in the xntp3 distribution. - -The third method and the most accurate and intrusive of all uses the -carrier-detect modem-control lead monitored by the serial port driver. -This method can be used with any radio clock and 1-pps interface -mentioned above. It requires in addition to a special streams module, -replacement of the kernel high resolution time-of-day clock routine. -This method is applicable only to Sun 4 platforms running SunOS 4.1.1 -and then only with either of the two onboard serial ports. It does not -work with other platforms, operating systems or external (SBus) serial -multiplexors. - -Swatting Bugs - -Let's say you have compiled and installed the code and put up an -apparently relevant configuration file. In many Unix systems the xntpd -daemon and utility programs (ntpq, ntptrace and xntpdc) are usually -installed in the /usr/local directory along with the key file -(ntp.keys), while the configuration file (ntp.conf) and drift file -(ntp.drift) are installed in the /etc directory. The daemon can is -usually started from the rc.local shell script at system boot time, but -could be started (and stopped) at other times for debugging, etc. How do -you verify that the daemon can form associations with remote peers and -verify correct synchronization? For this you need the ntpq utility -described in the ntpq.8 man page. - -After starting the daemon, run the ntpq program using the -n switch, -which will avoid possible distractions due to name resolutions. Use the -peer command to display a billboard showing the status of configured -peers and possibly other clients poking the daemon. After operating for -a few minutes, the display should be something like: - - remote refid st when poll reach delay offset disp -======================================================================== -+128.4.2.6 132.249.16.1 2 131 256 373 9.89 16.28 23.25 -*128.4.1.20 .WWVB. 1 137 256 377 280.62 21.74 20.23 --128.8.2.88 128.8.10.1 2 49 128 376 294.14 5.94 17.47 -+128.4.2.17 .WWVB. 1 173 256 377 279.95 20.56 16.40 - -The hosts shown in the "remote" column should agree with the entries in -the configuration file, plus any peers not mentioned in the file at the -same or lower than your stratum that happen to be configured to peer -with you. The "refid" entry shows the current source of synchronization -for that peer, while the "st" reveals its stratum and the "poll" entry -the polling interval, in seconds. The "when" entry shows the time since -the peer was last heard, in seconds, while the "reach" entry shows the -status of the reachability register (see specification), which is in -octal format. The remaining entries show the latest delay, offset and -dispersion computed for the peer, in milliseconds. - -*** This section incomplete. Soon. - -status=0664 leap_none, sync_ntp, 6 events, event_peer/strat_chg -system="UNIX", leap=00, stratum=2, rootdelay=280.62, -rootdispersion=45.26, peer=11673, refid=128.4.1.20, -reftime=af00bb42.56111000 Fri, Jan 15 1993 4:25:38.336, poll=8, -clock=af00bbcd.8a5de000 Fri, Jan 15 1993 4:27:57.540, phase=21.147, -freq=13319.46, compliance=2 - -status=7414 reach, auth, sel_sync, 1 event, event_reach -srcadr=128.4.2.6, srcport=123, dstadr=128.4.2.7, dstport=123, keyid=1, -stratum=2, precision=-10, rootdelay=362.00, rootdispersion=21.99, -refid=132.249.16.1, -reftime=af00bb44.849b0000 Fri, Jan 15 1993 4:25:40.517, -delay= 9.89, offset= 16.28, dispersion=23.25, reach=373, valid=8, -hmode=2, pmode=1, hpoll=8, ppoll=10, leap=00, flash=0x0, -org=af00bb48.31a90000 Fri, Jan 15 1993 4:25:44.193, -rec=af00bb48.305e3000 Fri, Jan 15 1993 4:25:44.188, -xmt=af00bb1e.16689000 Fri, Jan 15 1993 4:25:02.087, -filtdelay= 16.40 9.89 140.08 9.63 9.72 9.22 10.79 122.99, -filtoffset= 13.24 16.28 -49.19 16.04 16.83 16.49 16.95 -39.43, -filterror= 16.27 20.17 27.98 31.89 35.80 39.70 43.61 47.52 - -ind assID status conf reach auth condition last_event cnt -=========================================================== - 1 11670 7414 no yes ok synchr. reachable 1 - 2 11673 7614 no yes ok sys.peer reachable 1 - 3 11833 7314 no yes ok outlyer reachable 1 - 4 11868 7414 no yes ok synchr. reachable 1 - -Parting Shots - -There are several undocumented programs which are useful if you are -trying to set up a clock. They can be found in the clockstuff directory -of the xntp3 distribution. The most useful of these is the propdelay -program, which can compute high frequency radio propagation delays -between any two points whose latitude and longitude are known. The -program understands something about the phenomena which allow high -frequency radio propagation to occur, and will generally provide a -better estimate than a calculation based on the great circle distance. -The other two programs in the directory are clktest, which allows one to -exercise the generic clock line discipline, and chutest, which runs the -basic reduction algorithms used by the daemon on data received from a -serial port. diff --git a/usr.sbin/xntpd/doc/ntpdate.8 b/usr.sbin/xntpd/doc/ntpdate.8 deleted file mode 100644 index c927c0d44efc..000000000000 --- a/usr.sbin/xntpd/doc/ntpdate.8 +++ /dev/null @@ -1,147 +0,0 @@ -.\" -.\" $FreeBSD$ -.\" -.Dd December 21, 1993 -.Dt NTPDATE 8 -.Os -.Sh NAME -.Nm ntpdate -.Nd set the date and time via NTP -.Sh SYNOPSIS -.Nm -.Op Fl bdqsv -.Op Fl o Ar version -.Op Fl a Ar key# -.Op Fl e Ar authdelay -.Op Fl k Ar keyfile -.Op Fl p Ar samples -.Op Fl t Ar timeout -.Ar server ... -.Sh DESCRIPTION -.Nm Ntpdate -sets the local date and time by polling the Network Time Protocol -server(s) on the host(s) given as arguments to determine -the correct time. It must be run as root on the local host. A number -of samples are obtained from each of the servers specified and the -standard NTP clock filter and selection algorithms are applied to select -the best of these. Typically, -.Nm -can be inserted in the -.Pa /etc/rc.local -startup up script to set the time of day at boot time and/or can be run -from time\-to\-time via -.Xr cron 8 . -Note that -.Nm Ns 's -reliability and precision will improve dramatically with greater numbers -of servers. While a single server may be used, better performance and -greater resistance to insanity on the part of any one server -will be obtained by providing at least three or four servers, if not more. -.Pp -Time adjustments are made by -.Nm -in one of two ways. If -.Nm -determines your clock is off by more than 0.5 seconds it will simply -step the time by calling -.Xr settimeofday 2 . -If the error is less than 0.5 seconds, however, it will by default slew -the clock's time via a call to -.Xr adjtime 2 -with the offset. The latter technique is less disruptive and more -accurate when the offset is small, and works quite well when -.Nm -is run by -.Xr cron 8 -every hour or two. The adjustment made in the latter -case is actually 50% larger than the measured offset since this will -tend to keep a badly drifting clock more accurate (at some expense to -stability, though this tradeoff is usually advantageous). At boot time, -however, it is usually better to always step the time. This can be forced -in all cases by specifying the -.Fl b -switch on the command line. The -.Fl s -switch tells -.Nm -to log its actions via the -.Xr syslog 3 -facility rather than to the standard output, a useful option when -running the program from -.Xr cron 8 . -.Pp -The -.Fl d -flag may be used to determine what -.Nm -will do without it actually doing it. Information useful for general -debugging will also be printed. The -.Fl q -flag is used to perform a simple query without binding a priviledged -UPD port. The -.Fl v -enables a few diagnostic messages. By default -.Nm -claims to be an NTP version 3 implementation in its outgoing packets. As -some older software will decline to respond to version 3 queries, the -.Fl o Ar version -switch can be used to force the program to poll as a version 2 or 1 -implementation instead. -.Pp -The number of samples -.Nm -acquires from each server can be set to between 1 and 8 inclusive -using the -.Fl p -switch. The default is 4. The time it will spend waiting for a -response can be set using the -.Fl t -switch, and will be rounded to a multiple of 0.2 seconds. The default -is 1 second, a value suitable for polling across a LAN. -.Pp -.Nm Ntpdate -will authenticate its transactions if need be. The -.Fl a -switch specifies that all packets should be authenticated using the -key number indicated. The -.Fl k -switch allows the name of the file from which the keys may be read -to be modified from the default of -.Pa /etc/ntp.keys . -This file should be in the format described in -.Xr xntpd 8 . -The -.Fl e -option allows the specification of an authentication processing delay, -in seconds (see -.Xr xntpd 8 -for details). This number is usually small enough to be negligible for -.Nm Ns 's -purposes, though specifying a value may improve timekeeping on very slow -CPU's. -.Pp -.Nm Ntpdate -will decline to set the date if an NTP server daemon (e.g. -.Xr xntpd 8 ) -is running on the same host. When running -.Nm -on a regular basis from -.Xr cron 8 -as an alternative to running a daemon, doing so once every hour or two -will result in precise enough timekeeping to avoid stepping the clock. -.Sh FILES -.Bl -tag -width /etc/ntp.keys -compact -.It Pa /etc/ntp.keys -contains the encryption keys used by -.Nm Ns . -.El -.Sh SEE ALSO -.Xr xntpd 8 -.Sh HISTORY -Written by -.An Dennis Ferguson -at the University of Toronto -.Sh BUGS -The technique used for improving accuracy by compensating for clock -oscillator errors sucks, but doing better would require the program -to save state from previous runs. diff --git a/usr.sbin/xntpd/doc/ntpq.8 b/usr.sbin/xntpd/doc/ntpq.8 deleted file mode 100644 index 7d624286057d..000000000000 --- a/usr.sbin/xntpd/doc/ntpq.8 +++ /dev/null @@ -1,480 +0,0 @@ -.\" -.\" $FreeBSD$ -.\" -.Dd December 21, 1993 -.Dt NTPQ 8 -.Os -.Sh NAME -.Nm ntpq -.Nd standard Network Time Protocol query program -.Sh SYNOPSIS -.Nm -.Op Fl inp -.Op Fl c Ar command -.Op Ar host ... -.Sh DESCRIPTION -.Nm Ntpq -is used to query NTP servers which implement the recommended NTP mode 6 -control message format about current state and to request changes in -that state. The program may be run either in interactive mode or -controlled using command line arguments. Requests to read and write -arbitrary variables can be assembled, with raw and pretty\-printed -output options being available. -.Nm Ntpq -can also obtain and print a list of peers in a common format by sending -multiple queries to the server. -.Pp -If one or more request options is included on the command line when -.Nm -is executed, each of the requests will be sent to the NTP servers -running on each of the hosts given as command line arguments, or on -.Ar localhost -by default. If no request options are given, -.Nm -will attempt to read commands from the standard input and execute these -on the NTP server running on the first host given on the command line, -again -defaulting to -.Ar localhost -when no other host is specified. -.Nm Ntpq -will prompt for commands if the standard input is a terminal device. -.Pp -.Nm Ntpq -uses NTP mode 6 packets to communicate with the NTP server, and hence -can be used to query any compatible server on the network which permits -it. Note that since NTP is a UDP protocol this communication will be -somewhat unreliable, especially over large distances in terms of network -topology. -.Nm Ntpq -makes one attempt to retransmit requests, and will time requests out if -the remote host is not heard from within a suitable time out time. -.Pp -Command line options are described following. Specifying a command line -option other than -.Fl i -or -.Fl n -will cause the specified query (queries) to be sent to the indicated -host(s) immediately. Otherwise, -.Nm -will attempt to read interactive format commands from the standard -input. -The following options are available: -.Bl -tag -width indent -.It Fl c Ar command -The following argument is interpreted as an interactive format -.Ar command -and is added to the list of commands to be executed on the specified -host(s). Multiple -.Fl c -options may be given. -.It Fl i -Force -.Nm -to operate in interactive mode. Prompts will be written to the standard -output and commands read from the standard input. -.It Fl n -Output all host addresses in dotted\-quad numeric format rather than -converting to the canonical host names. -.It Fl p -Print a list of the peers known to the server as well as a summary of -their state. This is equivalent to the -.Em peers -interactive command. -.El -.Sh INTERNAL COMMANDS -.Pp -Interactive format commands consist of a keyword followed by zero to -four arguments. Only enough characters of the full keyword to uniquely -identify the command need be typed. The output of a command is normally -sent to the standard output, but optionally the output of individual -commands may be sent to a file by appending a -.Qq > , -followed by a file name, to the command line. -.Pp -A number of interactive format commands are executed entirely within the -.Nm -program itself and do not result in NTP mode 6 requests being sent to a -server. These are described following. -.Pp -.Bl -tag -width indent -.It ? Op Ar command_keyword -A -.Qq ? -by itself will print a list of all the command keywords -known to this incarnation of -.Nm Ns . -A -.Qq ? -followed by a command keyword will print function and -usage information about the command. This command is probably a better -source of information about -.Nm -than this manual page. -.It timeout Ar milliseconds -Specify a time out period for responses to server queries. The default -is about 5000 milliseconds. Note that since -.Nm -retries each query once after a time out the total waiting time for a -time out will be twice the time out value set. -.It delay Ar milliseconds -Specify a time interval to be added to timestamps included in requests -which require authentication. This is used to enable (unreliable) server -reconfiguration over long delay network paths or between machines whose -clocks are unsynchronized. Actually the server does not now require time -stamps in authenticated requests, so this command may be obsolete. -.It host Ar hostname -Set the host to which future queries will be sent. -.Ar Hostname -may be either a host name or a numeric -address. -.It Xo poll -.Op Ar # -.Op Ar verbose -.Xc -Poll the current server in client mode. The first argument is the number -of times to poll (default is 1) while the second argument may be given -to obtain a more detailed output of the results. This command is -currently just wishful thinking. -.It keyid Ar # -This command allows the specification of a key number to be used to -authenticate configuration requests. This must correspond to a key -number the server has been configured to use for this purpose. -.It passwd -This command prompts you to type in a password (which will not be -echoed) which will be used to authenticate configuration requests. The -password must correspond to the key configured for use by the NTP server -for this purpose if such requests are to be successful. -.It hostnames Ar yes | Ar no -If -.Ar yes -is specified, host names are printed in information -displays. If -.Ar no -is given, numeric addresses are printed -instead. The default is -.Ar yes -unless modified using the command line -.Fl n -switch. -.It raw -Cause all output from query commands is printed as received from the -remote server. The only formating/intepretation done on the data is to -transform non-ASCII data into a printable (but barely understandable) -form. -.It cooked -Cause output from query commands to be -.Qq cooked Ns . -Variables -which are recognized by the server will have their values reformatted -for human consumption. Variables which -.Nm -thinks should have a decodeable value but didn't are marked with a -trailing -.Qq ? Ns . -.It ntpversion Ar 1 | Ar 2 | Ar 3 -Set the NTP version number which -.Nm -claims in packets. Defaults to 3, Note that mode 6 control messages (and -modes, for that matter) didn't exist in NTP version 1. There appear to -be no servers left which demand version 1. -.It authenticate Ar yes | Ar no -Normally -.Nm -does not authenticate requests unless they are write requests. The -command -.Em authenticate yes -causes -.Nm -to send authentication with all requests it makes. Authenticated -requests causes some servers to handle requests slightly differently, -and can occasionally melt the CPU in fuzzballs if you turn -authentication on before doing a peer display. -.It Xo addvars -.Aq variable_name Ns -.Op = Ns Aq value Ns -.Op ,... -.Xc -.It Xo rmvars -.Aq variable_name Ns -.Op ,... -.Xc -.It clearvars -The data carried by NTP mode 6 messages consists of a list of items of -the form -.Xo Aq variable_name Ns -.Pf = Aq value -.Xc -where the -.Qq = Ns Aq value -is ignored, and can be omitted, in requests -to the server to read variables. -.Nm Ntpq -maintains an internal list in which data to be included in control -messages can be assembled, and sent using the -.Em readlist -and -.Em writelist -commands described below. The -.Em addvars -command allows variables and their optional values to be added to the -list. If more than one variable is to be added, the list should be -comma\-separated and not contain white space. The -.Em rmvars -command can be used to remove individual variables from the list, while -the -.Em clearlist -command removes all variables from the list. -.It debug Ar more | Ar less | Ar off -Turn internal query program debugging on and off. -.It quit -Exit -.Nm Ns . -.El -.Sh CONTROL MESSAGE COMMANDS -Each peer known to an NTP server has a 16 bit integer -.Em association identifier -assigned to it. NTP control messages which carry peer variables must -identify the peer the values correspond to by including its association -ID. An association ID of 0 is special, and indicates the variables are -system variables, whose names are drawn from a separate name space. -.Pp -Control message commands result in one or more NTP mode 6 messages being -sent to the server, and cause the data returned to be printed in some -format. Most commands currently implemented send a single message and -expect a single response. The current exceptions are the -.Em peers -command, which will send a preprogrammed series of messages to obtain -the data it needs, and the -.Em mreadlist -and -.Em mreadvar -commands, which will iterate over a range of associations. -.Bl -tag -width indent -.It associations -Obtain and print a list of association identifiers and peer statuses -for in\-spec peers of the server being queried. The list is printed in -columns. The first of these is an index numbering the associations from -1 for internal use, the second the actual association identifier -returned by the server and the third the status word for the peer. This -is followed by a number of columns containing data decoded from the -status word. Note that the data returned by the \*(L"associations\*(R" -command is cached internally in -.Nm Ns . -The index is then of use when dealing with stupid servers which use -association identifiers which are hard for humans to type, in that for -any subsequent commands which require an association identifier as an -argument, the form -.Em &index -may be used as an alternative. -.It lassocations -Obtain and print a list of association identifiers and peer statuses -for all associations for which the server is maintaining state. This -command differs from the -.Em associations -command only for servers -which retain state for out\-of\-spec client associations (i.e. -fuzzballs). Such associations are normally omitted from the display when -the -.Em associations -command is used, but are included in the -output of -.Em lassociations Ns . -.It passociations -Print association data concerning in\-spec peers from the internally -cached list of associations. This command performs identically to the -.Em associations -except that it displays the internally stored -data rather than making a new query. -.It lpassociations -Print data for all associations, including out\-of\-spec client -associations, from the internally cached list of associations. This -command differs from -.Em passociations -only when dealing with fuzzballs. -.It pstatus Ar assocID -Send a read status request to the server for the given association. The -names and values of the peer variables returned will be printed. Note -that the status word from the header is displayed preceding the -variables, both in hexadecimal and in pidgin English. -.It Xo readvar -.Op Ar assocID Ns -.Pf [ Aq variable_name Ns -.Op = Ns Aq value Ns -.Op ,...] -.Xc -Request that the values of the specified variables be returned by the -server by sending a read variables request. If the association ID is -omitted or is given as zero the variables are system variables, -otherwise they are peer variables and the values returned will be those -of the corresponding peer. Omitting the variable list will send a -request with no data which should induce the server to return a default -display. -.It Xo rv -.Op Ar assocID Ns -.Pf [ Aq variable_name Ns -.Op = Ns Aq value Ns -.Op ,...] -.Xc -An easy\-to\-type short form for the -.Em readvar -command. -.It Xo writevar -.Ar assocID -.Aq variable_name Ns -.Pf = Ns Aq value Ns -.Op ,... -.Xc -Like the -.Em readvar -request, except the specified variables are written instead of read. -.It readlist Op Ar assocID -Request that the values of the variables in the internal variable list -be returned by the server. If the association ID is omitted or is 0 the -variables are assumed to be system variables. Otherwise they are treated -as peer variables. If the internal variable list is empty a request is -sent without data, which should induce the remote server to return a -default display. -.It rl Op Ar assocID -An easy\-to\-type short form of the -.Em readlist -command. -.It writelist Op Ar assocID -Like the -.Em readlist -request, except the internal list variables are written instead of read. -.It Xo mreadvar -.Ar assocID assocID [ -.Aq variable_name Ns -.Op = Ns Aq value Ns -.Op ,...] -.Xc -Like the -.Em readvar -command except the query is done for each of a range of (nonzero) -association IDs. This range is determined from the association list -cached by the most recent -.Em associations -command. -.It Xo mrv -.Ar assocID assocID [ -.Aq variable_name Ns -.Op = Ns Aq value Ns -.Op ,...] -.Xc -An easy\-to\-type short form of the -.Em mreadvar -command. -.It mreadlist Ar assocID assocID -Like the -.Em readlist -command except the query is done for each of a range of (nonzero) -association IDs. This range is determined from the association list -cached by the most recent -.Em associations -command. -.It mrl Ar assocID assocID -An easy\-to\-type short form of the -.Em mreadlist -command. -.It Xo clockvar -.Op Ar assocID Ns -.Pf [ Aq variable_name Ns -.Op = Ns Aq value Ns -.Op ,...] -.Xc -Request that a list of the server's clock variables be sent. Servers -which have a radio clock or other external synchronization will respond -positively to this. If the association identifier is omitted or zero the -request is for the variables of the -.Qq system clock -and will -generally get a positive response from all servers with a clock. If the -server treats clocks as pseudo\-peers, and hence can possibly have more -than one clock connected at once, referencing the appropriate peer -association ID will show the variables of a particular clock. Omitting -the variable list will cause the server to return a default variable -display. -.It Xo cv -.Op Ar assocID Ns -.Pf [ Aq variable_name Ns -.Op = Ns Aq value Ns -.Op ,...] -.Xc -An easy\-to\-type short form of the -.Em clockvar -command. -.It peers -Obtain a list of in\-spec peers of the server, along with a summary of -each peer's state. Summary information includes the address of the -remote peer, the reference ID (0.0.0.0 if the refID is unknown), the -stratum of the remote peer, the type of the peer (local, unicast, -multicast or broadcast), when the last packet was received, the polling -interval, in seconds, the reachability register, in octal, and the -current estimated delay, offset and dispersion of the peer, all in -seconds. -.Pp -The character in the left margin indicates the fate of this peer in the -clock selection process. The codes mean: <sp> discarded due to high -stratum and/or failed sanity checks; -.Qq x -designated falsticker -by the intersection algorithm; -.Qq \&. -culled from the end of the -candidate list; -.Qq - -discarded by the clustering algorithm; -.Qq + -included in the final selection set; -.Qq # -selected -for synchronization but distance exceeds maximum; -.Qq * -selected -for synchronization; and -.Qq o -selected for synchronization, pps -signal in use. -.Pp -Note that since the -.Em peers -command depends on the ability to parse the values in the responses it -gets it may fail to work from time to time with servers which poorly -control the data formats. -.Pp -The contents of the host field may be one of four forms. It may be a -host name, an IP address, a reference clock implementation name with its -parameter or -.Qq REFCLK(<implementation number>, <parameter>) . -On -.Qq hostnames no -only IP\-addresses will be displayed. -.It lpeers -Like -.Em peers , -except a summary of all associations for which the server is maintaining -state is printed. This can produce a much longer list of peers from -fuzzball servers. -.It opeers -An old form of the -.Em peers -command with the reference ID -replaced by the local interface address. -.El -.Sh HISTORY -Written by -.An Dennis Ferguson -at the University of Toronto. -.Sh BUGS -The -.Em peers -command is non\-atomic and may occasionally result in spurious error -messages about invalid associations occurring and terminating the -command. -.Pp -The timeout time is a fixed constant, which means you wait a long time -for time outs since it assumes sort of a worst case. The program should -improve the time out estimate as it sends queries to a particular host, -but doesn't. diff --git a/usr.sbin/xntpd/doc/ntptrace.8 b/usr.sbin/xntpd/doc/ntptrace.8 deleted file mode 100644 index 1ef35959cb59..000000000000 --- a/usr.sbin/xntpd/doc/ntptrace.8 +++ /dev/null @@ -1,65 +0,0 @@ -.\" -.\" $FreeBSD$ -.\" -.Dd December 21, 1993 -.Dt NTPTRACE 8 -.Os -.Sh NAME -.Nm ntptrace -.Nd "trace a chain of NTP hosts back to their master time source" -.Sh SYNOPSIS -.Nm ntptrace -.Op Fl vdn -.Op Fl r Ar retries -.Op Fl t Ar timeout -.Op Ar server -.Sh DESCRIPTION -.Nm Ntptrace -determines where a given Network Time Protocol (NTP) server gets -its time from, and follows the chain of NTP servers back to their -master time source. -If given no arguments, it starts with -.Dq localhost . -.Pp -Here is an example of the output from -.Nm Ns : -.Bd -literal -% ntptrace -localhost: stratum 4, offset 0.0019529, synch distance 0.144135 -server2.bozo.com: stratum 2, offset 0.0124263, synch distance 0.115784 -h.edu: stratum 1, offset 0.0019298, synch distance 0.011993, refid 'WWVB' -.Ed -.Pp -On each line, the fields are (left to right): the host name, the -host's stratum, -the time offset between that host and the local host -(as measured by -.Nm Ns ; -this is why it is not always zero for -.Dq localhost ) , -the host's -.Dq synchronization distance , -and (only for stratum-1 servers) the reference clock ID. All times -are given in seconds. (Synchronization distance is a measure of the -goodness of the clock's time.) -.Sh OPTIONS -The following options are available: -.Bl -tag -width indent -.It Fl d -Turn on some debugging output. -.It Fl n -Turn off the printing of host names; instead, host IP addresses -are given. This may be necessary if a nameserver is down. -.It Fl r Ar retries -Set the number of retransmission attempts for each host; the default is 5. -.It Fl t Ar timeout -Set the retransmission timeout (in seconds); the default is 2. -.It Fl v -Print verbose information about the NTP servers. -.El -.Sh SEE ALSO -.Xr xntpd 8 , -.Xr xntpdc 8 -.Sh BUGS -This program makes no attempt to improve accuracy by doing multiple -samples. diff --git a/usr.sbin/xntpd/doc/tickadj.8 b/usr.sbin/xntpd/doc/tickadj.8 deleted file mode 100644 index 4ba5a090831e..000000000000 --- a/usr.sbin/xntpd/doc/tickadj.8 +++ /dev/null @@ -1,124 +0,0 @@ -.\" $FreeBSD$ -.\" -.Dd December 21, 1993 -.Dt TICKADJ 8 -.Os -.Sh NAME -.Nm tickadj -.Nd fiddle time\-related variables in the kernel -.Sh SYNOPSIS -.Nm tickadj -.Op Fl Adkpqs -.Op Fl a Ar new_tickadj -.Op Fl t Ar new_tick -.Sh DESCRIPTION -The -.Nm -program reads, and optionally modifies, several time\-keeping\-related -variables in the running kernel, via -.Pa /dev/kmem . -The particular variables it is concerned with are -.Em tick , -which is the number of microseconds added to the system time during a -clock interrupt, -.Em tickadj , -which sets the slew rate and resolution used by the -.Xr adjtime 2 -system call, and -.Em dosynctodr , -which indicates to the kernels on some machines whether they should internally -adjust the system clock to keep it in line with time\-of\-day clock -or not. -.Pp -By default, with no arguments, -.Nm -reads the variables of interest in the kernel and prints them. At the -same time it determines an -.Qq optimal -value for the value of the -.Em tickadj -variable if the intent is to run the -.Xr xntpd 8 -Network Time Protocol daemon, and prints this as well. Since the operation -of -.Nm -when reading the kernel mimics the operation of similar parts of the -.Xr xntpd 8 -program fairly closely, this is useful for doing debugging of problems -with -.Xr xntpd 8 Ns . -.Pp -Various flags may be specified to change the variables of interest in -the running kernel: -.Bl -tag -width indent -.It Fl a Ar new_tickadj -Allow one to set the variable -.Em tickadj -to the value specified as an argument. -.It Fl A -Cause -.Em tickadj -to be modified, but instead will set it to the internally computed -.Qq optimal -value. -.It Fl d -Add debugging information. -.It Fl k -Use -.Pa /dev/kmem -instead of -.Pa /kernel . -This is the default. -.It Fl p -Tell -.Nm -to set the value of the variable -.Em noprintf -to one. -.It Fl q -Tell -.Nm -to shut up about everything except errors. Normally -.Nm -is quite verbose about what it is doing. -.It Fl s -Tell -.Nm -to set the value of the variable -.Em dosynctodr -to zero, a prerequisite for running the -.Xr xntpd 8 -daemon under SunOS 4.0. -.It Fl t Ar new_tick -May be used to reset the kernel's value of -.Em tick , -a capability which is useful on machines with very broken clocks. -.El -.Pp -Note that -.Nm -should be run with some caution when being used for the first time on -different types of machines. The operations which -.Nm -trys to perform are not guaranteed to work on all Unix machines. -.Sh FILES -.Bl -tag -width /dev/kmem -compact -.It Pa /kernel -.It Pa /dev/kmem -.El -.Sh SEE ALSO -.Xr xntpd 8 -.Sh HISTORY -Written by -.An Dennis Ferguson -at the University of Toronto. -.Sh BUGS -Fiddling with kernel variables at run time as a part of ordinary -operations is a hideous practice which is only necessary to make -up for deficiencies in the implementation of -.Xr adjtime 2 -in many kernels and/or brokenness of the system clock in some -vendors' kernels. It would be much better if the kernels were fixed -and the -.Nm -program went away. diff --git a/usr.sbin/xntpd/doc/xntpd.8 b/usr.sbin/xntpd/doc/xntpd.8 deleted file mode 100644 index a4a290c77e5a..000000000000 --- a/usr.sbin/xntpd/doc/xntpd.8 +++ /dev/null @@ -1,1075 +0,0 @@ -.\" -.\" $FreeBSD$ -.\" -.Dd December 21, 1993 -.Dt XNTPD 8 -.Os -.Sh NAME -.Nm xntpd -.Nd Network Time Protocol daemon -.Sh SYNOPSIS -.Nm xntpd -.Op Fl abdm -.Op Fl c Ar conffile -.Op Fl e Ar authdelay -.Op Fl f Ar driftfile -.Op Fl k Ar keyfile -.Op Fl p Ar pidfile -.Op Fl r Ar broadcastdelay -.Op Fl s Ar statsdir -.Op Fl t Ar trustedkey -.Op Fl v Ar variable -.Op Fl V Ar variable -.Sh DESCRIPTION -.Nm Xntpd -is a daemon which sets and maintains a Unix system time\-of\-day in -agreement with Internet standard time servers. -.Nm Xntpd -is a complete implementation of the Network Time Protocol (NTP) version -3 standard, as defined by RFC 1305, but also retains compatibility with -version 1 and 2 servers as defined by RFC 1059 and RFC 1119, -respectively. -.Nm Xntpd -does all computations in fixed point arithmetic and requires no floating -point code. The computations done in the protocol and clock adjustment -code are carried out with high precision and with attention to the -details which might introduce systematic bias into the computations, to -try to maintain an accuracy suitable for synchronizing with even the -most precise external time source. -.Pp -Ordinarily, -.Nm -reads its configuration from a configuration file at startup time. The -default configuration file name is -.Pa /etc/ntp.conf , -although this may be overridden from the command line. It is also -possible to specify a working, although limited, -.Nm -configuration entirely on the command line, obviating the need for a -configuration file. This may be particularly appropriate when -.Nm -is to be configured as a broadcast or multicast client, with all peers -being determined by listening to broadcasts at run time. Various -internal -.Nm -variables can be displayed and configuration options altered while the -daemon is running through use of the -.Xr ntpq 8 -and -.Xr xntpdc 8 -programs. -.Pp -The daemon can operate in any of several modes, including symmetric -active/passive, client/server and broadcast/multicast. A -broadcast/multicast client can automatically discover remote servers, -compute one-way delay correction factors and configure itself -automatically. This makes it possible to deploy a fleet of workstations -without specifying a configuration file or configuration details -specific to its environment. -.Pp -The following command line arguments are understood by -.Nm -(see the configuration file description for a more complete functional -description): -.Bl -tag -width indent -.It Fl a -Run in -.Qq "authenticate" -mode. -.It Fl b -Listen for broadcast NTP and sync to this if available. -.It Fl c -Specify an alternate configuration file. -.It Fl d -Specify debugging mode. This flag may occur multiple times, with each -occurance indicating greater detail of display. -.It Fl e -Specify the time (in seconds) it takes to compute the NTP encryption -field on this computer. -.It Fl f Ar driftfile -Specify the location of the drift file. -.It Fl k -Specify the location of the file which contains the NTP authentication -keys. -.It Fl m -Listen for multicast messages and synchronize to them if available -(requires multicast kernel). -.It Fl p -Specify the name of the file to record the daemon's process id. -.It Fl r -Ordinarily, the daemon automatically compensates for the network delay -between the broadcast/multicast server and the client; if the -calibration procedure fails, use the specified the default delay (in -seconds). -.It Fl s -Specify the directory to be used for creating statistics files. -.It Fl t Ar trustedkey -Add a key number to the trusted key list. -.It Fl v -Add a system variable. -.It Fl V -Add a system variable listed by default. -.El -.Sh "CONFIGURATION OPTIONS" -.Nm Xntpd Ns 's -configuration file format is similar to other Unix configuration files. -Comments begin with a -.Qq # -character and extend to the end of the -line. Blank lines are ignored. Configuration commands consist of an -initial keyword followed by a list of arguments, some of which may be -optional, separated by whitespace. These commands may not be continued -over multiple lines. Arguments may be host names, host addresses written -in numeric, dotted\-quad form, integers, floating point numbers (when -specifying times in seconds) and text strings. Optional arguments are -delimited by -.Qq [] -in the following descriptions, while -alternatives are separated by -.Qq \&| . -.Pp -.Bl -tag -width indent -.It Xo peer -.Ar host_address -.Op key Ar # -.Op version Ar # -.Op prefer -.Xc -.It Xo server -.Ar host_address -.Op key Ar # -.Op version Ar # -.Op prefer -.Xc -.It Xo broadcast -.Ar host_address -.Op key Ar # -.Op version Ar # -.Op ttl Ar # -.Xc -.Pp -These three commands specify various time servers to be used and/or time -services to be provided. The -.Em peer -command specifies that the local server is to operate in -.Qq symmetric active -mode with the remote server -.Ar host_address -named in the command. In this mode the local server can be synchronized -to the remote server and, in addition, the remote server can be -synchronized by the local server. This is useful in a network of servers -where, depending on various failure scenarios, either the local or -remote server host may be the better source of time. The -.Em server -command specifies that the local server is to operate in -.Qq client -mode with the remote server named in the command. In -this mode the local server can be synchronized to the remote server, but -the remote server can never be synchronized to the local server. The -.Em broadcast -command specifies that the local server is to operate in -.Qq broadcast -mode where the local server sends periodic broadcast -messages to a client population at the broadcast/multicast address named -in the command. Ordinarily, this specification applies only to the local -server operating as a transmitter; for operation as a broadcast client, -see the -.Em broadcastclient -or -.Em multicastclient -commands elsewhere in this document. In this mode the -.Ar host_address -is usually the broadcast address on [one of] the local network[s] or a -multicast address assigned to NTP. The Numbers Czar has assigned the -address 224.0.1.1 to NTP; this is presently the only number that should -be used. Note that the use of multicast features requires a multicast -kernel, which is not yet ubiquitous in vendor products. -.Pp -The -.Ar key -option, when included, indicates that all packets sent to the address -are to include authentication fields encrypted using the specified key -number (the range of which is that of an unsigned 32 bit integer). The -default is to not include an encryption field. The -.Ar version -option allows one to specify the version number to be used for outgoing -NTP packets. Versions 1, 2, and 3 are the choices, version 3 is the -default. The -.Ar prefer -option marks the host as a preferred host. All other things being equal, -this host will be chosen for synchronization among a set of correctly -operating hosts. The -.Ar ttl -option is used only with the broadcast mode. It specifies the time-to-live -(TTL) to use on multicast packets. Selection of the proper value, -which defaults to 127, is something of a black art and must be -coordinated with the network admistrator(s). -.It broadcastclient -This directs the local server to listen for broadcast messages on the -local network, in order to discover other servers on the same subnet. -Upon hearing a broadcast message for the first time, the local server -measures the nominal network delay using a brief client/server exchange -with the remote server, then enters the -.Qq broadcastclient -mode, -in which it listens for and synchronizes to succeeding broadcast -messages. Note that, in order to avoid accidental or malicious -disruption in this mode, both the local and remote servers must operate -using authentication with the same trusted key and key identifier. -.It multicastclient Op Ar IP address ... -This command is used in the same way as the -.Em broadcastclient -command, but operates using IP multicasting. Support for this function -requires a multicast kernel and the use of authentication. If one or -more IP addresses are given, the server joins the respective multicast -group(s). If none are given, the IP address assigned to NTP (224.0.1.1) -is assumed. -.It driftfile Ar filename -This command specifies the name of the file used to record the frequency -offset of the local clock oscillator. If the file exists, it is read at -startup in order to set the initial frequency offset and then updated -once per hour with the current offset computed by the daemon. If the -file does not exist or this command is not given, the initial frequency -offset is assumed zero. In this case, it may take some hours for the -frequency to stabilize and the residual timing errors to subside. The -file contains a single floating point value equal to the offset in -parts-per-million (ppm). Note that the file is updated by first writing -the current drift value into a temporary file and then using -.Xr rename 2 -to replace the old version. This implies that -.Nm -must have write permission for the directory the drift file is located -in, and that file system links, symbolic or otherwise, should probably -be avoided. -.It enable Ar auth|bclient|pll|monitor|stats Op Ar ... -Provide a way to enable various server options. Flags not mentioned are -unaffected. The -.Ar auth -flag causes the server to synchronize -with unconfigured peers only if the peer has been correctly -authenticated using a trusted key and key identifier. The default for -this flag is disable (off). The -.Ar bclient -flag causes the server -to listen for a message from a broadcast or multicast server, following -which an association is automatically instantiated for that server. The -default for this flag is disable (off). The -.Ar pll -flag enables -the server to adjust its local clock, with default enable (on). If not -set, the local clock free-runs at its intrinsic time and frequency -offset. This flag is useful in case the local clock is controlled by -some other device or protocol and NTP is used only to provide -synchronization to other clients. The -.Ar monitor -flag enables the -monitoring facility (see elsewhere), with default enable (on). The -.Ar stats -flag enables statistics facility filegen (see -description elsewhere.), with default enable (on). -.It disable Ar auth|bclient|pll|monitor|stats Op Ar ... -Provide a way to disable various server options. Flags not mentioned -are unaffected. The flags presently available are described under the -enable command. -.El -.Sh "AUTHENTICATION OPTIONS" -.Bl -tag -width indent -.It keys Ar filename -This command specifies the name of a file which contains the encryption -keys and key identifiers used by -.Nm -when operating in authenticated mode. The format of this file is -described later in this document. -.It trustedkey Ar # Op Ar # ... -This command is used to specify the encryption key identifiers which are -trusted for the purposes of authenticating peers suitable for -sychonization. The authentication procedures require that both the local -and remote servers share the same key and key identifier for this -purpose, although different keys can be used with different servers. The -arguments are 32 bit unsigned integers. Note, however, that NTP key 0 is -fixed and globally known. If meaningful authentication is to be -performed the 0 key should not be trusted. -.It requestkey Ar # -This command specifies the key identifier to use with the -.Xr xntpdc 8 -program, which is useful to diagnose and repair problems that affect -.Nm -operation. The operation of the -.Nm xntpdc -program are specific to this particular implementation of -.Nm -and can -be expected to work only with this and previous versions of the daemon. -Requests from a remote -.Nm xntpdc -program which affect the state of the -local server must be authenticated, which requires bot the remote -program and local server share a common key and key identifier. The -argument to this command is a 32 bit unsigned integer. If no -.Em controlkey -command is included in the configuration file, or if the keys don't -match, such requests will be ignored. -.It controlkey Ar # -This command specifies the key identifier to use with the -.Xr ntpq 8 -program, which is useful to diagnose and repair problems that affect -.Nm -operation. The operation of the -.Nm ntpq -program and -.Nm -conform to those specified in RFC 1305. Requests from a remote -.Nm ntpq -program which affect the state of the local server must be -authenticated, which requires bot the remote program and local server -share a common key and key identifier. The argument to this command is a -32 bit unsigned integer. If no -.Em requestkey -command is included in the configuration file, or if the keys don't -match, such requests will be ignored. -.It authdelay Ar seconds -Indicate the amount of time it takes to encrypt an NTP authentication -field on the local computer. This value is used to correct transmit -timestamps when the authentication is used on outgoing packets. The -value usually lies somewhere in the range 0.0001 seconds to 0.003 -seconds, though it is very dependent on the CPU speed of the host -computer. The value is usually computed using the -.Em authspeed -program included with the distribution. -.El -.Sh "ACCESS CONTROL OPTIONS" -.Bl -tag -width indent -.It Xo restrict -.Ar address -.Op mask Ar numeric_mask -.Op Ar flag -.Op Ar ... -.Xc -.Nm Xntpd -implements a general purpose address\-and\-mask based restriction list. -The list is sorted by address and by mask, and the list is searched in -this order for matches, with the last match found defining the -restriction flags associated with the incoming packets. The source -address of incoming packets is used for the match, with the 32 bit -address being and'ed with the mask associated with the restriction entry -and then compared with the entry's address (which has also been and'ed -with the mask) to look for a match. The -.Em mask -argument defaults -to 255.255.255.255, meaning that the -.Em address -is treated as the -address of an individual host. A default entry (address 0.0.0.0, mask -0.0.0.0) is always included and, given the sort algorithm, is always the -first entry in the list. Note that, while -.Em address -is normally -given in dotted\-quad format, the text string -.Em default , -with no -mask option, may be used to indicate the default entry. -.Pp -In the current implementation, flags always restrict access, i.e. an -entry with no flags indicates that free access to the server is to be -given. The flags are not orthogonal, in that more restrictive flags will -often make less restrictive ones redundant. The flags can generally be -classed into two catagories, those which restrict time service and those -which restrict informational queries and attempts to do run time -reconfiguration of the server. One or more of the following flags may be -specified: -.Bl -tag -width indent -.It ignore -Ignore all packets from hosts which match this entry. If this flag is -specified neither queries nor time server polls will be responded to. -.It noquery -Ignore all NTP mode 6 and 7 packets (i.e. information queries and -configuration requests) from the source. Time service is not affected. -.It nomodify -Ignore all NTP mode 6 and 7 packets which attempt to modify the state of -the server (i.e. run time reconfiguration). Queries which return -information are permitted. -.It notrap -Decline to provide mode 6 control message trap service to matching -hosts. The trap service is a subsystem of the mode 6 control message -protocol which is intended for use by remote event logging programs. -.It lowpriotrap -Declare traps set by matching hosts to be low priority. The number of -traps a server can maintain is limited (the current limit is 3). Traps -are usually assigned on a first come, first served basis, with later -trap requestors being denied service. This flag modifies the assignment -algorithm by allowing low priority traps to be overridden by later -requests for normal priority traps. -.It noserve -Ignore NTP packets whose mode is other than 6 or 7. In effect, time -service is denied, though queries may still be permitted. -.It nopeer -Provide stateless time service to polling hosts, but do not allocate -peer memory resources to these hosts even if they otherwise might be -considered useful as future synchronization partners. -.It notrust -Treat these hosts normally in other respects, but never use them as -synchronization sources. -.It limited -These hosts are subject to limitation of number of clients from the same -net. Net in this context refers to the IP notion of net (class A, class -B, class C, etc.). Only the first -.Qq client_limit -hosts that have -shown up at the server and that have been active during the last -.Qq client_limit_period -seconds are accepted. Requests from other -clients from the same net are rejected. Only time request packets are -taken into account. -.Qq Private , -.Qq control , -and -.Qq broadcast -packets are not subject to client limitation and -therefore are not contributing to client count. History of clients is -kept using the monitoring capability of -.Nm Ns . -Thus, monitoring is active as long as there is a restriction entry with -the -.Qq limited -flag. The default value for -.Qq client_limit -is 3. The default value for -.Qq client_limit_period -is 3600 seconds. -.It ntpport -This is actually a match algorithm modifier, rather than a restriction -flag. Its presence causes the restriction entry to be matched only if -the source port in the packet is the standard NTP UDP port (123). Both -.Qq ntpport -and -.Pf non\- Qq ntpport -may be specified. The -.Qq ntpport -is considered more specific and is sorted later in the -list. -.El -.Pp -Default restriction list entries, with the flags -.Qq ignore , -.Qq ntpport , -for each of the local host's interface addresses are -inserted into the table at startup to prevent the server from attempting -to synchronize to its own time. A default entry is also always present, -though if it is otherwise unconfigured no flags are associated with the -default entry (i.e. everything besides your own NTP server is -unrestricted). -.Pp -The restriction facility was added to allow the current access policies -of the time servers running on the NSFnet backbone to be implemented -with -.Nm -as well. While this facility may be otherwise useful for keeping -unwanted or broken remote time servers from affecting your own, it -should not be considered an alternative to the standard NTP -authentication facility. Source address based restrictions are easily -circumvented by a determined cracker. -.It clientlimit Ar limit -Set -.Qq client_limit -to -.Ar limit , -allow configuration of -client limitation policy. This variable defines the number of clients -from the same network that are allowed to use the server. -.It clientperiod Ar period -Set -.Qq client_limit_period , -allow configuration of client -limitation policy. This variable specifies the number of seconds after -which a client is considered inactive and thus no longer is counted for -client limit restriction. -.El -.Sh "MONITORING OPTIONS" -.Bl -tag -width indent -.It statsdir Ar /directory path/ -Indicate the full path of a directory where statistics files should be -created (see below). This keyword allows the (otherwise constant) -filegen filename prefix to be modified for file generation sets used for -handling statistics logs (see -.Em filegen -statement below). -.It statistics Ar name Ns ... -Enable writing of statistics records. Currently, three kinds of -statistics are supported: -.Bl -tag -width indent -.It loopstats -Enable recording of loop filter statistics information. Each update of -the local clock outputs a line of the following form to the file -generation set named -.Qq loopstats : -.Dl 48773 10847.650 0.0001307 17.3478 2 -The first two fields show the date (Modified Julian Day) and time -(seconds and fraction past UTC midnight). The next three fields show -time offset in seconds, frequency offset in parts-per-million and time -constant of the clock-discipline algorithm at each update of the clock. -.It peerstats -Enable recording of peer statistics information. This includes -statistics records of all peers of a NTP server and of the 1-pps signal, -where present and configured. Each valid update appends a line of the -following form to the current element of a file generation set named -.Qq peerstats : -.Dl 48773 10847.650 127.127.4.1 9714 -0.001605 0.00000 0.00142 -The first two fields show the date (Modified Julian Day) and time -(seconds and fraction past UTC midnight). The next two fields show the -peer address in dotted-quad notation and status, respectively. The -status field is encoded in hex in the format described in Appendix A of -the NTP specification RFC 1305. The final three fields show the offset, -delay and dispersion, all in seconds. -.It clockstats -Enable recording of clock driver statistics information. Each update -received from a clock driver outputs a line of the following form to the -file generation set named -.Qq clockstats : -.Dl 49213 525.624 127.127.4.1 93 226 00:08:29.606 D -The first two fields show the date (Modified Julian Day) and time -(seconds and fraction past UTC midnight). The next field shows the clock -address in dotted-quad notation, The final field shows the last timecode -received from the clock in decoded -.Tn ASCII -format, where meaningful. In -some clock drivers a good deal of additional information can be gathered -and displayed as well. See information specific to each clock for -further details. -.El -.Pp -Statistic files are managed using file generation sets (see -.Em filegen -below). The information obtained by enabling statistics recording allows -analysis of temporal properties of a -.Nm -server. It is usually only useful to primary servers or maybe main -campus servers. -.It Xo filegen -.Ar name -.Op file Ar filename -.Op type Ar typename -.Op flag Ar flagval -.Op link | nolink -.Op enable | disable -.Xc -Configure setting of generation file set -.Ar name . -Generation file sets provide a means for handling files that are -continously growing during the lifetime of a server. Server statistics -are a typical example for such files. Generation file sets provide -access to a set of files used to store the actual data. At any time at -most one element of the set is being written to. The -.Em type -given specifies when and how data will be directed to a new element of -the set. This way, information stored in elements of a file set that are -currently unused are available for administrational operations without -the risc of desturbing the operation of -.Nm Ns . -(Most important: they can be removed to free space for new data -produced.) Filenames of set members are built from three elements: -.Bl -tag -width indent -.It prefix -This is a constant filename path. It is not subject to modifications via -the -.Em filegen -statement. It is defined by the server, usually specified as a compile -time constant. It may, however, be configurable for individual file -generation sets via other commands. For example, the prefix used with -.Qq loopstats -and -.Qq peerstats -filegens can be configured using the -.Em statsdir -statement explained above. -.It filename -This string is directly concatenated to the -.Em prefix -mentioned above (no intervening -.Sq / -(slash)). This can be -modified using the -.Ar file -argument to the -.Em filegen -statement. No -.Qq .. -elements are allowed in this component to -prevent filenames referring to parts outside the filesystem hierarchy -denoted by -.Em prefix . -.It suffix -This part is reflects individual elements of a file set. It is generated -according to the -.Em type -of a file set as explained below. -.El -.Pp -A file generation set is characterized by its type. The following types -are supported: -.Bl -tag -width indent -.It none -The file set is actually a single plain file. -.It pid -One element of file set is used per incarnation of a -.Nm -server. This type does not perform any changes to file set members -during runtime, however it provides an easy way of seperating files -belonging to different -.Nm -server incarnations. The set member filename is built by appending a dot -.Pf ( Sq \&. Ns ) -to concatentated -.Em prefix -and -.Em filename -strings, and appending the decimal representation of the process id of -the -.Nm -server process. -.It day -One file generation set element is created per day. The term -.Em day -is based on -.Tn UTC . -A day is defined as the period between 00:00 and 24:00 -.Tn UTC . -The file set -member suffix consists of a dot -.Pf ( Qq \&. Ns ) -and a day specification in -the form -.Aq YYYYMMDD . -.Em YYYY -is a 4 digit year number (e.g. 1992). -.Em MM -is a two digit month number. -.Em DD -is a two digit day number. Thus, all information written at December -10th, 1992 would end up in a file named -.Qq <prefix><filename>.19921210 . -.It week -Any file set member contains data related to a certain week of a year. -The term -.Em week -is definied by computing -.Qq day of year -modulo 7. Elements of -such a file generation set are distinguished by appending the following -suffix to the file set filename base: a dot, a four digit year number, -the letter -.Qq W , -and a two digit week number. For example, -information from Jamuary, 10th 1992 would end up in a file with suffix -.Qq .1992W1 . -.It month -One generation file set element is generated per month. The file name -suffix consists of a dot, a four digit year number, and a two digit -month. -.It year -One generation file element is generated per year. The filename suffix -consists of a dot and a 4 digit year number. -.It age -This type of file generation sets changes to a new element of the file -set every 24 hours of server operation. The filename suffix consists of -a dot, the letter -.Qq a , -and an eight digit number. This number is -taken to be the number of seconds the server is running at the start of -the corresponding 24 hour period. -.El -.Pp -Information is only written to a file generation set when this set is -.Qq enabled . -Output is prevented by specifying -.Qq disabled . -.Pp -It is convenient to be able to access the -.Em current -element of a file generation set by a fixed name. This feature is -enabled by specifying -.Qq link -and disabled using -.Qq nolink . -If -.Qq link -is specified, a hard link from the -current file set element to a file without suffix is created. When there -is already a file with this name and the number of links of this file is -one, it is renamed appending a dot, the letter -.Qq C , -and the pid -of the -.Nm -server process. When the number of links is greater than one, the file -is unlinked. This allows the current file to be accessed by a constant -name. -.El -.Sh "MISCELLANEOUS OPTIONS" -.Bl -tag -width indent -.It precision Ar # -This command specifies the nominal precision of the local clock. The -value is an integer approximately equal to the base 2 logarithm of the -local timekeeping precision in seconds. Normally, the daemon determines -the precision automatically at startup, so this command is necessary -only in special cases when the precision cannot be determined -automatically. -.It broadcastdelay Ar seconds -The broadcast and multicast modes require a special calibration to -determine the network delay between the local and remote servers. -Ordinarily, this is done automatically by the initial protocol exchanges -between the local and remote servers. In some cases, the calibration -procedure may fail due to network or server access controls, for -example. This command specifies the default delay to be used under these -circumstances. Typically (for Ethernet), a number between 0.003 and -0.007 seconds is appropriate. The default when this command is not used -is 0.004 seconds. -.It Xo trap -.Ar host_address -.Op port Ar port_number -.Op interface Ar interface_addess -.Xc -This command configures a trap receiver at the given host address and -port number for sending messages with the specified local interface -address. If the port number is unspecified a value of 18447 is used. If -the interface address is not specified the message is sent with a source -address which is that of the local interface the message is sent -through. Note that on a multihomed host the interface used may vary from -time to time with routing changes. -.Pp -The trap receiver will generally log event messages and other -information from the server in a log file. While such monitor programs -may also request their own trap dynamically, configuring a trap receiver -will ensure that no messages are lost when the server is started. -.It Xo setvar -.Ar variable -.Op Ar default -.Xc -This command adds an additional system variable. These variables can be -used to distribute additional information such as the access policy. If -the variable of the form <name>=<value> is followed by the -.Em default -keyword the variable will be listed as part of the default system -variables -.Pf ( Nm ntpq -rv command). These additional variables serve informational purposes only. -They are not related to the protocol other that they can be listed. The -known protocol variables will always overide any variables defined via -the -.Em setvar -mechanism. -.Pp -There are three special variables that contain the names of all variable -of the same group. The -.Em sys_var_list -holds the names of all system variables. The -.Em peer_var_list -holds the names of all peer variables and the -.Em clock_var_list -hold the names of the reference clock variables. -.It monitor Ar yes|no -.It authenticate Ar yes|no -These commands have been superseded by the -.Em enable -and -.Em disable -commands. They are listed here for historical purposes. -.El -.Sh "AUTHENTICATION KEY FILE FORMAT" -The -.Tn NTP -standard specifies an extension allowing verification of the -authenticity of received NTP packets, and to provide an indication of -authenticity in outgoing packets. This is implemented in -.Nm -using the DES or MD5 algorithms to compute a digital signature, or -message-digest. The specification allows any one of possibly 4 billion -keys, numbered with 32 bit key identifiers, to be used to authenticate -an association. The servers involved in an association must agree on the -key and key identifier used to authenticate their data, though they must -each learn the key and key identifer independently. In the case of DES, -the keys are 56 bits long with, depending on type, a parity check on -each byte. In the case of MD5, the keys are 64 bits (8 bytes). -.Nm Xntpd -reads its keys from a file specified using the -.Fl k -command line option or the -.Em keys -statement in the configuration file. While key number 0 is fixed by the -.Tn NTP -standard (as 56 zero bits) and may not be changed, one or more of -the keys numbered 1 through 15 may be arbitrarily set in the keys file. -.Pp -The key file uses the same comment conventions as the configuration -file. Key entries use a fixed format of the form: -.Pp -.Dl keyno type key -.Pp -where -.Em keyno -is a positive integer, -.Em type -is a single -character which defines the format the key is given in, and -.Em key -is the key itself. -.Pp -The key may be given in one of three different formats, controlled by -the -.Em type -character. The three key types, and corresponding -formats, are listed following: -.Bl -tag -width indent -.It S -The -.Em key -is a 64 bit hexadecimal number in the format specified -in the DES document, that is the high order 7 bits of each octet are -used to form the 56 bit key while the low order bit of each octet is -given a value such that odd parity is maintained for the octet. Leading -zeroes must be specified (i.e. the key must be exactly 16 hex digits -long) and odd parity must be maintained. Hence a zero key, in standard -format, would be given as -.Em 0101010101010101 . -.It N -The -.Em key -is a 64 bit hexadecimal number in the format specified -in the -.Tn NTP -standard. This is the same as the DES format except the bits -in each octet have been rotated one bit right so that the parity bit is -now the high order bit of the octet. Leading zeroes must be specified -and odd parity must be maintained. A zero key in NTP format would be -specified as -.Em 8080808080808080 . -.It A -The -.Em key -is a 1\-to\-8 character -.Tn ASCII -string. A key is formed from this by using the lower order 7 bits of the -.Tn ASCII -representation of -each character in the string, with zeroes being added on the right when -necessary to form a full width 56 bit key, in the same way that -encryption keys are formed from Unix passwords. -.It M -The -.Em key -is a 1\-to\-8 character -.Tn ASCII -string, using the MD5 -authentication scheme. Note that both the keys and the authentication -schemes (DES or MD5) must be identical between a set of peers sharing -the same key number. -.El -.Pp -One of the keys may be chosen, -by way of the configuration file -.Em requestkey -statement, to authenticate run time configuration requests made using -the -.Xr xntpdc 8 -program. The latter program obtains the key from the terminal as a -password, so it is generally appropriate to specify the key chosen to be -used for this purpose in -.Tn ASCII -format. -.Sh PRIMARY CLOCK SUPPORT -.Nm Xntpd -can be optionally compiled to include support for a number of types of -reference clocks. A reference clock will generally (though not always) -be a radio timecode receiver which is synchronized to a source of -standard time such as the services offered by the NRC in Canada and NIST -in the U.S. The interface between the computer and the timecode receiver -is device dependent and will vary, but is often a serial port. -.Pp -Support for the various reference clock drivers is conditionally -compiled using the compiler define codes described elsewhere. An attempt -to configure a reference clock when specific support is not available or -the hardware port has not been appropriately configured results in a -scolding remark to the system log file, but is otherwise non hazardous. -.Pp -For the purposes of configuration, -.Nm -treats reference clocks in a manner analogous to normal -.Tn NTP -peers as -much as possible. Reference clocks are referred to by address, much as a -normal peer is, though an invalid IP address is used to distinguish them -from normal peers. Reference clock addresses are of the form -.Em 127.127.t.u -where -.Em t -is an integer denoting the clock type and -.Em u -indicates the type\-specific unit number. Reference clocks are -configured using a -.Em server -statement in the configuration file where the -.Em host_address -is the clock address. The -.Em key, -.Em version -and -.Em ttl -options are not used for reference clock support; however, the -.Em prefer -option can be useful to persuade the server to cherish a reference clock -with somewhat more enthusiasm than other reference clocks or peers, if -this is advisable. Clock addresses may generally be used anywhere in the -configuration file a normal IP address can be used, for example, in -.Em restrict -statements, although such use would normally be considered strange. -.Pp -Reference clock support provides the -.Em fudge -command, which can be used to configure reference clocks in special -ways. Following is the generic format that applies to this command: -.Pp -fudge -.Ar 127.127.t.u -.Op time1 Ar secs -.Op time2 Ar secs -.Op stratum Ar int -.Op refid Ar int -.Op flag1 Ar 0|1 -.Op flag2 Ar 0|1 -.Op flag3 Ar 0|1 -.Op flag4 Ar 0|1 -.Pp -The -.Em time1 -and -.Em time2 -options are specified in fixed point seconds and used in some clock -drivers as calibration constants. By convention, and unless indicated -otherwise, -.Em time1 -is used as a calibration constant to adjust the nominal time offset of a -particular clock to agree with an external standard, such as a precision -PPS signal. The specified offset is in addition to the propagation delay -provided by other means, such as internal DIPswitches. The -.Em stratum -option is a number in the range zero to 15 and is used to assign a -nonstandard operating stratum to the clock. The -.Em refid -option is an -.Tn ASCII -string in the range one to four characters and is -used to assign a nonstandard reference identifier to the clock. Finally, -the four binary flags -.Em flag1, -.Em flag2, -.Em flag3 -and -.Em flag4 -are used for customizing the clock driver. The interpretation of these -values, and whether they are used at all, is a function of the needs of -the particular clock driver. However, by convention, and unless -indicated otherwise, -.Em flag3 -is used to attach the ppsclock streams module to the configured driver, -while -.Em flag4 -is used to enable recording verbose monitoring data to the clockstats -file configured with the -.Em filegen -command. Further information on the ppsclock streams module is in the -.Pa README -file in the -.Pa ./kernel -directory in the current xntp3 program -distribution. Further information on this feature is available in the -.Pa ./scripts/stats -directory in the same distribution. -.Pp -Ordinarily, the stratum of a reference clock is by default zero. Since -the -.Nm -daemon adds one to the stratum of each peer, a primary server ordinarily -displays stratum one. In order to provide engineered backups, it is -often useful to specify the reference clock stratum as greater than -zero. The -.Em stratum -option is used for this purpose. Also, in cases involving both a -reference clock and a 1-pps discipline signal, it is useful to specify -the reference clock identifier as other than the default, depending on -the driver. The -.Em refid -option is used for this purpose. Except where noted, these options apply -to all clock drivers. -.Pp -.Nm Xntpd -on Unix machines currently supports several different types of clock -hardware plus a special pseudo\-clock used for backup or when no other -clock source is available. In the case of most of the clock drivers, -support for a 1-pps precision timing signal is available as described in -the -.Pa README -file in the -.Pa ./doc -directory of the xntp3 progam distribution. -The clock drivers, and the addresses used to configure them, are -described in the -.Pa README.refclocks -in the -.Pa doc -directory of the current -program distribution. -.Sh VARIABLES -Most variables used by the -.Tn NTP -protocol can be examined with the -.Nm xntpdc -(mode 7 messages) and the -.Nm ntpq -(mode 6 messages). Currently very few variables can be modified via mode -6 messages. These variables are either created with the -.Em setvar -directive or the leap warning variables. The leap warning bits that can -be set in the -.Em leapwarning -variable (up to one month ahead). Both, the -.Em leapwarning -and the -.Em leapindication -variable, have a slightly different encoding than the usual -.Em leap -bits interpretation: -.Bl -tag -width indent -.It 00 -The daemon passes the leap bits of its synchronisation source (usual -mode of operation). -.It 01/10 -A leap second is added/deleted (operator forced leap second). -.It 11 -Leap information from the sychronisation source is ignored (thus -LEAP_NOWARNING is passed on). -.El -.Sh FILES -.Bl -tag -width /etc/ntp.drift -compact -.It /etc/ntp.conf -the default name of the configuration file -.It /etc/ntp.drift -the conventional name of the drift file -.It /etc/ntp.keys -the conventional name of the key file -.El -.Sh SEE ALSO -.Xr ntpdate 8 , -.Xr ntpq 8 , -.Xr xntpdc 8 -.Sh HISTORY -Written by -.An Dennis Ferguson -at the University of Toronto. Text amended by -.An David Mills -at the University of Delaware. -.Sh BUGS -.Nm Xntpd -has gotten rather fat. While not huge, it has gotten larger than might -be desireable for an elevated\-priority daemon running on a workstation, -particularly since many of the fancy features which consume the space -were designed more with a busy primary server, rather than a high -stratum workstation, in mind. diff --git a/usr.sbin/xntpd/doc/xntpdc.8 b/usr.sbin/xntpd/doc/xntpdc.8 deleted file mode 100644 index 3e17d5cb46b1..000000000000 --- a/usr.sbin/xntpd/doc/xntpdc.8 +++ /dev/null @@ -1,674 +0,0 @@ -.\" -.\" $FreeBSD$ -.\" -.Dd December 21, 1993 -.Dt XNTPDC 8 -.Os -.Sh NAME -.Nm xntpdc -.Nd query/control program for the Network Time Protocol daemon -.Sh SYNOPSIS -.Nm xntpdc -.Op Fl ilnps -.Op Fl c Ar command -.Op Ar host ... -.Sh DESCRIPTION -.Nm Xntpdc -is used to query the -.Xr xntpd 8 -daemon about its current state and to request changes in that state. The -program may be run either in interactive mode or controlled using -command line arguments. Extensive state and statistics information is -available through the -.Nm -interface. In addition, nearly all the configuration options which can -be specified at start up using -.Nm xntpd Ns 's -configuration file may also be specified at run time using -.Nm Ns . -.Pp -If one or more request options is included on the command line when -.Nm -is executed, each of the requests will be sent to the -.Tn NTP -servers -running on each of the hosts given as command line arguments, or on -.Ar localhost -by default. If no request options are given, -.Nm -will attempt to read commands from the standard input and execute these -on the -.Tn NTP -server running on the first host given on the command line, -again defaulting to -.Ar localhost -when no other host is specified. -.Nm Xntpdc -will prompt for commands if the standard input is a terminal device. -.Pp -.Nm Xntpdc -uses -.Tn NTP -mode 7 packets to communicate with the -.Tn NTP -server, and hence -can be used to query any compatible server on the network which permits -it. Note that since -.Tn NTP -is a UDP protocol this communication will be -somewhat unreliable, especially over large distances in terms of network -topology. -.Nm Xntpdc -makes no attempt to retransmit requests, and will time requests out if -the remote host is not heard from within a suitable time out time. -.Pp -Command line options are described following. Specifying a command line -option other than -.Fl i -or -.Fl n -will cause the specified query (queries) to be sent to the indicated -host(s) immediately. Otherwise, -.Nm -will attempt to read interactive format commands from the standard -input. -.Bl -tag -width indent -.It Fl c -The following argument is interpreted as an interactive format command -and is added to the list of commands to be executed on the specified -host(s). Multiple -.Fl c -options may be given. -.It Fl i -Force -.Nm -to operate in interactive mode. Prompts will be written to the standard -output and commands read from the standard input. -.It Fl l -Obtain a list of peers which are known to the server(s). This switch is -equivalent to -.Qq -c listpeers . -.It Fl n -Output all host addresses in dotted\-quad numeric format rather than -converting to the canonical host names. -.It Fl p -Print a list of the peers known to the server as well as a summary of -their state. This is equivalent to -.Qq -c peers . -.It Fl s -Print a list of the peers known to the server as well as a summary of -their state, but in a slightly different format than the -.Fl p -switch. This is equivalent to -.Qq -c dmpeers . -.El -.Sh INTERNAL COMMANDS -Interactive format commands consist of a keyword followed by zero to -four arguments. Only enough characters of the full keyword to uniquely -identify the command need be typed. The output of a command is normally -sent to the standard output, but optionally the output of individual -commands may be sent to a file by appending a -.Qq > , -followed by a -file name, to the command line. -.Pp -A number of interactive format commands are executed entirely within the -.Nm -program itself and do not result in -.Tn NTP -mode 7 requests being sent to a -server. These are described following: -.Pp -.Bl -tag -width indent -.It Xo ? -.Op Ar command_keyword -.Xc -A -.Em ? -by itself will print a list of all the command keywords -known to this incarnation of -.Nm Ns . -A -.Em ? -followed by a command keyword will print function and -usage information about the command. This command is probably a better -source of information about -.Nm -than this manual page. -.It help Ar command_keyword -A synonym for the -.Em ? -command. -.It timeout Ar millseconds -Specify a time out period for responses to server queries. The default -is about 8000 milliseconds. -.It delay Ar milliseconds -Specify a time interval to be added to timestamps included in requests -which require authentication. This is used to enable (unreliable) server -reconfiguration over long delay network paths or between machines whose -clocks are unsynchronized. -.It host Ar hostname -Set the host to which future queries will be sent. -.Ar Hostname -may be either a host name or a numeric (dotted quad) dmaddress. -.It keyid Ar # -This command allows the specification of a key number to be used to -authenticate configuration requests. This must correspond to the key -number the server has been configured to use for this purpose. -.It passwd -This command prompts you to type in a password (which will not be -echoed) which will be used to authenticate configuration requests. The -password must correspond to the key configured for use by the -.Tn NTP -server for this purpose if such requests are to be successful. -.It hostnames Ar yes|no -If -.Ar yes -is specified, host names are printed in information -displays. If -.Ar no -is given, numeric addresses are printed -instead. The default is -.Ar yes -unless modified using the command line -.Fl n -switch. -.It quit -Exit -.Nm Ns . -.El -.Sh QUERY COMMANDS -Query commands result in -.Tn NTP -mode 7 packets containing requests for -information being sent to the server. These are -.Qq read\-only -commands in that they make no modification of the server configuration -state. -.Bl -tag -width indent -.It listpeers -Obtain and print a brief list of the peers for which the server is -maintaining state. These should include all configured peer associations -as well as those peers whose stratum is such that they are considered by -the server to be possible future synchronization candidates. -.It peers -Obtain a list of peers for which the server is maintaining state, along -with a summary of that state. Summary information includes the address -of the remote peer, the local interface address (0.0.0.0 if a local -address has yet to be determined), the stratum of the remote peer (a -stratum of 16 indicates the remote peer is unsynchronized), the polling -interval, in seconds, the reachability register, in octal, and the -current estimated delay, offset and dispersion of the peer, all in -seconds. In addition, the character in the left margin indicates the -mode this peer entry is operating in. A -.Qq + -denotes symmetric -active, a -.Qq - -indicates symmetric passive, a -.Qq = -means -the remote server is being polled in client mode, a -.Qq ^ -indicates that the server is broadcasting to this address, a -.Qq ~ -denotes that the remote peer is sending broadcasts and a -.Qq * -marks the peer the server is currently synchronizing to. -.Pp -The contents of the host field may be one of four forms. It may be a -host name, an IP address, a reference clock implementation name with its -parameter or -.Qq REFCLK(<implementation number>, <parameter>) . -On -.Qq hostnames no -only IP\-addresses will be displayed. -.It dmpeers -A slightly different peer summary list. Identical to the output of the -.Em peers -command except for the character in the leftmost column. Characters only -appear beside peers which were included in the final stage of the clock -selection algorithm. A -.Qq \&. -indicates that this peer was cast off -in the falseticker detection, while a -.Qq + -indicates that the -peer made it through. A -.Qq * -denotes the peer the server is -currently synchronizing with. -.It Xo showpeer -.Ar peer_address -.Op Ar addr2 -.Op Ar addr3 -.Op Ar addr4 -.Xc -Show a detailed display of the current peer variables for one or more -peers. Most of these values are described in the -.Tn NTP -Version 2 specification. -.It Xo pstats -.Ar peer_address -.Op Ar addr2 -.Op Ar addr3 -.Op Ar addr4 -.Xc -Show per\-peer statistic counters associated with the specified peer(s). -.It Xo clockinfo -.Ar clock_peer_address -.Op Ar addr2 -.Op Ar addr3 -.Op Ar addr4 -.Xc -Obtain and print information concerning a peer clock. The values -obtained provide information on the setting of fudge factors and other -clock performance information. -.It kerninfo -Obtain and print kernel phase-lock loop operating parameters. This -information is available only if the kernel has been specially modified -for a precision timekeeping function. -.It loopinfo Op Ar oneline|multiline -Print the values of selected loop filter variables. The loop filter is -the part of -.Tn NTP -which deals with adjusting the local system clock. The -.Qq offset -is the last offset given to the loop filter by the -packet processing code. The -.Qq frequency -is the frequency error -of the local clock in parts-per-million (ppm). The -.Qq time_const -controls the -.Qq stiffness -of the phase-lock loop and thus the speed at -which it can adapt to oscillator drift. The -.Qq watchdog timer -value is the number of seconds which have elapsed since the last sample -offset was given to the loop filter. The -.Ar oneline -and -.Ar multiline -options specify the format in which this information -is to be printed, with -.Ar multiline -as the default. -.It sysinfo -Print a variety of system state variables, i.e. state related to the -local server. All except the last four lines are described in the -.Tn NTP -Version 3 specification, RFC 1305. The -.Qq system flags -show various system flags, some of which can be set and cleared by the -.Qq enable -and -.Qq disable -configuration commands, -respectively. The -.Qq stability -is the residual frequency error -remaining after the system frequency correction is applied and is -intended for maintenance and debugging. In most architectures, this -value will initially decrease from as high as 500 ppm to a nominal value -in the range .01 to 0.1 ppm. If it remains high for some time after -starting the daemon, something may be wrong with the local clock, or the -value of the kernel variable -.Qq tick -may be incorrect. The -.Qq broadcastdelay -shows the default broadcast delay, as set by -the -.Qq broadcastdelay -configuration command, while the -.Qq authdelay -shows the default authentication delay, as set by -the -.Qq authdelay -configuration command. -.It sysstats -Print statistics counters maintained in the protocol module. -.It memstats -Print statistics counters related to memory allocation -code. -.It iostats -Print statistics counters maintained in the input\-output module. -.It timerstats -Print statistics counters maintained in the timer/event queue support -code. -.It reslist -Obtain and print the server's restriction list. This list is (usually) -printed in sorted order and may help to understand how the restrictions -are applied. -.It monlist Op Ar version -Obtain and print traffic counts collected and maintained by the monitor -facility. The version number should not normally need to be specified. -.It Xo clkbug -.Ar clock_peer_address -.Op Ar addr2 -.Op Ar addr3 -.Op Ar addr4 -.Xc -Obtain debugging information for a reference clock driver. This -information is provided only by some clock drivers and is mostly -undecodable without a copy of the driver source in hand. -.El -.Sh RUNTIME CONFIGURATION REQUESTS -All requests which cause state changes in the server are authenticated -by the server using a configured -.Tn NTP -key (the facility can also be -disabled by the server by not configuring a key). The key number and the -corresponding key must also be made known to -.Nm Ns . -This can be done using the -.Em keyid -and -.Em passwd -commands, the latter of which will prompt at the terminal for a password -to use as the encryption key. You will also be prompted automatically -for both the key number and password the first time a command which -would result in an authenticated request to the server is given. -Authentication not only provides verification that the requester has -permission to make such changes, but also gives an extra degree of -protection again transmission errors. -.Pp -Authenticated requests always include a timestamp in the packet data, -which is included in the computation of the authentication code. This -timestamp is compared by the server to its receive time stamp. If they -differ by more than a small amount the request is rejected. This is done -for two reasons. First, it makes simple replay attacks on the server, by -someone who might be able to overhear traffic on your LAN, much more -difficult. Second, it makes it more difficult to request configuration -changes to your server from topologically remote hosts. While the -reconfiguration facility will work well with a server on the local host, -and may work adequately between time\-synchronized hosts on the same -LAN, it will work very poorly for more distant hosts. As such, if -reasonable passwords are chosen, care is taken in the distribution and -protection of keys and appropriate source address restrictions are -applied, the run time reconfiguration facility should provide an -adequate level of security. -.Pp -The following commands all make authenticated requests: -.Bl -tag -width indent -.It Xo addpeer -.Ar peer_address -.Op Ar keyid -.Op Ar version# -.Op Ar prefer -.Xc -Add a configured peer association at the given address and operating in -symmetric active mode. Note that an existing association with the same -peer may be deleted when this command is executed, or may simply be -converted to conform to the new configuration, as appropriate. If the -optional -.Ar keyid -is a nonzero integer, all outgoing packets to -the remote server will have an authentication field attached encrypted -with this key. If the value is 0 (or not given) no authentication will -be done. The -.Ar version# -can be 1, 2 or 3 and defaults to 3. The -.Ar prefer -keyword indicates a preferred peer (and thus will be -used primarily for clock synchronisation if possible). The preferred -peer also determines the validity of the PPS signal - if the preferred -peer is suitable for synchronisation so is the PPS signal. -.It Xo addserver -.Ar peer_address -.Op Ar keyid -.Op Ar version# -.Op Ar prefer -.Xc -Identical to the -.Em addpeer -command, except that the operating mode is client. -.It Xo broadcast -.Ar peer_address -.Op Ar keyid -.Op Ar version# -.Xc -Identical to the -.Em addpeer -command, except that the operating mode is broadcast. In this case a -valid key identifier and key are required. The -.Ar peer_address -parameter can be the broadcast address of the local network or a -multicast group address assigned to -.Tn NTP . -If a multicast address, a -multicast-capable kernel is required. -.It Xo unconfig -.Ar peer_address -.Op Ar addr2 -.Op Ar addr3 -.Op Ar addr4 -.Xc -This command causes the configured bit to be removed from the specified -peer(s). In many cases this will cause the peer association to be -deleted. When appropriate, however, the association may persist in an -unconfigured mode if the remote peer is willing to continue on in this -fashion. -.It Xo fudge -.Ar peer_address -.Op Ar time1 -.Op Ar time2 -.Op Ar stratum -.Op Ar refid -.Xc -This command provides a way to set certain data for a reference clock. -See the source listing for further information. -.It Xo enable -.Ar auth|bclient|pll|monitor|stats -.Op Ar ... -.Xc -Provide a way to enable various server options. Flags not mentioned are -unaffected. The -.Ar auth -flag causes the server to synchronize -with unconfigured peers only if the peer has been correctly -authenticated using a trusted key and key identifier. The default for -this flag is disable (off). The -.Ar bclient -flag causes the server -to listen for a message from a broadcast or multicast server, following -which an association is automatically instantiated for that server. The -default for this flag is disable (off). The -.Ar pll -flag enables -the server to adjust its local clock, with default enable (on). If not -set, the local clock free-runs at its intrinsic time and frequency -offset. This flag is useful in case the local clock is controlled by -some other device or protocol and -.Tn NTP -is used only to provide -synchronization to other clients. The -.Ar monitor -flag enables the -monitoring facility (see elsewhere), with default disable (off). The -.Ar stats -flag enables statistics facility filegen (see -description elsewhere.), with default enable (on). -.It Xo disable -.Ar auth|bclient|pll|monitor|stats -.Op Ar ... -.Xc -Provide a way to disable various server options. Flags not mentioned -are unaffected. The flags presently available are described under the -enable command. -.It Xo restrict -.Ar address -.Ar mask -.Ar flag -.Op Ar flag -.Xc -Cause flag(s) to be added to an existing restrict list entry, or adds a -new entry to the list with the specified flag(s). The possible choices -for the flags arguments are given in the following list: -.Bl -tag -width indent -.It ignore -Ignore all packets from hosts which match this entry. If this flag is -specified neither queries nor time server polls will be responded to. -.It noquery -Ignore all -.Tn NTP -mode 7 packets (i.e. information queries and -configuration requests) from the source. Time service is not affected. -.It nomodify -Ignore all -.Tn NTP -mode 7 packets which attempt to modify the state of the -server (i.e. run time reconfiguration). Queries which return information -are permitted. -.It notrap -Decline to provide mode 6 control message trap service to matching -hosts. The trap service is a subsystem of the mode 6 control message -protocol which is intended for use by remote event logging programs. -.It lowpriotrap -Declare traps set by matching hosts to be low priority. The number of -traps a server can maintain is limited (the current limit is 3). Traps -are usually assigned on a first come, first served basis, with later -trap requestors being denied service. This flag modifies the assignment -algorithm by allowing low priority traps to be overridden by later -requests for normal priority traps. -.It noserve -Ignore -.Tn NTP -packets whose mode is other than 7. In effect, time service -is denied, though queries may still be permitted. -.It nopeer -Provide stateless time service to polling hosts, but do not allocate -peer memory resources to these hosts even if they otherwise might be -considered useful as future synchronization partners. -.It notrust -Treat these hosts normally in other respects, but never use them as -synchronization sources. -.It limited -These hosts are subject to limitation of number of clients from the same -net. Net in this context refers to the IP notion of net (class A, class -B, class C, etc.). Only the first -.Qq client_limit -hosts that have -shown up at the server and that have been active during the last -.Qq client_limit_period -seconds are accepted. Requests from other -clients from the same net are rejected. Only time request packets are -taken into account. -.Qq Private , -.Qq control , -and -.Qq broadcast -packets are not subject to client limitation and -therefore are not contributing to client count. History of clients is -kept using the monitoring capability of -.Xr xntpd 8 . -Thus, monitoring is active as long as there is a restriction entry with -the -.Ar limited -flag. The default value for -.Qq client_limit -is 3. The default value for -.Qq client_limit_period -is 3600 -seconds. Currently both variables are not runtime configurable. -.It ntpport -This is actually a match algorithm modifier, rather than a restriction -flag. Its presence causes the restriction entry to be matched only if -the source port in the packet is the standard -.Tn NTP -UDP port (123). Both -.Em ntpport -and -.Pf non\- Em ntpport -may be specified. The -.Em ntpport -is considered more specific and is sorted later in the list. -.El -.It Xo unrestrict -.Ar address -.Ar mask -.Ar flag -.Op Ar flag -.Xc -Remove the specified flag(s) from the restrict list entry indicated -by the -.Ar address -and -.Ar mask -arguments. -.It Xo delrestrict -.Ar address -.Ar mask -.Op Ar ntpport -.Xc -Delete the matching entry from the restrict list. -.It monitor Ar yes|no -Enable or disable the monitoring facility. Note that a -.Em monitor Ar no -command followed by a -.Em monitor Ar yes -command is a good way of resetting the packet counts. -.It readkeys -Cause the current set of authentication keys to be purged and a new set -to be obtained by rereading the keys file (which must have been -specified in the -.Nm xntpd -configuration file). This allows encryption keys to be changed without -restarting the server. -.It Xo trustkey -.Ar keyid -.Op Ar keyid -.Op Ar keyid -.Op Ar keyid -.Xc -Add one or more keys to the trusted key list. When authentication is -enabled, peers whose time is to be trusted must be authenticated using a -trusted key. -.It Xo untrustkey -.Ar keyid -.Op Ar keyid -.Op Ar keyid -.Op Ar keyid -.Xc -Remove one or more keys from the trusted key list. -.It authinfo -Return information concerning the authentication module, including -known keys and counts of encryptions and decryptions which have been -done. -.It setprecision Ar precision_value -Set the precision which the server advertises to the specified value. -This should be a negative integer in the range -4 through -20. -.It traps -Display the traps set in the server. See the source listing for further -information. -.It Xo addtrap -.Ar address -.Op Ar port -.Op Ar interface -.Xc -Set a trap for asynchronous messages. See the source listing for further -information. -.It Xo clrtrap -.Ar address -.Op Ar port -.Op Ar interface -.Xc -Clear a trap for asynchronous messages. See the source listing for -further information. -.It reset Ar ... -Clear the statistics counters in various modules of the server. See the -source listing for further information. -.El -.Sh SEE ALSO -.Xr xntpd 8 -.Sh HISTORY -Written by -.An Dennis Ferguson -at the University of Toronto. -.Sh BUGS -.Nm Xntpdc -is a crude hack. Much of the information it shows is deadly boring and -could only be loved by its implementer. The program was designed so that -new (and temporary) features were easy to hack in, at great expense to -the program's ease of use. Despite this, the program is occasionally -useful. diff --git a/usr.sbin/xntpd/include/README b/usr.sbin/xntpd/include/README deleted file mode 100644 index 73d0620569a2..000000000000 --- a/usr.sbin/xntpd/include/README +++ /dev/null @@ -1,21 +0,0 @@ -README file for directory ./include of the NTP Version 3 distribution - -This directory contains the include files used by most programs in this -distribution. The ./sys directory in this directory contains system -header files used by the clock discipline and STREAMS modules in the -../kernel directory. - -Note that multicast support (MCAST define) requires the header file -/usr/include/netinet/in.h for the particular architecture to be in place. -This file is constructed during the installation process in older systems; -it is already in place for those machines that support multicast ex box. -The file in.h included in this distribution is for Suns; the files for -other systems can be found in the multicast distribtutions for each -architecture separately. - -If the precision-time kernel (KERNEL_PLL define) is configured, the -installation process requires the header file /usr/include/sys/timex.h -for the particular architecture to be in place. The file timex.h included -in this distribution is for Suns; the files for other systems can be -found in the kernel distributions available from the manufacturer's -representatives. diff --git a/usr.sbin/xntpd/include/in.h b/usr.sbin/xntpd/include/in.h deleted file mode 100644 index c18d5698443e..000000000000 --- a/usr.sbin/xntpd/include/in.h +++ /dev/null @@ -1,256 +0,0 @@ -/* @(#)in.h 1.19 90/07/27 SMI; from UCB 7.5 2/22/88 */ - -/* - * Copyright (c) 1982, 1986 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that this notice is preserved and that due credit is given - * to the University of California at Berkeley. The name of the University - * may not be used to endorse or promote products derived from this - * software without specific prior written permission. This software - * is provided ``as is'' without express or implied warranty. - */ - -/* - * Constants and structures defined by the internet system, - * Per RFC 790, September 1981. - */ - -#ifndef _netinet_in_h -#define _netinet_in_h - -/* - * Protocols - */ -#define IPPROTO_IP 0 /* dummy for IP */ -#define IPPROTO_ICMP 1 /* control message protocol */ -#define IPPROTO_IGMP 2 /* group control protocol */ -#define IPPROTO_GGP 3 /* gateway^2 (deprecated) */ -#define IPPROTO_ST 5 /* st */ -#define IPPROTO_TCP 6 /* tcp */ -#define IPPROTO_EGP 8 /* exterior gateway protocol */ -#define IPPROTO_PUP 12 /* pup */ -#define IPPROTO_UDP 17 /* user datagram protocol */ -#define IPPROTO_IDP 22 /* xns idp */ -#define IPPROTO_HELLO 63 /* "hello" routing protocol */ -#define IPPROTO_ND 77 /* UNOFFICIAL net disk proto */ -#define IPPROTO_OSPF 89 /* Open SPF IGP */ - -#define IPPROTO_RAW 255 /* raw IP packet */ -#define IPPROTO_MAX 256 - -/* - * Port/socket numbers: network standard functions - */ -#define IPPORT_ECHO 7 -#define IPPORT_DISCARD 9 -#define IPPORT_SYSTAT 11 -#define IPPORT_DAYTIME 13 -#define IPPORT_NETSTAT 15 -#define IPPORT_FTP 21 -#define IPPORT_TELNET 23 -#define IPPORT_SMTP 25 -#define IPPORT_TIMESERVER 37 -#define IPPORT_NAMESERVER 42 -#define IPPORT_WHOIS 43 -#define IPPORT_MTP 57 - -/* - * Port/socket numbers: host specific functions - */ -#define IPPORT_TFTP 69 -#define IPPORT_RJE 77 -#define IPPORT_FINGER 79 -#define IPPORT_TTYLINK 87 -#define IPPORT_SUPDUP 95 - -/* - * UNIX TCP sockets - */ -#define IPPORT_EXECSERVER 512 -#define IPPORT_LOGINSERVER 513 -#define IPPORT_CMDSERVER 514 -#define IPPORT_EFSSERVER 520 - -/* - * UNIX UDP sockets - */ -#define IPPORT_BIFFUDP 512 -#define IPPORT_WHOSERVER 513 -#define IPPORT_ROUTESERVER 520 /* 520+1 also used */ - -/* - * Ports < IPPORT_RESERVED are reserved for - * privileged processes (e.g. root). - * Ports > IPPORT_USERRESERVED are reserved - * for servers, not necessarily privileged. - */ -#define IPPORT_RESERVED 1024 -#define IPPORT_USERRESERVED 5000 - -/* - * Link numbers - */ -#define IMPLINK_IP 155 -#define IMPLINK_LOWEXPER 156 -#define IMPLINK_HIGHEXPER 158 - -/* - * Internet address - * This definition contains obsolete fields for compatibility - * with SunOS 3.x and 4.2bsd. The presence of subnets renders - * divisions into fixed fields misleading at best. New code - * should use only the s_addr field. - */ -struct in_addr { - union { - struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; - struct { u_short s_w1,s_w2; } S_un_w; - u_long S_addr; - } S_un; -#define s_addr S_un.S_addr /* should be used for all code */ -#define s_host S_un.S_un_b.s_b2 /* OBSOLETE: host on imp */ -#define s_net S_un.S_un_b.s_b1 /* OBSOLETE: network */ -#define s_imp S_un.S_un_w.s_w2 /* OBSOLETE: imp */ -#define s_impno S_un.S_un_b.s_b4 /* OBSOLETE: imp # */ -#define s_lh S_un.S_un_b.s_b3 /* OBSOLETE: logical host */ -}; - -/* - * Definitions of bits in internet address integers. - * On subnets, the decomposition of addresses to host and net parts - * is done according to subnet mask, not the masks here. - */ -#define IN_CLASSA(i) (((long)(i) & 0x80000000) == 0) -#define IN_CLASSA_NET 0xff000000 -#define IN_CLASSA_NSHIFT 24 -#define IN_CLASSA_HOST 0x00ffffff -#define IN_CLASSA_MAX 128 - -#define IN_CLASSB(i) (((long)(i) & 0xc0000000) == 0x80000000) -#define IN_CLASSB_NET 0xffff0000 -#define IN_CLASSB_NSHIFT 16 -#define IN_CLASSB_HOST 0x0000ffff -#define IN_CLASSB_MAX 65536 - -#define IN_CLASSC(i) (((long)(i) & 0xe0000000) == 0xc0000000) -#define IN_CLASSC_NET 0xffffff00 -#define IN_CLASSC_NSHIFT 8 -#define IN_CLASSC_HOST 0x000000ff - -#define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000) -#define IN_CLASSD_NET 0xf0000000 /* These ones aren't really */ -#define IN_CLASSD_NSHIFT 28 /* net and host fields, but */ -#define IN_CLASSD_HOST 0x0fffffff /* routing needn't know. */ -#define IN_MULTICAST(i) IN_CLASSD(i) - -#define IN_EXPERIMENTAL(i) (((long)(i) & 0xe0000000) == 0xe0000000) -#define IN_BADCLASS(i) (((long)(i) & 0xf0000000) == 0xf0000000) - -#define INADDR_ANY (u_long)0x00000000 -#define INADDR_LOOPBACK (u_long)0x7F000001 -#define INADDR_BROADCAST (u_long)0xffffffff /* must be masked */ - -#define INADDR_UNSPEC_GROUP (u_long)0xe0000000 /* 224.0.0.0 */ -#define INADDR_ALLHOSTS_GROUP (u_long)0xe0000001 /* 224.0.0.1 */ -#define INADDR_MAX_LOCAL_GROUP (u_long)0xe00000ff /* 224.0.0.255 */ - -#define IN_LOOPBACKNET 127 /* official! */ - -/* - * Define a macro to stuff the loopback address into an Internet address - */ -#define IN_SET_LOOPBACK_ADDR(a) {(a)->sin_addr.s_addr = htonl(INADDR_LOOPBACK); \ - (a)->sin_family = AF_INET;} - -/* - * Socket address, internet style. - */ -struct sockaddr_in { - short sin_family; - u_short sin_port; - struct in_addr sin_addr; - char sin_zero[8]; -}; - -/* - * Options for use with [gs]etsockopt at the IP level. - */ -#define IP_OPTIONS 1 /* set/get IP per-packet options */ -#define IP_MULTICAST_IF 2 /* set/get IP multicast interface */ -#define IP_MULTICAST_TTL 3 /* set/get IP multicast timetolive */ -#define IP_MULTICAST_LOOP 4 /* set/get IP multicast loopback */ -#define IP_ADD_MEMBERSHIP 5 /* add an IP group membership */ -#define IP_DROP_MEMBERSHIP 6 /* drop an IP group membership */ - -#define IP_DEFAULT_MULTICAST_TTL 1 /* normally limit m'casts to 1 hop */ -#define IP_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */ -#define IP_MAX_MEMBERSHIPS 20 /* per socket; must fit in one mbuf */ - -/* - * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP. - */ -struct ip_mreq { - struct in_addr imr_multiaddr; /* IP multicast address of group */ - struct in_addr imr_interface; /* local IP address of interface */ -}; - -#if !defined(vax) && !defined(ntohl) && !defined(i386) -/* - * Macros for number representation conversion. - */ -#define ntohl(x) (x) -#define ntohs(x) (x) -#define htonl(x) (x) -#define htons(x) (x) -#endif - -#if !defined(ntohl) && (defined(vax) || defined(i386)) -u_short ntohs(), htons(); -u_long ntohl(), htonl(); -#endif - -#ifdef KERNEL -extern struct domain inetdomain; -extern struct protosw inetsw[]; -struct in_addr in_makeaddr(); -u_long in_netof(), in_lnaof(); -#endif - -#ifndef BYTE_ORDER -/* - * Definitions for byte order, - * according to byte significance from low address to high. - */ -#define LITTLE_ENDIAN 1234 /* least-significant byte first (vax) */ -#define BIG_ENDIAN 4321 /* most-significant byte first (IBM, net) */ -#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long (pdp) */ - -#if defined(vax) || defined(i386) -#define BYTE_ORDER LITTLE_ENDIAN -#else -#define BYTE_ORDER BIG_ENDIAN /* mc68000, tahoe, most others */ -#endif -#endif BYTE_ORDER - -/* - * Macros for number representation conversion. - */ -#if BYTE_ORDER==LITTLE_ENDIAN -#define NTOHL(d) ((d) = ntohl((d))) -#define NTOHS(d) ((d) = ntohs((d))) -#define HTONL(d) ((d) = htonl((d))) -#define HTONS(d) ((d) = htons((d))) -#else -#define ntohl(x) (x) -#define ntohs(x) (x) -#define htonl(x) (x) -#define htons(x) (x) -#define NTOHL(d) -#define NTOHS(d) -#define HTONL(d) -#define HTONS(d) -#endif - -#endif /*!_netinet_in_h*/ diff --git a/usr.sbin/xntpd/include/l_stdlib.h b/usr.sbin/xntpd/include/l_stdlib.h deleted file mode 100644 index 221682e45b30..000000000000 --- a/usr.sbin/xntpd/include/l_stdlib.h +++ /dev/null @@ -1,284 +0,0 @@ -/* - * Proto types for machines that are not ANSI and POSIX compliant. - * This is optionaly - */ - -#ifndef _l_stdlib_h -#define _l_stdlib_h - -#if defined(NTP_POSIX_SOURCE) -#include <stdlib.h> -#endif - -#ifndef P -#if defined(__STDC__) || defined(USE_PROTOTYPES) -#define P(x) x -#else -#define P(x) () -#if !defined(const) -#define const -#endif -#endif -#endif - -/* - * Unprottyped library functions for SunOS 4.x.x - */ -#ifdef SYS_SUNOS4 -extern void closelog P((void)); -extern void openlog P((char *, int, int)); -extern void syslog P((int, char *, ...)); -extern int setlogmask P((int)); - -extern char * getpass P((char *)); - -extern int setpriority P((int ,int ,int)); - -extern long strtol P((char *, char **, int)); - -#if !defined(NTP_POSIX_SOURCE) -extern int atoi P((char *)); -extern int dup2 P((int, int)); -extern int execve P((char *, char **,char **)); -extern int fork P((void)); -extern int getdtablesize P((void)); -extern int qsort P((void *, int , int, - int (*compar)(void *, void *))); -extern int rand P((void)); -extern int setpgrp P((int, int)); -extern void srand P((unsigned int)); -extern void bcopy P((char *, char *, int)); -#endif - -#ifndef bzero /* XXX macro prototyping clash */ -extern void bzero P((char *, int)); -extern int bcmp P((char *, char *, int)); -extern void bcopy P((char *, char *, int)); -#endif -extern char *mktemp P((char *)); - -extern int tolower P((int)); - -extern int isatty P((int)); - -extern unsigned sleep P((unsigned )); -extern unsigned int alarm P((unsigned int)); -extern int pause P((void)); - -extern int getpid P((void)); -extern int getppid P((void)); - -extern int close P((int)); -extern int ioctl P((int, int, char *)); -extern int read P((int, void *, unsigned)); -extern int rename P((char *, char *)); -extern int write P((int, const void *, unsigned)); -extern int unlink P((const char *)); -extern int link P((const char *, const char *)); - -#ifdef FILE -extern int fclose P((FILE *)); -extern int fflush P((FILE *)); -extern int fprintf P((FILE *, char *, ...)); -extern int fscanf P((FILE *, char *, ...)); -extern int fputs P((char *, FILE *)); -extern int fputc P((char, FILE *)); -extern int fread P((char *, int, int, FILE *)); -extern int printf P((char *, ...)); -extern int setbuf P((FILE *, char *)); -extern int setvbuf P((FILE *, char *, int, int)); -extern int scanf P((char *, ...)); -extern int sscanf P((char *, char *, ...)); -extern int vsprintf P((char *, char *, ...)); -extern int _flsbuf P((int, FILE *)); -extern int _filbuf P((FILE *)); -extern void perror P((char *)); -#ifndef NTP_POSIX_SOURCE -extern int setlinebuf P((FILE *)); -#endif -#endif - -#ifdef _ntp_string_h -#ifdef NTP_POSIX_SOURCE /* these are builtins */ -#ifndef NTP_NEED_BOPS /* but may be emulated by bops */ -extern char *memcpy(); -extern char *memset(); -extern int memcmp(); -#endif -#endif -#endif - -#ifdef _sys_socket_h -extern int bind P((int, struct sockaddr *, int)); -extern int connect P((int, struct sockaddr *, int)); -extern int sendto P((int, char *, int, int, struct sockaddr *, int)); -extern int setsockopt P((int, int, int, char *, int)); -extern int socket P((int, int, int)); -extern int recvfrom P((int, char *, int, int, struct sockaddr *, int *)); -#endif /* _sys_socket_h */ - -#ifdef _ntp_select_h -extern int select P((int, fd_set *, fd_set *, fd_set *, struct timeval *)); -#endif - -#ifdef _sys_time_h -extern int adjtime P((struct timeval *, struct timeval *)); -extern int setitimer P((int , struct itimerval *, struct itimerval *)); -#ifdef SYSV_TIMEOFDAY -extern int gettimeofday P((struct timeval *)); -extern int settimeofday P((struct timeval *)); -#else /* ! SYSV_TIMEOFDAY */ -extern int gettimeofday P((struct timeval *, struct timezone *)); -extern int settimeofday P((struct timeval *, struct timezone *)); -#endif /* SYSV_TIMEOFDAY */ -#endif /* _sys_time_h */ - -#ifdef __time_h -extern time_t time P((time_t *)); -#endif - -#ifdef __setjmp_h -extern int setjmp P((jmp_buf)); -extern void longjmp P((jmp_buf, int)); -#endif - -#ifdef _sys_resource_h -extern int getrusage P((int, struct rusage *)); -#endif - -#ifdef _nlist_h -extern int nlist P((char *, struct nlist *)); -#endif - -#endif /* SYS_SUNOS4 */ - -/* - * Unprototyped library functions for DEC OSF/1 - */ -#ifdef SYS_DECOSF1 -#ifndef _MACHINE_ENDIAN_H_ -#define _MACHINE_ENDIAN_H_ -extern u_short htons P((u_short)); -extern u_short ntohs P((u_short)); -extern U_LONG htonl P((U_LONG)); -extern U_LONG ntohl P((U_LONG)); -#endif /* _MACHINE_ENDIAN_H_ */ - -/* -extern char * getpass P((char *)); -*/ -extern char * mktemp P((char *)); -#ifndef SYS_IX86OSF1 -extern int ioctl P((int, u_long, char *)); -extern void bzero P((char *, int)); -#endif - -#ifdef SOCK_DGRAM -extern int bind P((int, const struct sockaddr *, int)); -extern int connect P((int, const struct sockaddr *, int)); -extern int socket P((int, int, int)); -extern int sendto P((int, const void *, int, int, const struct sockaddr *, int)); -extern int setsockopt P((int, int, int, const void *, int)); -extern int recvfrom P((int, void *, int, int, struct sockaddr *, int *)); -#endif /* SOCK_STREAM */ - -#ifdef _ntp_select_h -extern int select P((int, fd_set *, fd_set *, fd_set *, struct timeval *)); -#endif - -#endif /* DECOSF1 */ - -/* - * Unprototyped library functions for Ultrix - */ -#ifdef SYS_ULTRIX -extern int close P((int)); -extern char * getpass P((char *)); -extern int getpid P((void)); -extern int ioctl P((int, int, char *)); -extern char *mktemp P((char *)); -extern int unlink P((const char *)); -extern int link P((const char *, const char *)); - -extern void closelog P((void)); -extern void syslog P((int, char *, ...)); -#ifndef LOG_DAEMON -extern void openlog P((char *, int)); -#else -extern void openlog P((char *, int, int)); -#endif - -extern int setpriority P((int ,int ,int )); - -#ifdef SOCK_DGRAM -extern int bind P((int, struct sockaddr *, int)); -extern int connect P((int, struct sockaddr *, int)); -extern int socket P((int, int, int)); -extern int sendto P((int, char *, int, int, struct sockaddr *, int)); -extern int setsockopt P((int, int, int, char *, int)); -extern int recvfrom P((int, char *, int, int, struct sockaddr *, int *)); -#endif /* SOCK_STREAM */ - -#ifdef _TIME_H_ -extern int gettimeofday P((struct timeval *, struct timezone *)); -extern int settimeofday P((struct timeval *, struct timezone *)); -extern int adjtime P((struct timeval *, struct timeval *)); -extern int select P((int, fd_set *, fd_set *, fd_set *, struct timeval *)); -extern int setitimer P((int , struct itimerval *, struct itimerval *)); -#endif /* _TIME_H_ */ - -#ifdef N_UNDF -extern int nlist P((char *, struct nlist *)); -#endif - -#ifndef bzero /* XXX macro prototyping clash */ -extern void bzero P((char *, int)); -extern int bcmp P((char *, char *, int)); -extern void bcopy P((char *, char *, int)); -#endif - -#ifndef NTP_POSIX_SOURCE -extern int atoi P((char *)); -extern void bzero P((char *, int)); -extern int bcmp P((char *, char *, int)); -extern void bcopy P((char *, char *, int)); -extern int execve P((char *, char **,char **)); -extern int fork P((void)); -extern int getdtablesize P((void)); -extern int ran P((void)); -extern int rand P((void)); -extern void srand P((unsigned int)); -#ifdef _TIME_H_ -extern int gettimeofday P((struct timeval *, struct timezone *)); -extern int settimeofday P((struct timeval *, struct timezone *)); -#endif -#endif - -#ifdef _RESOURCE_H_ -extern int getrusage P((int, struct rusage *)); -#endif - -#endif /* SYS_ULTRIX */ - -#if defined(__convex__) -extern char * getpass P((char *)); -#endif - -#ifdef SYS_IRIX4 -extern char * getpass P((char *)); -#endif /* IRIX4 */ - -#ifdef SYS_VAX -extern char * getpass P((char *)); -#endif /* VAX */ - -#ifdef SYS_DOMAINOS -extern char * getpass P((char *)); -#endif /* SYS_DOMAINOS */ - -#ifdef SYS_BSD -#define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000) -#endif - -#endif /* l_stdlib_h */ - diff --git a/usr.sbin/xntpd/include/md5.h b/usr.sbin/xntpd/include/md5.h deleted file mode 100644 index 82b43e1b5da7..000000000000 --- a/usr.sbin/xntpd/include/md5.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - *********************************************************************** - ** md5.h -- header file for implementation of MD5 ** - ** RSA Data Security, Inc. MD5 Message-Digest Algorithm ** - ** Created: 2/17/90 RLR ** - ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version ** - ** Revised (for MD5): RLR 4/27/91 ** - *********************************************************************** - */ - -/* - *********************************************************************** - ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. ** - ** ** - ** License to copy and use this software is granted provided that ** - ** it is identified as the "RSA Data Security, Inc. MD5 Message- ** - ** Digest Algorithm" in all material mentioning or referencing this ** - ** software or this function. ** - ** ** - ** License is also granted to make and use derivative works ** - ** provided that such works are identified as "derived from the RSA ** - ** Data Security, Inc. MD5 Message-Digest Algorithm" in all ** - ** material mentioning or referencing the derived work. ** - ** ** - ** RSA Data Security, Inc. makes no representations concerning ** - ** either the merchantability of this software or the suitability ** - ** of this software for any particular purpose. It is provided "as ** - ** is" without express or implied warranty of any kind. ** - ** ** - ** These notices must be retained in any copies of any part of this ** - ** documentation and/or software. ** - *********************************************************************** - */ - -#include "ntp_types.h" - -/* typedef a 32-bit type */ -typedef unsigned LONG UINT4; - -/* Data structure for MD5 (Message-Digest) computation */ -typedef struct { - UINT4 i[2]; /* number of _bits_ handled mod 2^64 */ - UINT4 buf[4]; /* scratch buffer */ - unsigned char in[64]; /* input buffer */ - unsigned char digest[16]; /* actual digest after MD5Final call */ -} MD5_CTX; - -void MD5Init (); -void MD5Update (); -void MD5Final (); - -/* - *********************************************************************** - ** End of md5.h ** - ******************************** (cut) ******************************** - */ diff --git a/usr.sbin/xntpd/include/mx4200.h b/usr.sbin/xntpd/include/mx4200.h deleted file mode 100644 index 13058deb1e5e..000000000000 --- a/usr.sbin/xntpd/include/mx4200.h +++ /dev/null @@ -1,40 +0,0 @@ - -/* records transmitted from extern CDU to MX 4200 */ -#define PMVXG_S_INITMODEA 0 /* initialization/mode part A */ -#define PMVXG_S_INITMODEB 1 /* initialization/mode part B*/ -#define PMVXG_S_SATHEALTH 2 /* satellite health control */ -#define PMVXG_S_DIFFNAV 3 /* differential navigation control */ -#define PMVXG_S_PORTCONF 7 /* control port configuration */ -#define PMVXG_S_GETSELFTEST 3 /* self test (request results) */ -#define PMVXG_S_RTCMCONF 16 /* RTCM port configuration */ -#define PMVXG_S_PASSTHRU 17 /* equipment port pass-thru config */ -#define PMVXG_S_RESTART 18 /* restart control */ -#define PMVXG_S_OSCPARAM 19 /* oscillator parameter */ -#define PMVXG_S_DOSELFTEST 20 /* self test (activate a test) */ -#define PMVXG_S_TRECOVCONF 23 /* time recovery configuration */ -#define PMVXG_S_RAWDATASEL 24 /* raw data port data selection */ -#define PMVXG_S_EQUIPCONF 26 /* equipment port configuration */ -#define PMVXG_S_RAWDATACONF 27 /* raw data port configuration */ - -/* records transmitted from MX 4200 to external CDU */ -#define PMVXG_D_STATUS 0 /* status */ -#define PMVXG_D_POSITION 1 /* position */ -#define PMVXG_D_OPDOPS 3 /* (optimum) DOPs */ -#define PMVXG_D_MODEDATA 4 /* mode data */ -#define PMVXG_D_SATPRED 5 /* satellite predictions */ -#define PMVXG_D_SATHEALTH 6 /* satellite health status */ -#define PMVXG_D_UNRECOG 7 /* unrecognized request response */ -#define PMVXG_D_SIGSTRLOC 8 /* sig strength & location (sats 1-4) */ -#define PMVXG_D_SPEEDHEAD 11 /* speed/heading data */ -#define PMVXG_D_OSELFTEST 12 /* (old) self-test results */ -#define PMVXG_D_SIGSTRLOC2 18 /* sig strength & location (sats 5-8) */ -#define PMVXG_D_OSCPARAM 19 /* oscillator parameter */ -#define PMVXG_D_SELFTEST 20 /* self test results */ -#define PMVXG_D_PHV 21 /* position, height & velocity */ -#define PMVXG_D_DOPS 22 /* DOPs */ -#define PMVXG_D_SOFTCONF 30 /* software configuration */ -#define PMVXG_D_DIFFGPSMODE 503 /* differential gps moding */ -#define PMVXG_D_TRECOVUSEAGE 523 /* time recovery usage */ -#define PMVXG_D_RAWDATAOUT 524 /* raw data port data output */ -#define PMVXG_D_TRECOVRESULT 828 /* time recovery results */ -#define PMVXG_D_TRECOVOUT 830 /* time recovery output message */ diff --git a/usr.sbin/xntpd/include/ntp.h b/usr.sbin/xntpd/include/ntp.h deleted file mode 100644 index 5eca0e81a771..000000000000 --- a/usr.sbin/xntpd/include/ntp.h +++ /dev/null @@ -1,706 +0,0 @@ -/* - * ntp.h - NTP definitions for the masses - */ - -#include "ntp_types.h" - -/* - * How to get signed characters. On machines where signed char works, - * use it. On machines where signed char doesn't work, char had better - * be signed. - */ -#if !defined(S_CHAR_DEFINED) -#if defined(NO_SIGNED_CHAR_DECL) -typedef char s_char; -#else -typedef signed char s_char; -#endif -#ifdef sequent -#undef SO_RCVBUF -#undef SO_SNDBUF -#endif -#endif - -/* - * NTP protocol parameters. See section 3.2.6 of the specification. - */ -#define NTP_VERSION ((u_char)3) /* current version number */ -#define NTP_OLDVERSION ((u_char)1) /* oldest credible version */ -#define NTP_PORT 123 /* included for sake of non-unix machines */ -#define NTP_MAXSTRATUM ((u_char)15) /* max stratum, infinity a la Bellman-Ford */ -#define NTP_MAXAGE 86400 /* one day in seconds */ -#define NTP_MAXSKEW 1 /* 1 sec, skew after NTP_MAXAGE w/o updates */ -#define NTP_SKEWINC 49170 /* skew increment for clock updates (l_f) */ -#define NTP_SKEWFACTOR 16 /* approximation of factor for peer calcs */ -#define NTP_MAXDISTANCE (1 * FP_SECOND) /* max. rootdelay for synchr. */ -#define NTP_MINDPOLL 6 /* log2 default min poll interval (64 s) */ -#define NTP_MAXDPOLL 10 /* log2 default max poll interval (~17 m) */ -#define NTP_MINPOLL 4 /* log2 min poll interval (16 s) */ -#define NTP_MAXPOLL 14 /* log2 max poll interval (~4.5 h) */ -#define NTP_MINCLOCK 3 /* minimum for outlyer detection */ -#define NTP_MAXCLOCK 10 /* maximum select list size */ -#define NTP_MINDISPERSE (FP_SECOND / 100) /* min dispersion (u_fp 10 ms) */ -#define NTP_MAXDISPERSE (FP_SECOND * 16) /* max dispersion (u_fp 16 s) */ -#define NTP_DISPFACTOR 20 /* MAXDISPERSE as a shift (u_fp 16 s) */ -#define NTP_WINDOW 8 /* reachability register size */ -#define NTP_SHIFT 8 /* 8 suitable for crystal time base */ -#define NTP_MAXKEY 65535 /* maximum authentication key number */ -#define NTP_MAXD 3 /* log2 estimated error averaging factor */ - -/* - * Loop filter parameters. See section 5.1 of the specification. - * - * Note that these are appropriate for a crystal time base. If your - * system clock is line frequency controlled you should read the - * specification for appropriate modifications. Note that the - * loop filter code will have to change if you change CLOCK_MAX - * to be greater than or equal to 500 ms. - * - * Note these parameters have been rescaled for a time constant range from - * 0 through 10, with 2 corresoponding to the old time constant of 0. - */ -#define CLOCK_MINSTEP 900 /* step timeout (sec) */ -#define CLOCK_ADJ 0 /* log2 adjustment interval (1 sec) */ -#define CLOCK_DSCALE 20 /* skew reg. scale: unit is 2**-20 ~= 1 ppm */ -#define CLOCK_FREQ 16 /* log2 frequency weight (65536) */ -#define CLOCK_PHASE 6 /* log2 phase weight (64) */ -#define CLOCK_LIMIT 30 /* time constant adjust threshold */ -#define CLOCK_G 2 /* log2 frequency averaging factor */ -#define CLOCK_MAXSEC 800 /* max update interval for pll */ - -#define CLOCK_MAX_FP 0x000020c5 /* max clock offset (s_fp 128 ms) */ -#define CLOCK_MAX_F 0x20c49ba6 /* max clock offset (l_fp 128 ms) */ -#define CLOCK_MAX_I 0x00000000 /* both fractional and integral parts */ - -#define CLOCK_WAYTOOBIG 1000 /* if clock 1000 sec off, forget it */ - -/* - * Event timers are actually implemented as a sorted queue of expiry - * times. The queue is slotted, with each slot holding timers which - * expire in a 2**(NTP_MINPOLL-1) (8) second period. The timers in - * each slot are sorted by increasing expiry time. The number of - * slots is 2**(NTP_MAXPOLL-(NTP_MINPOLL-1)), or 512, to cover a time - * period of 2**NTP_MAXPOLL (16384) seconds into the future before - * wrapping. - */ -#define EVENT_TIMEOUT CLOCK_ADJ - -struct event { - struct event *next; /* next in chain */ - struct event *prev; /* previous in chain */ - struct peer *peer; /* peer this counter belongs to */ - void (*event_handler)(); /* routine to call to handle event */ - u_long event_time; /* expiry time of counter */ -}; - -#define TIMER_SLOTTIME (1<<(NTP_MINPOLL-1)) -#define TIMER_NSLOTS (1<<(NTP_MAXPOLL-(NTP_MINPOLL-1))) -#define TIMER_SLOT(t) (((t) >> (NTP_MINPOLL-1)) & (TIMER_NSLOTS-1)) - -/* - * TIMER_ENQUEUE() puts stuff on the timer queue. It takes as - * arguments (ea), an array of event slots, and (iev), the event - * to be inserted. This one searches the hash bucket from the - * end, and is about optimum for the timing requirements of - * NTP peers. - */ -#define TIMER_ENQUEUE(ea, iev) \ - do { \ - register struct event *ev; \ - \ - ev = (ea)[TIMER_SLOT((iev)->event_time)].prev; \ - while (ev->event_time > (iev)->event_time) \ - ev = ev->prev; \ - (iev)->prev = ev; \ - (iev)->next = ev->next; \ - (ev)->next->prev = (iev); \ - (ev)->next = (iev); \ - } while(0) - -/* - * TIMER_INSERT() also puts stuff on the timer queue, but searches the - * bucket from the top. This is better for things that do very short - * time outs, like clock support. - */ -#define TIMER_INSERT(ea, iev) \ - do { \ - register struct event *ev; \ - \ - ev = (ea)[TIMER_SLOT((iev)->event_time)].next; \ - while (ev->event_time != 0 && \ - ev->event_time < (iev)->event_time) \ - ev = ev->next; \ - (iev)->next = ev; \ - (iev)->prev = ev->prev; \ - (ev)->prev->next = (iev); \ - (ev)->prev = (iev); \ - } while(0) - -/* - * Remove an event from the queue. - */ -#define TIMER_DEQUEUE(ev) \ - do { \ - if ((ev)->next != 0) { \ - (ev)->next->prev = (ev)->prev; \ - (ev)->prev->next = (ev)->next; \ - (ev)->next = (ev)->prev = 0; \ - } \ - } while (0) - -/* - * The interface structure is used to hold the addresses and socket - * numbers of each of the interfaces we are using. - */ -struct interface { - int fd; /* socket this is opened on */ - int bfd; /* socket for receiving broadcasts */ - struct sockaddr_in sin; /* interface address */ - struct sockaddr_in bcast; /* broadcast address */ - struct sockaddr_in mask; /* interface mask */ - char name[8]; /* name of interface */ - int flags; /* interface flags */ - int last_ttl; /* last TTL specified */ - long received; /* number of incoming packets */ - long sent; /* number of outgoing packets */ - long notsent; /* number of send failures */ -}; - -/* - * Flags for interfaces - */ -#define INT_BROADCAST 1 /* can broadcast out this interface */ -#define INT_BCASTOPEN 2 /* broadcast socket is open */ -#define INT_LOOPBACK 4 /* the loopback interface */ -#define INT_MULTICAST 8 /* multicasting enabled */ - -/* - * Define flasher bits (tests 1 through 8 in packet procedure) - * These reveal the state at the last grumble from the peer and are - * most handy for diagnosing problems, even if not strictly a state - * variable in the spec. These are recorded in the peer structure. - */ -#define TEST1 0x01 /* duplicate packet received */ -#define TEST2 0x02 /* bogus packet received */ -#define TEST3 0x04 /* protocol unsynchronized */ -#define TEST4 0x08 /* peer delay/dispersion bounds check */ -#define TEST5 0x10 /* peer authentication failed */ -#define TEST6 0x20 /* peer clock unsynchronized */ -#define TEST7 0x40 /* peer stratum out of bounds */ -#define TEST8 0x80 /* root delay/dispersion bounds check */ - -/* - * The peer structure. Holds state information relating to the guys - * we are peering with. Most of this stuff is from section 3.2 of the - * spec. - */ -struct peer { - struct peer *next; - struct peer *ass_next; /* link pointer in associd hash */ - struct sockaddr_in srcadr; /* address of remote host */ - struct interface *dstadr; /* pointer to address on local host */ - struct refclockproc *procptr; /* pointer to reference clock sutuff */ - u_char leap; /* leap indicator */ - u_char hmode; /* association mode with this peer */ - u_char pmode; /* peer's association mode */ - u_char stratum; /* stratum of remote peer */ - s_char precision; /* peer's clock precision */ - u_char ppoll; /* peer poll interval */ - u_char hpoll; /* local host poll interval */ - u_char minpoll; /* min local host poll interval */ - u_char maxpoll; /* max local host poll interval */ - u_char version; /* version number */ - u_char flags; /* peer flags */ - u_char cast_flags; /* flags MDF_?CAST */ - u_char flash; /* peer flashers (for maint) */ - u_char refclktype; /* reference clock type */ - u_char refclkunit; /* reference clock unit number */ - u_char sstclktype; /* clock type for system status word */ - s_fp rootdelay; /* distance from primary clock */ - u_fp rootdispersion; /* peer clock dispersion */ - U_LONG refid; /* peer reference ID */ - l_fp reftime; /* time of peer's last update */ - struct event event_timer; /* event queue entry */ - U_LONG keyid; /* encription key ID */ - U_LONG pkeyid; /* keyid used to encrypt last message */ - u_short associd; /* association ID, a unique integer */ - u_char ttl; /* time to live (multicast) */ -/* **Start of clear-to-zero area.*** */ -/* Everything that is cleared to zero goes below here */ - u_char valid; /* valid counter */ -#define clear_to_zero valid - u_char reach; /* reachability, NTP_WINDOW bits */ - u_char unreach; /* unreachable count */ - u_short filter_nextpt; /* index into filter shift register */ - s_fp filter_delay[NTP_SHIFT]; /* delay part of shift register */ - l_fp filter_offset[NTP_SHIFT]; /* offset part of shift register */ - s_fp filter_soffset[NTP_SHIFT]; /* offset in s_fp format, for disp */ - l_fp org; /* originate time stamp */ - l_fp rec; /* receive time stamp */ - l_fp xmt; /* transmit time stamp */ -/* ***End of clear-to-zero area.*** */ -/* Everything that is cleared to zero goes above here */ - u_char filter_order[NTP_SHIFT]; /* we keep the filter sorted here */ -#define end_clear_to_zero filter_order[0] - u_fp filter_error[NTP_SHIFT]; /* error part of shift register */ - long update; /* base sys_clock for skew calc.s */ - s_fp delay; /* filter estimated delay */ - u_fp dispersion; /* filter estimated dispersion */ - l_fp offset; /* filter estimated clock offset */ - s_fp soffset; /* fp version of above */ - s_fp synch; /* synch distance from above */ - u_fp selectdisp; /* select dispersion */ - s_fp estbdelay; /* broadcast offset */ - - /* - * statistic counters - */ - u_long timereset; /* time stat counters were reset */ - u_long sent; /* number of updates sent */ - u_long received; /* number of frames received */ - u_long timereceived; /* last time a frame received */ - u_long timereachable; /* last reachable/unreachable event */ - u_long processed; /* processed by the protocol */ - u_long badauth; /* bad credentials detected */ - u_long bogusorg; /* rejected due to bogus origin */ - u_long oldpkt; /* rejected as duplicate packet */ - u_long seldisptoolarge; /* too much dispersion for selection */ - u_long selbroken; /* broken NTP detected in selection */ - u_long seltooold; /* too long since sync in selection */ - u_char candidate; /* position after candidate selection */ - u_char select; /* position at end of falseticker sel */ - u_char was_sane; /* set to 1 if it passed sanity check */ - u_char correct; /* set to 1 if it passed correctness check */ - u_char last_event; /* set to code for last peer error */ - u_char num_events; /* num. of events which have occurred */ -}; - -/* - * Values for peer.leap, sys_leap - */ -#define LEAP_NOWARNING 0x0 /* normal, no leap second warning */ -#define LEAP_ADDSECOND 0x1 /* last minute of day has 61 seconds */ -#define LEAP_DELSECOND 0x2 /* last minute of day has 59 seconds */ -#define LEAP_NOTINSYNC 0x3 /* overload, clock is free running */ - -/* - * Values for peer.mode - */ -#define MODE_UNSPEC 0 /* unspecified (probably old NTP version) */ -#define MODE_ACTIVE 1 /* symmetric active */ -#define MODE_PASSIVE 2 /* symmetric passive */ -#define MODE_CLIENT 3 /* client mode */ -#define MODE_SERVER 4 /* server mode */ -#define MODE_BROADCAST 5 /* broadcast mode */ -#define MODE_CONTROL 6 /* control mode packet */ -#define MODE_PRIVATE 7 /* implementation defined function */ - -#define MODE_BCLIENT 8 /* a pseudo mode, used internally */ -#define MODE_MCLIENT 9 /* multicast mode, used internally */ - -/* - * Values for peer.stratum, sys_stratum - */ -#define STRATUM_REFCLOCK ((u_char)0) /* stratum claimed by primary clock */ -#define STRATUM_PRIMARY ((u_char)1) /* host has a primary clock */ -#define STRATUM_INFIN ((u_char)NTP_MAXSTRATUM) /* infinity a la Bellman-Ford */ -/* A stratum of 0 in the packet is mapped to 16 internally */ -#define STRATUM_PKT_UNSPEC ((u_char)0) /* unspecified in packet */ -#define STRATUM_UNSPEC ((u_char)(NTP_MAXSTRATUM+(u_char)1)) /* unspecified */ - -/* - * Values for peer.flags - */ -#define FLAG_CONFIG 0x1 /* association was configured */ -#define FLAG_AUTHENABLE 0x2 /* this guy needs authentication */ -#define FLAG_MCAST1 0x4 /* multicast client/server mode */ -#define FLAG_MCAST2 0x8 /* multicast client mode */ -#define FLAG_AUTHENTIC 0x10 /* last message was authentic */ -#define FLAG_REFCLOCK 0x20 /* this is actually a reference clock */ -#define FLAG_SYSPEER 0x40 /* this is one of the selected peers */ -#define FLAG_PREFER 0x80 /* this is the preferred peer */ - -/* - * Definitions for the clear() routine. We use memset() to clear - * the parts of the peer structure which go to zero. These are - * used to calculate the start address and length of the area. - */ -#define CLEAR_TO_ZERO(p) ((char *)&((p)->clear_to_zero)) -#define END_CLEAR_TO_ZERO(p) ((char *)&((p)->end_clear_to_zero)) -#define LEN_CLEAR_TO_ZERO (END_CLEAR_TO_ZERO((struct peer *)0) \ - - CLEAR_TO_ZERO((struct peer *)0)) -/* - * Reference clock identifiers (for pps signal) - */ -#define PPSREFID (U_LONG)"PPS " /* used when pps controls stratum > 1 */ - -/* - * Reference clock types. Added as necessary. - */ -#define REFCLK_NONE 0 /* unknown or missing */ -#define REFCLK_LOCALCLOCK 1 /* external (e.g., lockclock) */ -#define REFCLK_GPS_TRAK 2 /* TRAK 8810 GPS Receiver */ -#define REFCLK_WWV_PST 3 /* PST/Traconex 1020 WWV/H */ -#define REFCLK_WWVB_SPECTRACOM 4 /* Spectracom 8170/Netclock WWVB */ -#define REFCLK_GOES_TRUETIME 5 /* TrueTime 468-DC GOES */ -#define REFCLK_IRIG_AUDIO 6 /* IRIG-B audio decoder */ -#define REFCLK_CHU 7 /* scratchbuilt CHU (Canada) */ -#define REFCLK_PARSE 8 /* generic driver (usually DCF77,GPS) */ -#define REFCLK_GPS_MX4200 9 /* Magnavox MX4200 GPS */ -#define REFCLK_GPS_AS2201 10 /* Austron 2201A GPS */ -#define REFCLK_OMEGA_TRUETIME 11 /* TrueTime OM-DC OMEGA */ -#define REFCLK_IRIG_TPRO 12 /* KSI/Odetics TPRO-S IRIG */ -#define REFCLK_ATOM_LEITCH 13 /* Leitch CSD 5300 Master Clock */ -#define REFCLK_MSF_EES 14 /* EES M201 MSF Receiver */ -#define REFCLK_GPSTM_TRUETIME 15 /* TrueTime GPS/TM-TMD Receiver */ -#define REFCLK_IRIG_BANCOMM 16 /* Bancomm GPS/IRIG Interface */ -#define REFCLK_GPS_DATUM 17 /* Datum Programmable Time System */ -#define REFCLK_NIST_ACTS 18 /* NIST Auto Computer Time Service */ -#define REFCLK_WWV_HEATH 19 /* Heath GC1000 WWV/WWVH Receiver */ -#define REFCLK_GPS_NMEA 20 /* NMEA based GPS clock */ -#define REFCLK_GPS_MOTO 21 /* Motorola GPS clock */ -#define REFCLK_ATOM_PPS 22 /* 1-PPS Clock Discipline */ -#define REFCLK_MAX 24 /* maximum index (room to expand) */ - -/* - * We tell reference clocks from real peers by giving the reference - * clocks an address of the form 127.127.t.u, where t is the type and - * u is the unit number. We define some of this here since we will need - * some sanity checks to make sure this address isn't interpretted as - * that of a normal peer. - */ -#define REFCLOCK_ADDR 0x7f7f0000 /* 127.127.0.0 */ -#define REFCLOCK_MASK 0xffff0000 /* 255.255.0.0 */ - -#define ISREFCLOCKADR(srcadr) ((SRCADR(srcadr) & REFCLOCK_MASK) \ - == REFCLOCK_ADDR) - -/* - * Macro for checking for invalid addresses. This is really, really - * gross, but is needed so no one configures a host on net 127 now that - * we're encouraging it the the configuration file. - */ -#define LOOPBACKADR 0x7f000001 -#define LOOPNETMASK 0xff000000 - -#define ISBADADR(srcadr) (((SRCADR(srcadr) & LOOPNETMASK) \ - == (LOOPBACKADR & LOOPNETMASK)) \ - && (SRCADR(srcadr) != LOOPBACKADR)) - -/* - * Utilities for manipulating addresses and port numbers - */ -#define NSRCADR(src) ((src)->sin_addr.s_addr) /* address in net byte order */ -#define NSRCPORT(src) ((src)->sin_port) /* port in net byte order */ -#define SRCADR(src) (ntohl(NSRCADR((src)))) /* address in host byte order */ -#define SRCPORT(src) (ntohs(NSRCPORT((src)))) /* host port */ - -/* - * NTP packet format. The mac field is optional. It isn't really - * an l_fp either, but for now declaring it that way is convenient. - * See Appendix A in the specification. - * - * Note that all u_fp and l_fp values arrive in network byte order - * and must be converted (except the mac, which isn't, really). - */ -struct pkt { - u_char li_vn_mode; /* contains leap indicator, version and mode */ - u_char stratum; /* peer's stratum */ - u_char ppoll; /* the peer polling interval */ - s_char precision; /* peer clock precision */ - s_fp rootdelay; /* distance to primary clock */ - u_fp rootdispersion; /* clock dispersion */ - U_LONG refid; /* reference clock ID */ - l_fp reftime; /* time peer clock was last updated */ - l_fp org; /* originate time stamp */ - l_fp rec; /* receive time stamp */ - l_fp xmt; /* transmit time stamp */ - -#define MIN_MAC_LEN (sizeof(U_LONG) + 8) /* DES */ -#define MAX_MAC_LEN (sizeof(U_LONG) + 16) /* MD5 */ - - U_LONG keyid; /* key identification */ - u_char mac[MAX_MAC_LEN-sizeof(U_LONG)];/* message-authentication code */ - /*l_fp mac;*/ -}; - -/* - * Packets can come in two flavours, one with a mac and one without. - */ -#define LEN_PKT_NOMAC (sizeof(struct pkt) - MAX_MAC_LEN) - -/* - * Minimum size of packet with a MAC: has to include at least a key number. - */ -#define LEN_PKT_MAC (LEN_PKT_NOMAC + sizeof(U_LONG)) - -/* - * Stuff for extracting things from li_vn_mode - */ -#define PKT_MODE(li_vn_mode) ((u_char)((li_vn_mode) & 0x7)) -#define PKT_VERSION(li_vn_mode) ((u_char)(((li_vn_mode) >> 3) & 0x7)) -#define PKT_LEAP(li_vn_mode) ((u_char)(((li_vn_mode) >> 6) & 0x3)) - -/* - * Stuff for putting things back into li_vn_mode - */ -#define PKT_LI_VN_MODE(li, vn, md) \ - ((u_char)((((li) << 6) & 0xc0) | (((vn) << 3) & 0x38) | ((md) & 0x7))) - - -/* - * Dealing with stratum. 0 gets mapped to 16 incoming, and back to 0 - * on output. - */ -#define PKT_TO_STRATUM(s) ((u_char)(((s) == (STRATUM_PKT_UNSPEC)) ?\ - (STRATUM_UNSPEC) : (s))) - -#define STRATUM_TO_PKT(s) ((u_char)(((s) == (STRATUM_UNSPEC)) ?\ - (STRATUM_PKT_UNSPEC) : (s))) - -/* - * Format of a recvbuf. These are used by the asynchronous receive - * routine to store incoming packets and related information. - */ - -/* - * the maximum length NTP packet is a full length NTP control message with - * the maximum length message authenticator. I hate to hard-code 468 and 12, - * but only a few modules include ntp_control.h... - */ -#define RX_BUFF_SIZE (468+12+MAX_MAC_LEN) - -struct recvbuf { - struct recvbuf *next; /* next buffer in chain */ - union { - struct sockaddr_in X_recv_srcadr; - caddr_t X_recv_srcclock; - } X_from_where; -#define recv_srcadr X_from_where.X_recv_srcadr -#define recv_srcclock X_from_where.X_recv_srcclock - struct sockaddr_in srcadr; /* where packet came from */ - struct interface *dstadr; /* interface datagram arrived thru */ - int fd; /* fd on which it was received */ - l_fp recv_time; /* time of arrival */ - void (*receiver)(); /* routine to receive buffer */ - int recv_length; /* number of octets received */ - union { - struct pkt X_recv_pkt; - char X_recv_buffer[RX_BUFF_SIZE]; - } recv_space; -#define recv_pkt recv_space.X_recv_pkt -#define recv_buffer recv_space.X_recv_buffer -}; - - -/* - * Event codes. Used for reporting errors/events to the control module - */ -#define PEER_EVENT 0x80 /* this is a peer event */ - -#define EVNT_UNSPEC 0 -#define EVNT_SYSRESTART 1 -#define EVNT_SYSFAULT 2 -#define EVNT_SYNCCHG 3 -#define EVNT_PEERSTCHG 4 -#define EVNT_CLOCKRESET 5 -#define EVNT_BADDATETIM 6 -#define EVNT_CLOCKEXCPT 7 - -#define EVNT_PEERIPERR (1|PEER_EVENT) -#define EVNT_PEERAUTH (2|PEER_EVENT) -#define EVNT_UNREACH (3|PEER_EVENT) -#define EVNT_REACH (4|PEER_EVENT) -#define EVNT_PEERCLOCK (5|PEER_EVENT) - -/* - * Clock event codes - */ -#define CEVNT_NOMINAL 0 -#define CEVNT_TIMEOUT 1 -#define CEVNT_BADREPLY 2 -#define CEVNT_FAULT 3 -#define CEVNT_PROP 4 -#define CEVNT_BADDATE 5 -#define CEVNT_BADTIME 6 -#define CEVNT_MAX CEVNT_BADTIME - -/* - * Very misplaced value. Default port through which we send traps. - */ -#define TRAPPORT 18447 - - -/* - * To speed lookups, peers are hashed by the low order bits of the remote - * IP address. These definitions relate to that. - */ -#define HASH_SIZE 32 -#define HASH_MASK (HASH_SIZE-1) -#define HASH_ADDR(src) ((SRCADR((src))^(SRCADR((src))>>8)) & HASH_MASK) - - -/* - * The poll update procedure takes an extra argument which controls - * how a random perturbation is applied to peer.timer. The choice is - * to not randomize at all, to randomize only if we're going to update - * peer.timer, and to randomize no matter what (almost, the algorithm - * is that we apply the random value if it is less than the current - * timer count). - */ -#define POLL_NOTRANDOM 0 /* don't randomize */ -#define POLL_RANDOMCHANGE 1 /* if you change, change randomly */ -#define POLL_MAKERANDOM 2 /* randomize next interval */ - - -/* - * How we randomize polls. The poll interval is a power of two. - * We chose a random value which is between 1/4 and 3/4 of the - * poll interval we would normally use and which is an even multiple - * of the EVENT_TIMEOUT. The random number routine, given an argument - * spread value of n, returns an integer between 0 and (1<<n)-1. This - * is shifted by EVENT_TIMEOUT and added to the base value. - */ -#define RANDOM_SPREAD(poll) ((poll) - (EVENT_TIMEOUT+1)) -#define RANDOM_POLL(poll, rval) ((((rval)+1)<<EVENT_TIMEOUT) + (1<<((poll)-2))) - -/* - * min, min3 and max. Makes it easier to transliterate the spec without - * thinking about it. - */ -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#define max(a,b) (((a) > (b)) ? (a) : (b)) -#define min3(a,b,c) min(min((a),(b)), (c)) - - -/* - * Configuration items. These are for the protocol module (proto_config()) - */ -#define PROTO_BROADCLIENT 1 -#define PROTO_PRECISION 2 -#define PROTO_AUTHENTICATE 3 -#define PROTO_BROADDELAY 4 -#define PROTO_AUTHDELAY 5 -#define PROTO_MULTICAST_ADD 6 -#define PROTO_MULTICAST_DEL 7 -#define PROTO_PLL 8 -#define PROTO_PPS 9 -#define PROTO_MONITOR 10 -#define PROTO_FILEGEN 11 - -/* - * Configuration items for the loop filter - */ -#define LOOP_DRIFTCOMP 1 /* set frequency offset */ -#define LOOP_PPSDELAY 2 /* set pps delay */ -#define LOOP_PPSBAUD 3 /* set pps baud rate */ - -/* - * Configuration items for the stats printer - */ -#define STATS_FREQ_FILE 1 /* configure drift file */ -#define STATS_STATSDIR 2 /* directory prefix for stats files */ -#define STATS_PID_FILE 3 /* configure xntpd PID file */ - -#define MJD_1970 40587 /* MJD for 1 Jan 1970 */ - -/* - * Default parameters. We use these in the absense of something better. - */ -#define DEFPRECISION (-7) /* default precision (~10 ms) */ -#define DEFBROADDELAY 0x00000100 /* default broadcast offset */ - /* (~4 ms as s_fp) */ -#define DEFAUTHDELAY 0x00080000 /* default authentcation delay */ - /* (~100 us as l_fp.u_f) */ -#define INADDR_NTP 0xe0000101 /* NTP multicast address 224.0.1.1 */ -/* - * Structure used optionally for monitoring when this is turned on. - */ -struct mon_data { - struct mon_data *hash_next; /* next structure in hash list */ - struct mon_data *mru_next; /* next structure in MRU list */ - struct mon_data *mru_prev; /* previous structure in MRU list */ - struct mon_data *fifo_next; /* next structure in FIFO list */ - struct mon_data *fifo_prev; /* previous structure in FIFO list */ - u_long lastdrop; /* last time dropped due to RES_LIMIT*/ - u_long lasttime; /* last time data updated */ - u_long firsttime; /* time structure initialized */ - u_long count; /* count we have seen */ - U_LONG rmtadr; /* address of remote host */ - struct interface *interface; /* interface on which this arrived */ - u_short rmtport; /* remote port last came from */ - u_char mode; /* mode of incoming packet */ - u_char version; /* version of incoming packet */ - u_char cast_flags; /* flags MDF_?CAST */ -}; - -#define MDF_UCAST 1 /* unicast packet */ -#define MDF_MCAST 2 /* multicast packet */ -#define MDF_BCAST 4 /* broadcast packet */ -#define MDF_LCAST 8 /* local packet */ - -/* - * Values used with mon_enabled to indicate reason for enabling monitoring - */ -#define MON_OFF 0x00 /* no monitoring */ -#define MON_ON 0x01 /* monitoring explicitly enabled */ -#define MON_RES 0x02 /* implicit monitoring for RES_LIMITED */ -/* - * Structure used for restrictlist entries - */ -struct restrictlist { - struct restrictlist *next; /* link to next entry */ - U_LONG addr; /* host address (host byte order) */ - U_LONG mask; /* mask for address (host byte order) */ - u_long count; /* number of packets matched */ - u_short flags; /* accesslist flags */ - u_short mflags; /* match flags */ -}; - -/* - * Access flags - */ -#define RES_IGNORE 0x1 /* ignore if matched */ -#define RES_DONTSERVE 0x2 /* don't give him any time */ -#define RES_DONTTRUST 0x4 /* don't trust if matched */ -#define RES_NOQUERY 0x8 /* don't allow queries if matched */ -#define RES_NOMODIFY 0x10 /* don't allow him to modify server */ -#define RES_NOPEER 0x20 /* don't allocate memory resources */ -#define RES_NOTRAP 0x40 /* don't allow him to set traps */ -#define RES_LPTRAP 0x80 /* traps set by him are low priority */ -#define RES_LIMITED 0x100 /* limit per net number of clients */ - -#define RES_ALLFLAGS \ - (RES_IGNORE|RES_DONTSERVE|RES_DONTTRUST|RES_NOQUERY\ - |RES_NOMODIFY|RES_NOPEER|RES_NOTRAP|RES_LPTRAP|RES_LIMITED) - -/* - * Match flags - */ -#define RESM_INTERFACE 0x1 /* this is an interface */ -#define RESM_NTPONLY 0x2 /* match ntp port only */ - -/* - * Restriction configuration ops - */ -#define RESTRICT_FLAGS 1 /* add flags to restrict entry */ -#define RESTRICT_UNFLAG 2 /* remove flags from restrict entry */ -#define RESTRICT_REMOVE 3 /* remove a restrict entry */ - - -/* - * Experimental alternate selection algorithm identifiers - */ -#define SELECT_1 1 -#define SELECT_2 2 -#define SELECT_3 3 -#define SELECT_4 4 -#define SELECT_5 5 - -/* - * Endpoint structure for the select algorithm - */ -struct endpoint { - s_fp val; /* offset of endpoint */ - int type; /* interval entry/exit */ -}; diff --git a/usr.sbin/xntpd/include/ntp_calendar.h b/usr.sbin/xntpd/include/ntp_calendar.h deleted file mode 100644 index 461aee4ce9af..000000000000 --- a/usr.sbin/xntpd/include/ntp_calendar.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ntp_calendar.h - definitions for the calendar time-of-day routine - */ - -#include "ntp_types.h" - -struct calendar { - u_short year; /* year (A.D.) */ - u_short yearday; /* day of year, 1 = January 1 */ - u_char month; /* month, 1 = January */ - u_char monthday; /* day of month */ - u_char hour; /* hour of day, midnight = 0 */ - u_char minute; /* minute of hour */ - u_char second; /* second of minute */ -}; - -/* - * Days in each month. 30 days hath September... - */ -#define JAN 31 -#define FEB 28 -#define FEBLEAP 29 -#define MAR 31 -#define APR 30 -#define MAY 31 -#define JUN 30 -#define JUL 31 -#define AUG 31 -#define SEP 30 -#define OCT 31 -#define NOV 30 -#define DEC 31 - -/* - * We deal in a 4 year cycle starting at March 1, 1900. We assume - * we will only want to deal with dates since then, and not to exceed - * the rollover day in 2036. - */ -#define SECSPERMIN (60) /* seconds per minute */ -#define MINSPERHR (60) /* minutes per hour */ -#define HRSPERDAY (24) /* hours per day */ -#define DAYSPERYEAR (365) /* days per year */ - -#define SECSPERDAY (SECSPERMIN*MINSPERHR*HRSPERDAY) -#define SECSPERYEAR (365 * SECSPERDAY) /* regular year */ -#define SECSPERLEAPYEAR (366 * SECSPERDAY) /* leap year */ - -#define MAR1900 ((JAN+FEB) * SECSPERDAY) /* no leap year in 1900 */ -#define DAYSPERCYCLE (365+365+365+366) /* 3 normal years plus leap */ -#define SECSPERCYCLE (DAYSPERCYCLE*SECSPERDAY) -#define YEARSPERCYCLE 4 - -/* - * Gross hacks. I have illicit knowlege that there won't be overflows - * here, the compiler often can't tell this. - */ -#define TIMES60(val) ((((val)<<4) - (val))<<2) /* *(16 - 1) * 4 */ -#define TIMES24(val) (((val)<<4) + ((val)<<3)) /* *16 + *8 */ -#define TIMES7(val) (((val)<<3) - (val)) /* *8 - *1 */ -#define TIMESDPERC(val) (((val)<<10) + ((val)<<8) \ - + ((val)<<7) + ((val)<<5) \ - + ((val)<<4) + ((val)<<2) + (val)) /* *big* hack */ - -/* - * Another big hack. Cycle 22 started on March 1, 1988. This is - * STARTCYCLE22 seconds after the start of cycle 0. - */ -#define CYCLE22 (22) -#define STARTCYCLE22 (u_long)(0xa586b500) /* 2777068800 */ -#define MAR1988 (u_long)(STARTCYCLE22 + (u_long)MAR1900) - -/* - * The length of January + February in leap and non-leap years. - */ -#define JANFEBNOLEAP ((JAN+FEB) * SECSPERDAY) -#define JANFEBLEAP ((JAN+FEBLEAP) * SECSPERDAY) - -extern void caljulian P((u_long, struct calendar *)); -extern u_long caltontp P((const struct calendar *)); - diff --git a/usr.sbin/xntpd/include/ntp_control.h b/usr.sbin/xntpd/include/ntp_control.h deleted file mode 100644 index 1124bb0cbbba..000000000000 --- a/usr.sbin/xntpd/include/ntp_control.h +++ /dev/null @@ -1,253 +0,0 @@ -/* - * ntp_control.h - definitions related to NTP mode 6 control messages - */ - -#include "ntp_types.h" - -struct ntp_control { - u_char li_vn_mode; /* leap, version, mode */ - u_char r_m_e_op; /* response, more, error, opcode */ - u_short sequence; /* sequence number of request */ - u_short status; /* status word for association */ - u_short associd; /* association ID */ - u_short offset; /* offset of this batch of data */ - u_short count; /* count of data in this packet */ - u_char data[(480 + MAX_MAC_LEN)]; /* data + auth */ -}; - -/* - * Length of the control header, in octets - */ -#define CTL_HEADER_LEN 12 -#define CTL_MAX_DATA_LEN 468 - - -/* - * Limits and things - */ -#define CTL_MAXTRAPS 3 /* maximum number of traps we allow */ -#define CTL_TRAPTIME (60*60) /* time out traps in 1 hour */ -#define CTL_MAXAUTHSIZE 64 /* maximum size of an authen'ed req */ - -/* - * Decoding for the r_m_e_op field - */ -#define CTL_RESPONSE 0x80 -#define CTL_ERROR 0x40 -#define CTL_MORE 0x20 -#define CTL_OP_MASK 0x1f - -#define CTL_ISRESPONSE(r_m_e_op) (((r_m_e_op) & 0x80) != 0) -#define CTL_ISMORE(r_m_e_op) (((r_m_e_op) & 0x20) != 0) -#define CTL_ISERROR(r_m_e_op) (((r_m_e_op) & 0x40) != 0) -#define CTL_OP(r_m_e_op) ((r_m_e_op) & CTL_OP_MASK) - -/* - * Opcodes - */ -#define CTL_OP_UNSPEC 0 -#define CTL_OP_READSTAT 1 -#define CTL_OP_READVAR 2 -#define CTL_OP_WRITEVAR 3 -#define CTL_OP_READCLOCK 4 -#define CTL_OP_WRITECLOCK 5 -#define CTL_OP_SETTRAP 6 -#define CTL_OP_ASYNCMSG 7 -#define CTL_OP_UNSETTRAP 31 - -/* - * {En,De}coding of the system status word - */ -#define CTL_SST_TS_UNSPEC 0 /* time source unspecified */ -#define CTL_SST_TS_ATOM 1 /* time source calibrated atomic */ -#define CTL_SST_TS_LF 2 /* time source VLF or LF radio */ -#define CTL_SST_TS_HF 3 /* time source HF radio */ -#define CTL_SST_TS_UHF 4 /* time source UHF radio */ -#define CTL_SST_TS_LOCAL 5 /* time source LOCAL */ -#define CTL_SST_TS_NTP 6 /* time source NTP */ -#define CTL_SST_TS_UDPTIME 7 /* time source UDP/TIME */ -#define CTL_SST_TS_WRSTWTCH 8 /* time source is wristwatch */ -#define CTL_SST_TS_TELEPHONE 9 /* time source is telephone modem */ -#define CTL_SST_TS_PPS 0x20 /* time source is PPS signal */ - -#define CTL_SYS_MAXEVENTS 15 - -#define CTL_SYS_STATUS(li, source, nevnt, evnt) \ - (((((unsigned short)(li))<< 14)&0xc000) | \ - (((source)<<8)&0x3f00) | \ - (((nevnt)<<4)&0x00f0) | \ - ((evnt)&0x000f)) - -#define CTL_SYS_LI(status) (((status)>>14) & 0x3) -#define CTL_SYS_SOURCE(status) (((status)>>8) & 0x3f) -#define CTL_SYS_NEVNT(status) (((status)>>4) & 0xf) -#define CTL_SYS_EVENT(status) ((status) & 0xf) - -/* - * {En,De}coding of the peer status word - */ -#define CTL_PST_CONFIG 0x80 -#define CTL_PST_AUTHENABLE 0x40 -#define CTL_PST_AUTHENTIC 0x20 -#define CTL_PST_REACH 0x10 -#define CTL_PST_UNSPEC 0x08 - -#define CTL_PST_SEL_REJECT 0 /* rejected */ -#define CTL_PST_SEL_SANE 1 /* passed sanity checks */ -#define CTL_PST_SEL_CORRECT 2 /* passed correctness checks */ -#define CTL_PST_SEL_SELCAND 3 /* passed candidate checks */ -#define CTL_PST_SEL_SYNCCAND 4 /* passed outlyer checks */ -#define CTL_PST_SEL_DISTSYSPEER 5 /* selected, distance exceeded */ -#define CTL_PST_SEL_SYSPEER 6 /* selected */ -#define CTL_PST_SEL_PPS 7 /* selected, pps signal override */ - -#define CTL_PEER_MAXEVENTS 15 - -#define CTL_PEER_STATUS(status, nevnt, evnt) \ - ((((status)<<8) & 0xff00) | \ - (((nevnt)<<4) & 0x00f0) | \ - ((evnt) & 0x000f)) - -#define CTL_PEER_STATVAL(status)(((status)>>8) & 0xff) -#define CTL_PEER_NEVNT(status) (((status)>>4) & 0xf) -#define CTL_PEER_EVENT(status) ((status) & 0xf) - -/* - * {En,De}coding of the clock status word - */ -#define CTL_CLK_OKAY 0 -#define CTL_CLK_NOREPLY 1 -#define CTL_CLK_BADFORMAT 2 -#define CTL_CLK_FAULT 3 -#define CTL_CLK_PROPAGATION 4 -#define CTL_CLK_BADDATE 5 -#define CTL_CLK_BADTIME 6 - -#define CTL_CLK_STATUS(status, event) \ - ((((status)<<8) & 0xff00) | \ - ((event) & 0x00ff)) - -/* - * Error code responses returned when the E bit is set. - */ -#define CERR_UNSPEC 0 -#define CERR_PERMISSION 1 -#define CERR_BADFMT 2 -#define CERR_BADOP 3 -#define CERR_BADASSOC 4 -#define CERR_UNKNOWNVAR 5 -#define CERR_BADVALUE 6 -#define CERR_RESTRICT 7 - -#define CERR_NORESOURCE CERR_PERMISSION /* wish there was a different code */ - - -/* - * System variables we understand - */ -#define CS_LEAP 1 -#define CS_STRATUM 2 -#define CS_PRECISION 3 -#define CS_ROOTDELAY 4 -#define CS_ROOTDISPERSION 5 -#define CS_REFID 6 -#define CS_REFTIME 7 -#define CS_POLL 8 -#define CS_PEERID 9 -#define CS_OFFSET 10 -#define CS_DRIFT 11 -#define CS_COMPLIANCE 12 -#define CS_CLOCK 13 -#define CS_LEAPIND 14 -#define CS_LEAPWARNING 15 -#define CS_PROCESSOR 16 -#define CS_SYSTEM 17 -#define CS_KEYID 18 -#define CS_REFSKEW 19 -#define CS_VARLIST 20 - -#define CS_MAXCODE CS_VARLIST - -/* - * Peer variables we understand - */ -#define CP_CONFIG 1 -#define CP_AUTHENABLE 2 -#define CP_AUTHENTIC 3 -#define CP_SRCADR 4 -#define CP_SRCPORT 5 -#define CP_DSTADR 6 -#define CP_DSTPORT 7 -#define CP_LEAP 8 -#define CP_HMODE 9 -#define CP_STRATUM 10 -#define CP_PPOLL 11 -#define CP_HPOLL 12 -#define CP_PRECISION 13 -#define CP_ROOTDELAY 14 -#define CP_ROOTDISPERSION 15 -#define CP_REFID 16 -#define CP_REFTIME 17 -#define CP_ORG 18 -#define CP_REC 19 -#define CP_XMT 20 -#define CP_REACH 21 -#define CP_VALID 22 -#define CP_TIMER 23 -#define CP_DELAY 24 -#define CP_OFFSET 25 -#define CP_DISPERSION 26 -#define CP_KEYID 27 -#define CP_FILTDELAY 28 -#define CP_FILTOFFSET 29 -#define CP_PMODE 30 -#define CP_RECEIVED 31 -#define CP_SENT 32 -#define CP_FILTERROR 33 -#define CP_FLASH 34 -#define CP_DISP 35 -#define CP_VARLIST 36 - -#define CP_MAXCODE CP_VARLIST - -/* - * Clock variables we understand - */ -#define CC_TYPE 1 -#define CC_TIMECODE 2 -#define CC_POLL 3 -#define CC_NOREPLY 4 -#define CC_BADFORMAT 5 -#define CC_BADDATA 6 -#define CC_FUDGETIME1 7 -#define CC_FUDGETIME2 8 -#define CC_FUDGEVAL1 9 -#define CC_FUDGEVAL2 10 -#define CC_FLAGS 11 -#define CC_DEVICE 12 -#define CC_VARLIST 13 - -#define CC_MAXCODE CC_VARLIST - -/* - * Definition of the structure used internally to hold trap information. - * ntp_request.c wants to see this. - */ -struct ctl_trap { - struct sockaddr_in tr_addr; /* address of trap recipient */ - struct interface *tr_localaddr; /* interface to send this through */ - u_long tr_settime; /* time trap was set */ - u_long tr_count; /* async messages sent to this guy */ - u_long tr_origtime; /* time trap was originally set */ - u_long tr_resets; /* count of resets for this trap */ - u_short tr_sequence; /* trap sequence id */ - u_char tr_flags; /* trap flags */ - u_char tr_version; /* version number of trapper */ -}; - -/* - * Flag bits - */ -#define TRAP_INUSE 0x1 /* this trap is active */ -#define TRAP_NONPRIO 0x2 /* this trap is non-priority */ -#define TRAP_CONFIGURED 0x4 /* this trap was configured */ diff --git a/usr.sbin/xntpd/include/ntp_datum.h b/usr.sbin/xntpd/include/ntp_datum.h deleted file mode 100644 index 2aa2cb742d01..000000000000 --- a/usr.sbin/xntpd/include/ntp_datum.h +++ /dev/null @@ -1,30 +0,0 @@ -struct btfp_time /* Structure for reading 5 time words */ - /* in one ioctl(2) operation. */ -{ - unsigned short btfp_time[5]; /* Time words 0,1,2,3, and 4. (16bit)*/ -}; - -/***** Simple ioctl commands *****/ - -#define RUNLOCK _IO('X',19) /* Release Capture Lockout */ -#define RCR0 _IOR('X',22,unsigned int) /* Read control register */ -#define WCR0 _IOW('X',23,unsigned int) /* Write control register */ - -/***** Compound ioctl commands *****/ - -/* Read all 5 time words in one call. */ -#define READTIME _IOR('X',32,struct btfp_time) -#define VMEFD "/dev/btfp0" - - struct vmedate { /* structure returned by get_vmetime.c */ - unsigned short year; - unsigned short doy; - unsigned short hr; - unsigned short mn; - unsigned short sec; - unsigned long frac; - unsigned short status; - }; - -#define PRIO 120 /* set the realtime priority */ -#define NREGS 7 /* number of registers we will use */ diff --git a/usr.sbin/xntpd/include/ntp_filegen.h b/usr.sbin/xntpd/include/ntp_filegen.h deleted file mode 100644 index 9e75bc63fc97..000000000000 --- a/usr.sbin/xntpd/include/ntp_filegen.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * ntp_filegen.h,v 3.8 1994/05/30 09:48:53 kardel Exp - * - * definitions for NTP file generations support - * - * - * Copyright (c) 1992 - * Rainer Pruy Friedrich-Alexander Unuiversitaet Erlangen-Nuernberg - * - * This code may be modified and used freely - * provided the credits remain intact. - */ - -#include "ntp_types.h" - -/* - * supported file generation types - */ - -#define FILEGEN_NONE 255 /* no generations - use plain file name */ -#define FILEGEN_PID 1 /* one filegen per process incarnation */ -#define FILEGEN_DAY 2 /* one filegen per day */ -#define FILEGEN_WEEK 3 /* one filegen per week */ -#define FILEGEN_MONTH 4 /* one filegen per month */ -#define FILEGEN_YEAR 5 /* one filegen per year */ -#define FILEGEN_AGE 6 /* change filegen each FG_AGE_SECS */ - -/* - * supported file generation flags - */ - -#define FGEN_FLAG_LINK 0x01 /* make a link to base name */ - -#define FGEN_FLAG_ENABLED 0x80 /* set this to really create files */ - /* without this, open is suppressed */ - -typedef struct FILEGEN - { - FILE *fp; /* file referring to current generation */ - char *prefix; /* filename prefix and basename to be used*/ - char *basename; /* for constructing filename of generation file */ - /* WARNING: must be malloced !!! will be fed to free()*/ - u_long id; /* id of current generation */ - u_char type; /* type of file generation */ - u_char flag; /* flags modifying processing of file generation */ - } FILEGEN; - -extern void filegen_setup P((FILEGEN *, u_long)); -extern void filegen_config P((FILEGEN *, char *, u_int, u_int)); -extern FILEGEN *filegen_get P((char *)); -extern void filegen_register P((char *, FILEGEN *)); diff --git a/usr.sbin/xntpd/include/ntp_fp.h b/usr.sbin/xntpd/include/ntp_fp.h deleted file mode 100644 index ec657f7fb451..000000000000 --- a/usr.sbin/xntpd/include/ntp_fp.h +++ /dev/null @@ -1,316 +0,0 @@ -/* - * ntp_fp.h - definitions for NTP fixed point arithmetic - */ - -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> - -#include "ntp_types.h" - -/* - * NTP uses two fixed point formats. The first (l_fp) is the "long" format - * and is 64 bits long with the decimal between bits 31 and 32. This - * is used for time stamps in the NTP packet header (in network byte - * order) and for internal computations of offsets (in local host byte - * order). We use the same structure for both signed and unsigned values, - * which is a big hack but saves rewriting all the operators twice. Just - * to confuse this, we also sometimes just carry the fractional part in - * calculations, in both signed and unsigned forms. Anyway, an l_fp looks - * like: - * - * 0 1 2 3 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Integral Part | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Fractional Part | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - */ -typedef struct { - union { - U_LONG Xl_ui; - LONG Xl_i; - } Ul_i; - union { - U_LONG Xl_uf; - LONG Xl_f; - } Ul_f; -} l_fp; - -#define l_ui Ul_i.Xl_ui /* unsigned integral part */ -#define l_i Ul_i.Xl_i /* signed integral part */ -#define l_uf Ul_f.Xl_uf /* unsigned fractional part */ -#define l_f Ul_f.Xl_f /* signed fractional part */ - -/* - * Fractional precision (of an l_fp) is actually the number of - * bits in a long. - */ -#define FRACTION_PREC (32) - - -/* - * The second fixed point format is 32 bits, with the decimal between - * bits 15 and 16. There is a signed version (s_fp) and an unsigned - * version (u_fp). This is used to represent synchronizing distance - * and synchronizing dispersion in the NTP packet header (again, in - * network byte order) and internally to hold both distance and - * dispersion values (in local byte order). In network byte order - * it looks like: - * - * 0 1 2 3 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Integer Part | Fraction Part | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - */ -typedef LONG s_fp; -typedef U_LONG u_fp; - -/* - * A unit second in fp format. Actually 2**(half_the_bits_in_a_long) - */ -#define FP_SECOND (0x10000) - -/* - * Byte order conversions - */ -#define HTONS_FP(x) (htonl(x)) -#define HTONL_FP(h, n) do { (n)->l_ui = htonl((h)->l_ui); \ - (n)->l_uf = htonl((h)->l_uf); } while (0) -#define NTOHS_FP(x) (ntohl(x)) -#define NTOHL_FP(n, h) do { (h)->l_ui = ntohl((n)->l_ui); \ - (h)->l_uf = ntohl((n)->l_uf); } while (0) -#define NTOHL_MFP(ni, nf, hi, hf) \ - do { (hi) = ntohl(ni); (hf) = ntohl(nf); } while (0) -#define HTONL_MFP(hi, hf, ni, nf) \ - do { (ni) = ntohl(hi); (nf) = ntohl(hf); } while (0) - -/* funny ones. Converts ts fractions to net order ts */ -#define HTONL_UF(uf, nts) \ - do { (nts)->l_ui = 0; (nts)->l_uf = htonl(uf); } while (0) -#define HTONL_F(f, nts) do { (nts)->l_uf = htonl(f); \ - if ((f) & 0x80000000) \ - (nts)->l_i = -1; \ - else \ - (nts)->l_i = 0; \ - } while (0) - -/* - * Conversions between the two fixed point types - */ -#define MFPTOFP(x_i, x_f) (((x_i)<<16) | (((x_f)>>16)&0xffff)) -#define LFPTOFP(v) MFPTOFP((v)->l_i, (v)->l_f) - -#define UFPTOLFP(x, v) ((v)->l_ui = (u_fp)(x)>>16, (v)->l_uf = (x)<<16) -#define FPTOLFP(x, v) (UFPTOLFP((x), (v)), (x) < 0 ? (v)->l_ui -= 0x10000 : 0) - -/* - * Primitive operations on long fixed point values. If these are - * reminiscent of assembler op codes it's only because some may - * be replaced by inline assembler for particular machines someday. - * These are the (kind of inefficient) run-anywhere versions. - */ -#define M_NEG(v_i, v_f) /* v = -v */ \ - do { \ - if ((v_f) == 0) \ - (v_i) = -(v_i); \ - else { \ - (v_f) = -(v_f); \ - (v_i) = ~(v_i); \ - } \ - } while(0) - -#define M_NEGM(r_i, r_f, a_i, a_f) /* r = -a */ \ - do { \ - if ((a_f) == 0) { \ - (r_f) = 0; \ - (r_i) = -(a_i); \ - } else { \ - (r_f) = -(a_f); \ - (r_i) = ~(a_i); \ - } \ - } while(0) - -#define M_ADD(r_i, r_f, a_i, a_f) /* r += a */ \ - do { \ - register U_LONG lo_tmp; \ - register U_LONG hi_tmp; \ - \ - lo_tmp = ((r_f) & 0xffff) + ((a_f) & 0xffff); \ - hi_tmp = (((r_f) >> 16) & 0xffff) + (((a_f) >> 16) & 0xffff); \ - if (lo_tmp & 0x10000) \ - hi_tmp++; \ - (r_f) = ((hi_tmp & 0xffff) << 16) | (lo_tmp & 0xffff); \ - \ - (r_i) += (a_i); \ - if (hi_tmp & 0x10000) \ - (r_i)++; \ - } while (0) - -#define M_ADD3(r_ovr, r_i, r_f, a_ovr, a_i, a_f) /* r += a, three word */ \ - do { \ - register U_LONG lo_tmp; \ - register U_LONG hi_tmp; \ - \ - lo_tmp = ((r_f) & 0xffff) + ((a_f) & 0xffff); \ - hi_tmp = (((r_f) >> 16) & 0xffff) + (((a_f) >> 16) & 0xffff); \ - if (lo_tmp & 0x10000) \ - hi_tmp++; \ - (r_f) = ((hi_tmp & 0xffff) << 16) | (lo_tmp & 0xffff); \ - \ - lo_tmp = ((r_i) & 0xffff) + ((a_i) & 0xffff); \ - if (hi_tmp & 0x10000) \ - lo_tmp++; \ - hi_tmp = (((r_i) >> 16) & 0xffff) + (((a_i) >> 16) & 0xffff); \ - if (lo_tmp & 0x10000) \ - hi_tmp++; \ - (r_i) = ((hi_tmp & 0xffff) << 16) | (lo_tmp & 0xffff); \ - \ - (r_ovr) += (a_ovr); \ - if (hi_tmp & 0x10000) \ - (r_ovr)++; \ - } while (0) - -#define M_SUB(r_i, r_f, a_i, a_f) /* r -= a */ \ - do { \ - register U_LONG lo_tmp; \ - register U_LONG hi_tmp; \ - \ - if ((a_f) == 0) { \ - (r_i) -= (a_i); \ - } else { \ - lo_tmp = ((r_f) & 0xffff) + ((-(a_f)) & 0xffff); \ - hi_tmp = (((r_f) >> 16) & 0xffff) \ - + (((-(a_f)) >> 16) & 0xffff); \ - if (lo_tmp & 0x10000) \ - hi_tmp++; \ - (r_f) = ((hi_tmp & 0xffff) << 16) | (lo_tmp & 0xffff); \ - \ - (r_i) += ~(a_i); \ - if (hi_tmp & 0x10000) \ - (r_i)++; \ - } \ - } while (0) - -#define M_RSHIFTU(v_i, v_f) /* v >>= 1, v is unsigned */ \ - do { \ - (v_f) = (U_LONG)(v_f) >> 1; \ - if ((v_i) & 01) \ - (v_f) |= 0x80000000; \ - (v_i) = (U_LONG)(v_i) >> 1; \ - } while (0) - -#define M_RSHIFT(v_i, v_f) /* v >>= 1, v is signed */ \ - do { \ - (v_f) = (U_LONG)(v_f) >> 1; \ - if ((v_i) & 01) \ - (v_f) |= 0x80000000; \ - if ((v_i) & 0x80000000) \ - (v_i) = ((v_i) >> 1) | 0x80000000; \ - else \ - (v_i) = (v_i) >> 1; \ - } while (0) - -#define M_LSHIFT(v_i, v_f) /* v <<= 1 */ \ - do { \ - (v_i) <<= 1; \ - if ((v_f) & 0x80000000) \ - (v_i) |= 0x1; \ - (v_f) <<= 1; \ - } while (0) - -#define M_LSHIFT3(v_ovr, v_i, v_f) /* v <<= 1, with overflow */ \ - do { \ - (v_ovr) <<= 1; \ - if ((v_i) & 0x80000000) \ - (v_ovr) |= 0x1; \ - (v_i) <<= 1; \ - if ((v_f) & 0x80000000) \ - (v_i) |= 0x1; \ - (v_f) <<= 1; \ - } while (0) - -#define M_ADDUF(r_i, r_f, uf) /* r += uf, uf is U_LONG fraction */ \ - M_ADD((r_i), (r_f), 0, (uf)) /* let optimizer worry about it */ - -#define M_SUBUF(r_i, r_f, uf) /* r -= uf, uf is U_LONG fraction */ \ - M_SUB((r_i), (r_f), 0, (uf)) /* let optimizer worry about it */ - -#define M_ADDF(r_i, r_f, f) /* r += f, f is a LONG fraction */ \ - do { \ - if ((f) > 0) \ - M_ADD((r_i), (r_f), 0, (f)); \ - else if ((f) < 0) \ - M_ADD((r_i), (r_f), (-1), (f));\ - } while(0) - -#define M_ISNEG(v_i, v_f) /* v < 0 */ \ - (((v_i) & 0x80000000) != 0) - -#define M_ISHIS(a_i, a_f, b_i, b_f) /* a >= b unsigned */ \ - (((U_LONG)(a_i)) > ((U_LONG)(b_i)) || \ - ((a_i) == (b_i) && ((U_LONG)(a_f)) >= ((U_LONG)(b_f)))) - -#define M_ISGEQ(a_i, a_f, b_i, b_f) /* a >= b signed */ \ - (((LONG)(a_i)) > ((LONG)(b_i)) || \ - ((a_i) == (b_i) && ((U_LONG)(a_f)) >= ((U_LONG)(b_f)))) - -#define M_ISEQU(a_i, a_f, b_i, b_f) /* a == b unsigned */ \ - ((a_i) == (b_i) && (a_f) == (b_f)) - -/* - * Operations on the long fp format - */ -#define L_ADD(r, a) M_ADD((r)->l_ui, (r)->l_uf, (a)->l_ui, (a)->l_uf) -#define L_SUB(r, a) M_SUB((r)->l_ui, (r)->l_uf, (a)->l_ui, (a)->l_uf) -#define L_NEG(v) M_NEG((v)->l_ui, (v)->l_uf) -#define L_ADDUF(r, uf) M_ADDUF((r)->l_ui, (r)->l_uf, (uf)) -#define L_SUBUF(r, uf) M_SUBUF((r)->l_ui, (r)->l_uf, (uf)) -#define L_ADDF(r, f) M_ADDF((r)->l_ui, (r)->l_uf, (f)) -#define L_RSHIFT(v) M_RSHIFT((v)->l_i, (v)->l_uf) -#define L_RSHIFTU(v) M_RSHIFT((v)->l_ui, (v)->l_uf) -#define L_LSHIFT(v) M_LSHIFT((v)->l_ui, (v)->l_uf) -#define L_CLR(v) ((v)->l_ui = (v)->l_uf = 0) - -#define L_ISNEG(v) (((v)->l_ui & 0x80000000) != 0) -#define L_ISZERO(v) ((v)->l_ui == 0 && (v)->l_uf == 0) -#define L_ISHIS(a, b) ((a)->l_ui > (b)->l_ui || \ - ((a)->l_ui == (b)->l_ui && (a)->l_uf >= (b)->l_uf)) -#define L_ISGEQ(a, b) ((a)->l_i > (b)->l_i || \ - ((a)->l_i == (b)->l_i && (a)->l_uf >= (b)->l_uf)) -#define L_ISEQU(a, b) M_ISEQU((a)->l_ui, (a)->l_uf, (b)->l_ui, (b)->l_uf) - -extern char * dofptoa P((u_fp, int, int, int)); -extern char * dolfptoa P((u_long, u_long, int, int, int)); - -extern int atolfp P((const char *, l_fp *)); -extern int buftvtots P((const char *, l_fp *)); -extern void gettstamp P((l_fp *)); -extern char * fptoa P((s_fp, int)); -extern char * fptoms P((s_fp, int)); -extern char * fptoms P((s_fp, int)); -extern int hextolfp P((const char *, l_fp *)); -extern int mstolfp P((const char *, l_fp *)); -extern char * prettydate P((l_fp *)); -extern char * uglydate P((l_fp *)); - -extern void get_systime P((l_fp *)); -extern int step_systime P((l_fp *)); -extern int step_systime_real P((l_fp *)); -extern int adj_systime P((l_fp *)); - -#define lfptoa(_fpv, _ndec) mfptoa((_fpv)->l_ui, (_fpv)->l_uf, (_ndec)) -#define lfptoms(_fpv, _ndec) mfptoms((_fpv)->l_ui, (_fpv)->l_uf, (_ndec)) - -#define ntoa(_sin) numtoa((_sin)->sin_addr.s_addr) -#define ntohost(_sin) numtohost((_sin)->sin_addr.s_addr) - -#define ufptoa(_fpv, _ndec) dofptoa((_fpv), 0, (_ndec), 0) -#define ufptoms(_fpv, _ndec) dofptoa((_fpv), 0, (_ndec), 1) -#define ulfptoa(_fpv, _ndec) dolfptoa((_fpv)->l_ui, (_fpv)->l_uf, 0, (_ndec), 0) -#define ulfptoms(_fpv, _ndec) dolfptoa((_fpv)->l_ui, (_fpv)->l_uf, 0, (_ndec), 1) -#define umfptoa(_fpi, _fpf, _ndec) dolfptoa((_fpi), (_fpf), 0, (_ndec), 0) diff --git a/usr.sbin/xntpd/include/ntp_if.h b/usr.sbin/xntpd/include/ntp_if.h deleted file mode 100644 index 340481a6bbec..000000000000 --- a/usr.sbin/xntpd/include/ntp_if.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Sockets are not standard. - * So hide uglyness in include file. - */ -#if defined(SYS_CONVEXOS9) -#include "/sys/sync/queue.h" -#include "/sys/sync/sema.h" -#endif - -#if defined(SYS_AIX) -#include <sys/time.h> -#include <time.h> -#endif - -#if (defined(SOLARIS) && !defined(bsd)) || defined(SYS_SUNOS4) -#include <sys/sockio.h> -#endif - -#if defined(SYS_UNIXWARE1) -#include <sys/sockio.h> -#endif - -#if defined(SYS_PTX) || defined(SYS_SINIXM) -#include <sys/stream.h> -#include <sys/stropts.h> -#endif - -#if defined(SYS_SVR4) -#if !defined(USE_STREAMS_DEVICE_FOR_IF_CONFIG) -#include <sys/sockio.h> -#else /* USE_STREAMS_DEVICE_FOR_IF_CONFIG */ -#include <netinet/ip.h> -#undef SIOCGIFCONF -#undef SIOCGIFFLAGS -#undef SIOCGIFADDR -#undef SIOCGIFBRDADDR -#undef SIOCGIFNETMASK -#define SIOCGIFCONF IPIOC_GETIFCONF -#define SIOCGIFFLAGS IPIOC_GETIFFLAGS -#define SIOCGIFADDR IPIOC_GETIFADDR -#define SIOCGIFBRDADDR IPIOC_GETIFBRDADDR -#define SIOCGIFNETMASK IPIOC_GETIFNETMASK -#endif /* USE_STREAMS_DEVICE_FOR_IF_CONFIG */ - -#endif /* SYS_SVR4 */ - -#if defined(SYS_FREEBSD) -#include <sys/time.h> -#endif - -#include <net/if.h> diff --git a/usr.sbin/xntpd/include/ntp_in.h b/usr.sbin/xntpd/include/ntp_in.h deleted file mode 100755 index 494051f9c0f4..000000000000 --- a/usr.sbin/xntpd/include/ntp_in.h +++ /dev/null @@ -1,259 +0,0 @@ -/* @(#)in.h 1.19 90/07/27 SMI; from UCB 7.5 2/22/88 */ - -/* - * Copyright (c) 1982, 1986 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that this notice is preserved and that due credit is given - * to the University of California at Berkeley. The name of the University - * may not be used to endorse or promote products derived from this - * software without specific prior written permission. This software - * is provided ``as is'' without express or implied warranty. - */ - -/* - * Constants and structures defined by the internet system, - * Per RFC 790, September 1981. - */ - -#ifndef _netinet_in_h -#define _netinet_in_h -#define _NETINET_IN_H_ -#define _SYS_IN_INCLUDED -#define __IN_HEADER - -/* - * Protocols - */ -#define IPPROTO_IP 0 /* dummy for IP */ -#define IPPROTO_ICMP 1 /* control message protocol */ -#define IPPROTO_IGMP 2 /* group control protocol */ -#define IPPROTO_GGP 3 /* gateway^2 (deprecated) */ -#define IPPROTO_ST 5 /* st */ -#define IPPROTO_TCP 6 /* tcp */ -#define IPPROTO_EGP 8 /* exterior gateway protocol */ -#define IPPROTO_PUP 12 /* pup */ -#define IPPROTO_UDP 17 /* user datagram protocol */ -#define IPPROTO_IDP 22 /* xns idp */ -#define IPPROTO_HELLO 63 /* "hello" routing protocol */ -#define IPPROTO_ND 77 /* UNOFFICIAL net disk proto */ -#define IPPROTO_OSPF 89 /* Open SPF IGP */ - -#define IPPROTO_RAW 255 /* raw IP packet */ -#define IPPROTO_MAX 256 - -/* - * Port/socket numbers: network standard functions - */ -#define IPPORT_ECHO 7 -#define IPPORT_DISCARD 9 -#define IPPORT_SYSTAT 11 -#define IPPORT_DAYTIME 13 -#define IPPORT_NETSTAT 15 -#define IPPORT_FTP 21 -#define IPPORT_TELNET 23 -#define IPPORT_SMTP 25 -#define IPPORT_TIMESERVER 37 -#define IPPORT_NAMESERVER 42 -#define IPPORT_WHOIS 43 -#define IPPORT_MTP 57 - -/* - * Port/socket numbers: host specific functions - */ -#define IPPORT_TFTP 69 -#define IPPORT_RJE 77 -#define IPPORT_FINGER 79 -#define IPPORT_TTYLINK 87 -#define IPPORT_SUPDUP 95 - -/* - * UNIX TCP sockets - */ -#define IPPORT_EXECSERVER 512 -#define IPPORT_LOGINSERVER 513 -#define IPPORT_CMDSERVER 514 -#define IPPORT_EFSSERVER 520 - -/* - * UNIX UDP sockets - */ -#define IPPORT_BIFFUDP 512 -#define IPPORT_WHOSERVER 513 -#define IPPORT_ROUTESERVER 520 /* 520+1 also used */ - -/* - * Ports < IPPORT_RESERVED are reserved for - * privileged processes (e.g. root). - * Ports > IPPORT_USERRESERVED are reserved - * for servers, not necessarily privileged. - */ -#define IPPORT_RESERVED 1024 -#define IPPORT_USERRESERVED 5000 - -/* - * Link numbers - */ -#define IMPLINK_IP 155 -#define IMPLINK_LOWEXPER 156 -#define IMPLINK_HIGHEXPER 158 - -/* - * Internet address - * This definition contains obsolete fields for compatibility - * with SunOS 3.x and 4.2bsd. The presence of subnets renders - * divisions into fixed fields misleading at best. New code - * should use only the s_addr field. - */ -struct in_addr { - union { - struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; - struct { u_short s_w1,s_w2; } S_un_w; - u_long S_addr; - } S_un; -#define s_addr S_un.S_addr /* should be used for all code */ -#define s_host S_un.S_un_b.s_b2 /* OBSOLETE: host on imp */ -#define s_net S_un.S_un_b.s_b1 /* OBSOLETE: network */ -#define s_imp S_un.S_un_w.s_w2 /* OBSOLETE: imp */ -#define s_impno S_un.S_un_b.s_b4 /* OBSOLETE: imp # */ -#define s_lh S_un.S_un_b.s_b3 /* OBSOLETE: logical host */ -}; - -/* - * Definitions of bits in internet address integers. - * On subnets, the decomposition of addresses to host and net parts - * is done according to subnet mask, not the masks here. - */ -#define IN_CLASSA(i) (((long)(i) & 0x80000000) == 0) -#define IN_CLASSA_NET 0xff000000 -#define IN_CLASSA_NSHIFT 24 -#define IN_CLASSA_HOST 0x00ffffff -#define IN_CLASSA_MAX 128 - -#define IN_CLASSB(i) (((long)(i) & 0xc0000000) == 0x80000000) -#define IN_CLASSB_NET 0xffff0000 -#define IN_CLASSB_NSHIFT 16 -#define IN_CLASSB_HOST 0x0000ffff -#define IN_CLASSB_MAX 65536 - -#define IN_CLASSC(i) (((long)(i) & 0xe0000000) == 0xc0000000) -#define IN_CLASSC_NET 0xffffff00 -#define IN_CLASSC_NSHIFT 8 -#define IN_CLASSC_HOST 0x000000ff - -#define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000) -#define IN_CLASSD_NET 0xf0000000 /* These ones aren't really */ -#define IN_CLASSD_NSHIFT 28 /* net and host fields, but */ -#define IN_CLASSD_HOST 0x0fffffff /* routing needn't know. */ -#define IN_MULTICAST(i) IN_CLASSD(i) - -#define IN_EXPERIMENTAL(i) (((long)(i) & 0xe0000000) == 0xe0000000) -#define IN_BADCLASS(i) (((long)(i) & 0xf0000000) == 0xf0000000) - -#define INADDR_ANY (u_long)0x00000000 -#define INADDR_LOOPBACK (u_long)0x7F000001 -#define INADDR_BROADCAST (u_long)0xffffffff /* must be masked */ - -#define INADDR_UNSPEC_GROUP (u_long)0xe0000000 /* 224.0.0.0 */ -#define INADDR_ALLHOSTS_GROUP (u_long)0xe0000001 /* 224.0.0.1 */ -#define INADDR_MAX_LOCAL_GROUP (u_long)0xe00000ff /* 224.0.0.255 */ - -#define IN_LOOPBACKNET 127 /* official! */ - -/* - * Define a macro to stuff the loopback address into an Internet address - */ -#define IN_SET_LOOPBACK_ADDR(a) {(a)->sin_addr.s_addr = htonl(INADDR_LOOPBACK); \ - (a)->sin_family = AF_INET;} - -/* - * Socket address, internet style. - */ -struct sockaddr_in { - short sin_family; - u_short sin_port; - struct in_addr sin_addr; - char sin_zero[8]; -}; - -/* - * Options for use with [gs]etsockopt at the IP level. - */ -#define IP_OPTIONS 1 /* set/get IP per-packet options */ -#define IP_MULTICAST_IF 2 /* set/get IP multicast interface */ -#define IP_MULTICAST_TTL 3 /* set/get IP multicast timetolive */ -#define IP_MULTICAST_LOOP 4 /* set/get IP multicast loopback */ -#define IP_ADD_MEMBERSHIP 5 /* add an IP group membership */ -#define IP_DROP_MEMBERSHIP 6 /* drop an IP group membership */ - -#define IP_DEFAULT_MULTICAST_TTL 1 /* normally limit m'casts to 1 hop */ -#define IP_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */ -#define IP_MAX_MEMBERSHIPS 20 /* per socket; must fit in one mbuf */ - -/* - * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP. - */ -struct ip_mreq { - struct in_addr imr_multiaddr; /* IP multicast address of group */ - struct in_addr imr_interface; /* local IP address of interface */ -}; - -#if !defined(vax) && !defined(ntohl) && !defined(i386) -/* - * Macros for number representation conversion. - */ -#define ntohl(x) (x) -#define ntohs(x) (x) -#define htonl(x) (x) -#define htons(x) (x) -#endif - -#if !defined(ntohl) && (defined(vax) || defined(i386)) -u_short ntohs(), htons(); -u_long ntohl(), htonl(); -#endif - -#ifdef KERNEL -extern struct domain inetdomain; -extern struct protosw inetsw[]; -struct in_addr in_makeaddr(); -u_long in_netof(), in_lnaof(); -#endif - -#ifndef BYTE_ORDER -/* - * Definitions for byte order, - * according to byte significance from low address to high. - */ -#define LITTLE_ENDIAN 1234 /* least-significant byte first (vax) */ -#define BIG_ENDIAN 4321 /* most-significant byte first (IBM, net) */ -#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long (pdp) */ - -#if defined(vax) || defined(i386) -#define BYTE_ORDER LITTLE_ENDIAN -#else -#define BYTE_ORDER BIG_ENDIAN /* mc68000, tahoe, most others */ -#endif -#endif BYTE_ORDER - -/* - * Macros for number representation conversion. - */ -#if BYTE_ORDER==LITTLE_ENDIAN -#define NTOHL(d) ((d) = ntohl((d))) -#define NTOHS(d) ((d) = ntohs((d))) -#define HTONL(d) ((d) = htonl((d))) -#define HTONS(d) ((d) = htons((d))) -#else -#define ntohl(x) (x) -#define ntohs(x) (x) -#define htonl(x) (x) -#define htons(x) (x) -#define NTOHL(d) -#define NTOHS(d) -#define HTONL(d) -#define HTONS(d) -#endif - -#endif /*!_netinet_in_h*/ diff --git a/usr.sbin/xntpd/include/ntp_io.h b/usr.sbin/xntpd/include/ntp_io.h deleted file mode 100644 index ebe20b49684e..000000000000 --- a/usr.sbin/xntpd/include/ntp_io.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * POSIX says use <fnct.h> to get O_* symbols and - * SEEK_SET symbol form <untisd.h>. - */ -#if defined(NTP_POSIX_SOURCE) - -/* - * POSIX way - */ -#include <stdio.h> -#if defined(HAVE_SIGNALED_IO) && (defined(SYS_AUX2) || defined(SYS_AUX3) || defined(SYS_PTX)) -#include <sys/file.h> -#endif -#include <unistd.h> -#include <fcntl.h> -#else -/* - * BSD way - */ -#include <sys/file.h> -#include <fcntl.h> -#if !defined(SEEK_SET) && defined(L_SET) -#define SEEK_SET L_SET -#endif -#endif diff --git a/usr.sbin/xntpd/include/ntp_machine.h b/usr.sbin/xntpd/include/ntp_machine.h deleted file mode 100644 index 0d4267c452a6..000000000000 --- a/usr.sbin/xntpd/include/ntp_machine.h +++ /dev/null @@ -1,742 +0,0 @@ -/* - * Collect all machine dependent idiosyncrasies in one place. - */ - -#ifndef __ntp_machine -#define __ntp_machine - -/* - Various options. - They can defined with the DEFS directive in the Config file if they - are not defined here. - -WHICH NICE - - HAVE_ATT_NICE - Use att nice(priority_change) - HAVE_BSD_NICE - Use bsd setprioirty(which, who, priority) - HAVE_NO_NICE - Don't have (or use) either - -KERNEL MUCKING - If you porting to a new system see xntpd/ntp_unixclock.c and - util/tickadj.c to see what these do. This is very system - dependent stuff!!! - - HAVE_LIBKVM - Use libkvm to read kernal memory - HAVE_READKMEM - Use read to read kernal memory - NOKMEM - Don't read kmem - HAVE_N_UN - Have u_nn nlist struct. - -WHICH SETPGRP TO USE - Not needed if NTP_POSIX_SOURCE is defined since you - better of setsid! - - HAVE_ATT_SETPGRP - setpgrp(void) instead of setpgrp(int, int) - - -Signaled IO - Signled IO defines. - - HAVE_SIGNALED_IO - Enable signaled io. Assumes you are going to use SIGIO - for tty and udp io. - USE_UDP_SIGPOLL - Use SIGPOLL on socket io. This assumes that the - sockets routines are defined on top of streams. - USE_TTY_SIGPOLL - Use SIGPOLL on tty io. This assumes streams. - UDP_BACKWARDS_SETOWN - SunOS 3.5 or Ultirx 2.0 system. - - -WHICH TERMINAL MODEL TO USE - I would assume HAVE_TERMIOS if - NTP_POSIX_SOURCE was set but can't. The - posix tty driver is too restrictive on most systems. - It is defined if you define STREAMS. - - We do not put these defines in the ntp_machine.h as some systems - offer multiple interfaces and refclock configuration likes to - peek into the configuration defines for tty model restrictions. - Thus all tty definitions should be in the files in the machines directory. - - HAVE_TERMIOS - Use POSIX termios.h - HAVE_SYSV_TTYS - Use SYSV termio.h - HAVE_BSD_TTYS - Use BSD stty.h - -THIS MAKES PORTS TO NEW SYSTEMS EASY - You only have to wory about - kernel mucking. - - NTP_POSIX_SOURCE - Use POSIX functions over bsd functions and att functions. - This is NOT the same as _POSIX_SOURCE. - It is much weaker! - - -STEP SLEW OR TWO STEP - The Default is to step. - - SLEWALWAYS - setttimeofday can not be used to set the time of day at - all. - STEP_SLEW - setttimeofday can not set the seconds part of time - time use setttimeofday to set the seconds part of the - time and the slew the seconds. - FORCE_NTPDATE_STEP - even if SLEWALWAYS is defined, force a step of - of the systemtime (via settimeofday()). Only takes - affect if STEP_SLEW isn't defined. - -WHICH TIMEOFDAY() - - SYSV_TIMEOFDAY - [sg]ettimeofday(struct timeval *) as opposed to BSD - [sg]ettimeofday(struct timeval *, struct timezone *) - -INFO ON NEW KERNEL PLL SYS CALLS - - NTP_SYSCALLS_STD - use the "normal" ones - NTP_SYSCALL_GET - SYS_ntp_gettime id - NTP_SYSCALL_ADJ - SYS_ntp_adjtime id - NTP_SYSCALLS_LIBC - ntp_adjtime() and ntp_gettime() are in libc. - -HOW TO GET IP INTERFACE INFORMATION - - Some UNIX V.4 machines implement a sockets library on top of - streams. For these systems, you must use send the SIOCGIFCONF down - the stream in an I_STR ioctl. This ususally also implies - USE_STREAMS_DEVICE FOR IF_CONFIG. Dell UNIX is a notable exception. - - STREAMS_TLI - use ioctl(I_STR) to implement ioctl(SIOCGIFCONF) - -WHAT DOES IOCTL(SIOCGIFCONF) RETURN IN THE BUFFER - - UNIX V.4 machines implement a sockets library on top of streams. - When requesting the IP interface configuration with an ioctl(2) calll, - an array of ifreq structures are placed in the provided buffer. Some - implementations also place the length of the buffer information in - the first integer position of the buffer. - - SIZE_RETURNED_IN_BUFFER - size integer is in the buffer - -WILL IOCTL(SIOCGIFCONF) WORK ON A SOCKET - - Some UNIX V.4 machines do not appear to support ioctl() requests for the - IP interface configuration on a socket. They appear to require the use - of the streams device instead. - - USE_STREAMS_DEVICE_FOR_IF_CONFIG - use the /dev/ip device for configuration - -MISC - - USE_PROTOTYPES - Prototype functions - DOSYNCTODR - Resync TODR clock every hour. - RETSIGTYPE - Define signal function type. - NO_SIGNED_CHAR_DECL - No "signed char" see include/ntp.h - LOCK_PROCESS - Have plock. - UDP_WILDCARD_DELIVERY - - these systems deliver broadcast packets to the wildcard - port instead to a port bound to the interface bound - to the correct broadcast address - are these - implementations broken or did the spec change ? - -DEFINITIONS FOR SYSTEM && PROCESSOR - STR_SYSTEM - value of system variable - STR_PROCESSOR - value of processor variable - -You could just put the defines on the DEFS line in machines/<os> file. -I don't since there are lots of different types of compilers that a system might -have, some that can do proto typing and others that cannot on the same system. -I get a chance to twiddle some of the configuration parameters at compile -time based on compiler/machine combinations by using this include file. -See convex, aix and sun configurations see how complex it get. - -Note that it _is_ considered reasonable to add some system-specific defines -to the machine/<os> file if it would be too inconvenient to puzzle them out -in this file. - -*/ - - -/* - * RS6000 running AIX. - */ -#if defined(SYS_AIX) -#define HAVE_SIGNALED_IO -#ifndef _BSD -#define NTP_STDC -#define NTP_POSIX_SOURCE -/* - * Keep USE_PROTOTYPES and _NO_PROTO in step. - */ -#if defined(_NO_PROTO) && defined(USE_PROTOTYPES) -#undef USE_PROTOTYPES -#endif -#if !defined(_NO_PROTO) && !defined(USE_PROTOTYPES) -#define USE_PROTOTYPES -#endif -#endif /*_BSD */ -#define HAVE_BSD_NICE -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/AIX" -#endif -#endif /* RS6000 */ - -/* - * SunOS 4.X.X - * Note: posix version has NTP_POSIX_SOURCE and HAVE_SIGNALED_IO - */ -#if defined(SYS_SUNOS4) -#define NTP_NEED_BOPS -#define NO_SIGNED_CHAR_DECL -#define HAVE_LIBKVM -#define HAVE_MALLOC_H -#define HAVE_BSD_NICE -#define RETSIGTYPE void -#define NTP_SYSCALL_GET 132 -#define NTP_SYSCALL_ADJ 147 -#define HAVE_MODEM_CONTROL -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/SunOS 4.x" -#endif -#endif - -/* - * Sinix-M - */ -#if defined(SYS_SINIXM) -#undef HAVE_SIGNALED_IO -#undef USE_TTY_SIGPOLL -#undef USE_UDP_SIGPOLL -#define STREAMS_TLI -#define NO_SIGNED_CHAR_DECL -#define STEP_SLEW /* TWO step */ -#define RETSIGTYPE void -#define NTP_POSIX_SOURCE -#define HAVE_ATT_SETPGRP -#define HAVE_ATT_NICE -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/SINIX-M" -#endif -#endif - -/* - * SunOS 5.1 or SunOS 5.2 or Solaris 2.1 or Solaris 2.2 - */ -#if defined(SYS_SOLARIS) -#define HAVE_SIGNALED_IO -#define USE_TTY_SIGPOLL -#define USE_UDP_SIGPOLL -#define NO_SIGNED_CHAR_DECL -#define STEP_SLEW /* TWO step */ -#define RETSIGTYPE void -#define NTP_POSIX_SOURCE -#define HAVE_ATT_SETPGRP -#define HAVE_ATT_NICE -#define UDP_WILDCARD_DELIVERY -#define HAVE_MODEM_CONTROL -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/Solaris 2.x" -#endif -#endif - -/* - * Convex - */ -#if defined(SYS_CONVEXOS10) || defined(SYS_CONVEXOS9) -#define HAVE_SIGNALED_IO -#define HAVE_N_UN -#define HAVE_READKMEM -#define HAVE_BSD_NICE -#if defined(convex) -#define RETSIGTYPE int -#define NO_SIGNED_CHAR_DECL -#else -#if defined(__stdc__) && !defined(USE_PROTOTYPES) -#define USE_PROTOTYPES -#endif -#if !defined(__stdc__) && defined(USE_PROTOTYPES) -#undef USE_PROTOTYPES -#endif -#define NTP_POSIX_SOURCE -#define HAVE_ATT_SETPGRP -#endif -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/ConvexOS" -#endif -#endif - -/* - * IRIX 4.X and IRIX 5.x - */ -#if defined(SYS_IRIX4)||defined(SYS_IRIX5) -#define HAVE_SIGNALED_IO -#define USE_TTY_SIGPOLL -#define ADJTIME_IS_ACCURATE -#define LOCK_PROCESS -#define USE_PROTOTYPES -#define HAVE_ATT_SETPGRP -#define HAVE_BSD_NICE -#define NTP_POSIX_SOURCE -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/IRIX" -#endif -#endif - -/* - * Ultrix - * Note: posix version has NTP_POSIX_SOURCE and HAVE_SIGNALED_IO - */ -#if defined(SYS_ULTRIX) -#define S_CHAR_DEFINED -#define HAVE_READKMEM -#define HAVE_BSD_NICE -#define RETSIGTYPE void -#define NTP_SYSCALLS_STD -#define HAVE_MODEM_CONTROL -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/Ultrix" -#endif -#endif - -/* - * AUX - */ -#if defined(SYS_AUX2) || defined(SYS_AUX3) -#define NO_SIGNED_CHAR_DECL -#define HAVE_READKMEM -#define HAVE_ATT_NICE -#define LOCK_PROCESS -#define NTP_POSIX_SOURCE -/* - * This requires that _POSIX_SOURCE be forced on the - * compiler command flag. We can't do it here since this - * file is included _after_ the system header files and we - * need to let _them_ know we're POSIX. We do this in - * compilers/aux3.gcc... - */ -#define SLEWALWAYS -#define FORCE_NTPDATE_STEP -#define RETSIGTYPE void -#define HAVE_ATT_SETPGRP -#define LOG_NTP LOG_LOCAL1 -#define HAVE_SIGNALED_IO -#define NTP_NEED_BOPS -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/AUX" -#endif -#endif - -/* - * Next - */ -#if defined(SYS_NEXT) -#define RETSIGTYPE void -#define DOSYNCTODR -#define HAVE_READKMEM -#define HAVE_BSD_NICE -#define HAVE_N_UN -#undef NTP_POSIX_SOURCE -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/Next" -#endif -#endif - -/* - * HPUX - */ -#if defined(SYS_HPUX) -#define NTP_POSIX_SOURCE -#define HAVE_SIGNALED_IO -#define getdtablesize() sysconf(_SC_OPEN_MAX) -#define setlinebuf(f) setvbuf(f, NULL, _IOLBF, 0) -#define NO_SIGNED_CHAR_DECL -#define LOCK_PROCESS -#define RETSIGTYPE void -#if (SYS_HPUX < 9) -#define HAVE_NO_NICE /* HPUX uses rtprio instead */ -#else -#define HAVE_BSD_NICE /* new at 9.X */ -#endif -#if (SYS_HPUX < 10) -#define NOKMEM -#else -#define HAVE_READKMEM -#endif -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/HPUX" -#endif -#endif - -/* - * bsdi - */ -#if defined(SYS_BSDI) -#define HAVE_SIGNALED_IO -#define HAVE_LIBKVM -#define NTP_POSIX_SOURCE -#define HAVE_BSD_NICE -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/BSDI" -#endif -#endif - -/* - * 4.4 bsd - */ -#if defined(SYS_44BSD) -#define HAVE_SIGNALED_IO -#define HAVE_LIBKVM -#define HAVE_SYSCTL -#define NTP_POSIX_SOURCE -#define HAVE_BSD_NICE -#define USE_PROTOTYPES -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/4.4BSD" -#endif -#define MCAST -#ifdef SYS_FREEBSD -#ifdef HAVE_SIGNALED_IO -#undef HAVE_SIGNALED_IO -#endif -#define HAVE_TERMIOS -#define HAVE_UNAME -#define HAVE_SYS_TIMEX_H -#define HAVE_GETBOOTFILE -#define NTP_SYSCALLS_LIBC -#define KERNEL_PLL -#endif -#endif - -/* - * Linux - */ -#if defined(SYS_LINUX) -#undef HAVE_SIGNALED_IO -#define RETSIGTYPE void -#define NTP_POSIX_SOURCE -#define ADJTIME_IS_ACCURATE -#define HAVE_SYS_TIMEX_H -/* hope there will be a standard interface - * along with a standard name one day ! */ -#define ntp_adjtime __adjtimex -#define HAVE_BSD_NICE -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/Linux" -#endif -#endif - -/* - * 386BSD and any variants 8-) - should really have only ONE define - * for this bunch. - */ -#if defined(SYS_386BSD) || defined(SYS_NETBSD) -#define HAVE_SIGNALED_IO -#define HAVE_READKMEM -#define NTP_POSIX_SOURCE -#define HAVE_BSD_NICE -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/\052BSD" -#endif -#ifdef SYS_FREEBSD -#define HAVE_TERMIOS -#define HAVE_UNAME -#define HAVE_SYS_TIMEX_H -#define NTP_SYSCALLS_LIBC -#define KERNEL_PLL -#endif -#endif - -/* - * DEC AXP OSF/1 - */ -#if defined(SYS_DECOSF1) -#define HAVE_SIGNALED_IO -#define HAVE_READKMEM -#define NTP_POSIX_SOURCE -#define NTP_SYSCALLS_STD -#define HAVE_BSD_NICE -#define HAVE_MODEM_CONTROL -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/DECOSF1" -#endif -#endif - -/* - * Intel x86 OSF/1 - */ -#if defined(SYS_IX86OSF1) -#define HAVE_SIGNALED_IO -#define HAVE_READKMEM -#define NTP_POSIX_SOURCE -#define NTP_SYSCALLS_STD -#define HAVE_BSD_NICE -#define HAVE_MODEM_CONTROL -#define SYS_DECOSF1 -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/IX86OSF1" -#endif -#endif - -/* - * ISI - */ -#if defined(SYS_BSD) -#define NO_SIGNED_CHAR_DECL -#define HAVE_BSD_NICE -#define HAVE_BSD_TTYS -#define HAVE_READKMEM -#define HAVE_SIGNALED_IO -#define NEED_VSPRINTF -#undef NTP_POSIX_SOURCE -#endif - -/* - * I386 - * XXX - what OS? - */ -#if defined(SYS_I386) -#define HAVE_READKMEM -#define S_CHAR_DEFINED -#define HAVE_BSD_NICE -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/I386" -#endif -#endif - -/* - * Mips - */ -#if defined(SYS_MIPS) -#define NOKMEM -#define HAVE_BSD_NICE -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/Mips" -#endif -#endif - -/* - * SEQUENT - */ -#if defined(SYS_SEQUENT) -#define HAVE_BSD_NICE -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/Sequent Dynix 3" -#endif -#endif - -/* - * PTX - */ -#if defined(SYS_PTX) -#define NO_SIGNED_CHAR_DECL -#define STREAMS_TLI -#define HAVE_ATT_SETPGRP -#define HAVE_SIGNALED_IO -#define USE_UDP_SIGPOLL -#define USE_TTY_SIGPOLL -#undef ADJTIME_IS_ACCURATE /* not checked yet */ -#define LOCK_PROCESS -#define HAVE_ATT_SETPGRP -#define HAVE_ATT_NICE -#define STEP_SLEW /* TWO step */ -#define SYSV_GETTIMEOFDAY -#define HAVE_READKMEM -#define UDP_WILDCARD_DELIVERY -#define NTP_POSIX_SOURCE -#define memmove(x, y, z) memcpy(x, y, z) -struct timezone { int __0; }; /* unused placebo */ -/* - * no comment !@! - */ -typedef unsigned int u_int; -#ifndef _NETINET_IN_SYSTM_INCLUDED /* i am about to comment... */ -typedef unsigned char u_char; -typedef unsigned short u_short; -typedef unsigned long u_long; -#endif -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/Sequent PTX" -#endif -#endif - - -/* - * Sony NEWS - */ -#if defined(SYS_SONY) -#define NO_SIGNED_CHAR_DECL -#define HAVE_READKMEM -#define HAVE_BSD_NICE -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/Sony" -#endif -#endif - -/* - * VAX - * XXX - VMS? - */ -#if defined(SYS_VAX) -#define NO_SIGNED_CHAR_DECL -#define HAVE_READKMEM -#define HAVE_BSD_NICE -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/VAX" -#endif -#endif - -/* - * UNIX V.4 on and NCR 3000 - */ -#if defined(SYS_SVR4) -#define HAVE_ATT_SETPGRP -#define USE_PROTOTYPES -#define NTP_POSIX_SOURCE -#define HAVE_ATT_NICE -#define HAVE_READKMEM -#define USE_TTY_SIGPOLL -#define USE_UDP_SIGPOLL -#define STREAM -#define STEP_SLEW /* TWO step */ -#define LOCK_PROCESS -#define SYSV_TIMEOFDAY -#define SIZE_RETURNED_IN_BUFFER -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/SysVR4" -#endif -#endif - -/* - * (Univel/Novell) Unixware1 SVR4 on intel x86 processor - */ -#if defined(SYS_UNIXWARE1) -/* #define _POSIX_SOURCE */ -#undef HAVE_ATT_SETPGRP -#define USE_PROTOTYPES -#define NTP_POSIX_SOURCE -#define HAVE_ATT_NICE -#define HAVE_READKMEM -#define USE_TTY_SIGPOLL -#define USE_UDP_SIGPOLL -#define UDP_WILDCARD_DELIVERY -#undef HAVE_SIGNALED_IO -#define STREAM -#define STREAMS -#ifndef STREAMS_TLI -/*#define STREAMS_TLI*/ -#endif -/* #define USE_STREAMS_DEVICE_FOR_IF_CONFIG */ -#undef STEP_SLEW /* TWO step */ -#define LOCK_PROCESS -#define NO_SIGNED_CHAR_DECL -#undef SYSV_TIMEOFDAY -#define SIZE_RETURNED_IN_BUFFER -#define RETSIGTYPE void -#include <sys/sockio.h> -#include <sys/types.h> -#include <netinet/in_systm.h> -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/Unixware1" -#endif -#endif - -/* - * DomainOS - */ -#if defined(SYS_DOMAINOS) -#define HAVE_BSD_NICE -#define NOKMEM -#define HAVE_SIGNALED_IO -#define NTP_SYSCALLS_STD -#define USE_PROTOTYPES -#define UDP_WILDCARD_DELIVERY -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX/DOMAINOS" -#endif -#endif - -#ifdef STREAM /* STREAM implies TERMIOS */ -#ifndef HAVE_TERMIOS -#define HAVE_TERMIOS -#endif -#endif - -#ifndef RETSIGTYPE -#if defined(NTP_POSIX_SOURCE) -#define RETSIGTYPE void -#else -#define RETSIGTYPE int -#endif -#endif - -#ifdef NTP_SYSCALLS_STD -#ifndef NTP_SYSCALL_GET -#define NTP_SYSCALL_GET 235 -#endif -#ifndef NTP_SYSCALL_ADJ -#define NTP_SYSCALL_ADJ 236 -#endif -#endif /* NTP_SYSCALLS_STD */ - -#if !defined(HAVE_ATT_NICE) \ - && !defined(HAVE_BSD_NICE) \ - && !defined(HAVE_NO_NICE) - ERROR You_must_define_one_of_the_HAVE_xx_NICE_defines -#endif - -/* - * use only one tty model - no use in initialising - * a tty in three ways - * HAVE_TERMIOS is preferred over HAVE_SYSV_TTYS over HAVE_BSD_TTYS - */ -#ifdef HAVE_TERMIOS -#undef HAVE_BSD_TTYS -#undef HAVE_SYSV_TTYS -#endif - -#ifdef HAVE_SYSV_TTYS -#undef HAVE_BSD_TTYS -#endif - -#if !defined(HAVE_SYSV_TTYS) \ - && !defined(HAVE_BSD_TTYS) \ - && !defined(HAVE_TERMIOS) - ERROR no_tty_type_defined -#endif - - -#if !defined(XNTP_BIG_ENDIAN) && !defined(XNTP_LITTLE_ENDIAN) - -# if defined(XNTP_AUTO_ENDIAN) -# include <netinet/in.h> - -# if BYTE_ORDER == BIG_ENDIAN -# define XNTP_BIG_ENDIAN -# endif -# if BYTE_ORDER == LITTLE_ENDIAN -# define XNTP_LITTLE_ENDIAN -# endif - -# else /* AUTO */ - -# ifdef WORDS_BIGENDIAN -# define XNTP_BIG_ENDIAN 1 -# else -# define XNTP_LITTLE_ENDIAN 1 -# endif - -# endif /* AUTO */ - -#endif /* !BIG && !LITTLE */ - -/* - * Byte order woes. The DES code is sensitive to byte order. This - * used to be resolved by calling ntohl() and htonl() to swap things - * around, but this turned out to be quite costly on Vaxes where those - * things are actual functions. The code now straightens out byte - * order troubles on its own, with no performance penalty for little - * end first machines, but at great expense to cleanliness. - */ -#if !defined(XNTP_BIG_ENDIAN) && !defined(XNTP_LITTLE_ENDIAN) - /* - * Pick one or the other. - */ - BYTE_ORDER_NOT_DEFINED_FOR_AUTHENTICATION -#endif - -#if defined(XNTP_BIG_ENDIAN) && defined(XNTP_LITTLE_ENDIAN) - /* - * Pick one or the other. - */ - BYTE_ORDER_NOT_DEFINED_FOR_AUTHENTICATION -#endif - - -#endif /* __ntp_machine */ diff --git a/usr.sbin/xntpd/include/ntp_malloc.h b/usr.sbin/xntpd/include/ntp_malloc.h deleted file mode 100644 index 0079cb700ed1..000000000000 --- a/usr.sbin/xntpd/include/ntp_malloc.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Define malloc and friends. - */ -#ifndef _ntp_malloc_h - -#define _ntp_malloc_h -#ifdef NTP_POSIX_SOURCE -#include <stdlib.h> -#else /* NTP_POSIX_SOURCE */ -#ifdef HAVE_MALLOC_H -#include <malloc.h> -#endif -#endif /* NTP_POSIX_SOURCE */ - -#endif /* _ntp_malloc_h */ diff --git a/usr.sbin/xntpd/include/ntp_refclock.h b/usr.sbin/xntpd/include/ntp_refclock.h deleted file mode 100644 index fcc120001acf..000000000000 --- a/usr.sbin/xntpd/include/ntp_refclock.h +++ /dev/null @@ -1,224 +0,0 @@ -/* - * ntp_refclock.h - definitions for reference clock support - */ - -#include "ntp_types.h" - -#if defined(HAVE_BSD_TTYS) -#include <sgtty.h> -#endif /* HAVE_BSD_TTYS */ - -#if defined(HAVE_SYSV_TTYS) -#include <termio.h> -#endif /* HAVE_SYSV_TTYS */ - -#if defined(HAVE_TERMIOS) -#include <termios.h> -#endif - -#if defined(STREAM) -#include <stropts.h> -#if defined(CLK) -#include <sys/clkdefs.h> -#endif /* CLK */ -#endif /* STREAM */ - -#if !defined(SYSV_TTYS) && !defined(STREAM) & !defined(BSD_TTYS) -#define BSD_TTYS -#endif /* SYSV_TTYS STREAM BSD_TTYS */ - -/* - * Macros to determine the clock type and unit numbers from a - * 127.127.t.u address - */ -#define REFCLOCKTYPE(srcadr) ((SRCADR(srcadr) >> 8) & 0xff) -#define REFCLOCKUNIT(srcadr) (SRCADR(srcadr) & 0xff) - -/* - * List of reference clock names and descriptions. These must agree with - * lib/clocktypes.c and xntpd/refclock_conf.c. - */ -struct clktype { - int code; /* driver "major" number */ - char *clocktype; /* long description */ - char *abbrev; /* short description */ -}; - -/* - * Configuration flag values - */ -#define CLK_HAVETIME1 0x1 -#define CLK_HAVETIME2 0x2 -#define CLK_HAVEVAL1 0x4 -#define CLK_HAVEVAL2 0x8 - -#define CLK_FLAG1 0x1 -#define CLK_FLAG2 0x2 -#define CLK_FLAG3 0x4 -#define CLK_FLAG4 0x8 - -#define CLK_HAVEFLAG1 0x10 -#define CLK_HAVEFLAG2 0x20 -#define CLK_HAVEFLAG3 0x40 -#define CLK_HAVEFLAG4 0x80 - -/* - * Structure for returning clock status - */ -struct refclockstat { - u_char type; /* clock type */ - u_char flags; /* clock flags */ - u_char haveflags; /* bit array of valid flags */ - u_char lencode; /* length of last timecode */ - char *lastcode; /* last timecode received */ - U_LONG polls; /* transmit polls */ - U_LONG noresponse; /* no response to poll */ - U_LONG badformat; /* bad format timecode received */ - U_LONG baddata; /* invalid data timecode received */ - U_LONG timereset; /* driver resets */ - char *clockdesc; /* ASCII description */ - l_fp fudgetime1; /* configure fudge time1 */ - l_fp fudgetime2; /* configure fudge time2 */ - LONG fudgeval1; /* configure fudge value1 */ - LONG fudgeval2; /* configure fudge value2 */ - u_char currentstatus; /* clock status */ - u_char lastevent; /* last exception event */ - u_char unused; /* spare */ - struct ctl_var *kv_list; /* additional variables */ -}; - -/* - * Reference clock I/O structure. Used to provide an interface between - * the reference clock drivers and the I/O module. - */ -struct refclockio { - struct refclockio *next; /* link to next structure */ - void (*clock_recv)();/* completion routine */ - caddr_t srcclock; /* pointer to clock structure */ - int datalen; /* lenth of data */ - int fd; /* file descriptor */ - u_long recvcount; /* count of receive completions */ -}; - -/* - * Structure for returning debugging info - */ -#define NCLKBUGVALUES 16 -#define NCLKBUGTIMES 32 - -struct refclockbug { - u_char nvalues; /* values following */ - u_char ntimes; /* times following */ - u_short svalues; /* values format sign array */ - U_LONG stimes; /* times format sign array */ - U_LONG values[NCLKBUGVALUES]; /* real values */ - l_fp times[NCLKBUGTIMES]; /* real times */ -}; - -/* - * Structure interface between the reference clock support - * ntp_refclock.c and the driver utility routines - */ -#define MAXSTAGE 64 /* max stages in shift register */ -#define BMAX 128 /* max timecode length */ -#define GMT 0 /* I hope nobody sees this */ -#define MAXDIAL 20 /* max length of modem dial strings */ - -/* - * Line discipline flags. These require line discipline or streams - * modules to be installed/loaded in the kernel. If specified, but not - * installed, the code runs as if unspecified. - */ -#define LDISC_STD 0x0 /* standard */ -#define LDISC_CLK 0x1 /* tty_clk \n intercept */ -#define LDISC_CLKPPS 0x2 /* tty_clk \377 intercept */ -#define LDISC_ACTS 0x4 /* tty_clk #* intercept */ -#define LDISC_CHU 0x8 /* tty_chu */ -#define LDISC_PPS 0x10 /* ppsclock */ - -struct refclockproc { - struct refclockio io; /* I/O handler structure */ - caddr_t unitptr; /* pointer to unit structure */ - u_long lasttime; /* last clock update time */ - u_char leap; /* leap/synchronization code */ - u_char currentstatus; /* clock status */ - u_char lastevent; /* last exception event */ - u_char type; /* clock type */ - char *clockdesc; /* clock description */ - char lastcode[BMAX]; /* last timecode received */ - u_char lencode; /* length of last timecode */ - - u_int year; /* year of eternity */ - u_int day; /* day of year */ - u_int hour; /* hour of day */ - u_int minute; /* minute of hour */ - u_int second; /* second of minute */ - u_int msec; /* millisecond of second */ - u_long usec; /* microsecond of second (alt) */ - u_int nstages; /* median filter stages */ - u_long yearstart; /* beginning of year */ - u_long coderecv; /* sample counter */ - l_fp lastref; /* last reference timestamp */ - l_fp lastrec; /* last local timestamp */ - l_fp offset; /* median offset */ - u_fp dispersion; /* sample dispersion */ - l_fp filter[MAXSTAGE]; /* median filter */ - - /* - * Configuration data - */ - l_fp fudgetime1; /* fudge time1 */ - l_fp fudgetime2; /* fudge time2 */ - u_long refid; /* reference identifier */ - u_long sloppyclockflag; /* fudge flags */ - - /* - * Status tallies - */ - u_long timestarted; /* time we started this */ - u_long polls; /* polls sent */ - u_long noreply; /* no replies to polls */ - u_long badformat; /* bad format reply */ - u_long baddata; /* bad data reply */ -}; - -/* - * Structure interface between the reference clock support - * ntp_refclock.c and particular clock drivers. This must agree with the - * structure defined in the driver. - */ -#define noentry 0 /* flag for null routine */ -#define NOFLAGS 0 /* flag for null flags */ - -struct refclock { - int (*clock_start) P((int, struct peer *)); - void (*clock_shutdown) P((int, struct peer *)); - void (*clock_poll) P((int, struct peer *)); - void (*clock_control) P((int, struct refclockstat *, - struct refclockstat *)); - void (*clock_init) P((void)); - void (*clock_buginfo) P((int, struct refclockbug *)); - u_long clock_flags; -}; - -/* - * Function prototypes - */ -extern int io_addclock_simple P((struct refclockio *)); -extern int io_addclock P((struct refclockio *)); -extern void io_closeclock P((struct refclockio *)); - -#ifdef REFCLOCK -extern void refclock_buginfo P((struct sockaddr_in *, - struct refclockbug *)); -extern void refclock_control P((struct sockaddr_in *, - struct refclockstat *, - struct refclockstat *)); -extern int refclock_open P((char *, int, int)); -extern void refclock_transmit P((struct peer *)); -extern int refclock_ioctl P((int, int)); -extern int refclock_process P((struct refclockproc *, int, int)); -extern void refclock_report P((struct peer *, u_char)); -extern int refclock_gtlin P((struct recvbuf *, char *, int, - l_fp *)); -#endif /* REFCLOCK */ diff --git a/usr.sbin/xntpd/include/ntp_request.h b/usr.sbin/xntpd/include/ntp_request.h deleted file mode 100644 index ea2d76992e93..000000000000 --- a/usr.sbin/xntpd/include/ntp_request.h +++ /dev/null @@ -1,808 +0,0 @@ -/* - * ntp_request.h - definitions for the xntpd remote query facility - */ - -#include "ntp_types.h" - -/* - * A mode 7 packet is used exchanging data between an NTP server - * and a client for purposes other than time synchronization, e.g. - * monitoring, statistics gathering and configuration. A mode 7 - * packet has the following format: - * - * 0 1 2 3 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * |R|M| VN | Mode|A| Sequence | Implementation| Req Code | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Err | Number of data items | MBZ | Size of data item | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | | - * | Data (Minimum 0 octets, maximum 500 octets) | - * | | - * [...] - * | | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Encryption Keyid (when A bit set) | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | | - * | Message Authentication Code (when A bit set) | - * | | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - * where the fields are (note that the client sends requests, the server - * responses): - * - * Response Bit: This packet is a response (if clear, packet is a request). - * - * More Bit: Set for all packets but the last in a response which - * requires more than one packet. - * - * Version Number: 2 for current version - * - * Mode: Always 7 - * - * Authenticated bit: If set, this packet is authenticated. - * - * Sequence number: For a multipacket response, contains the sequence - * number of this packet. 0 is the first in the sequence, - * 127 (or less) is the last. The More Bit must be set in - * all packets but the last. - * - * Implementation number: The number of the implementation this request code - * is defined by. An implementation number of zero is used - * for requst codes/data formats which all implementations - * agree on. Implementation number 255 is reserved (for - * extensions, in case we run out). - * - * Request code: An implementation-specific code which specifies the - * operation to be (which has been) performed and/or the - * format and semantics of the data included in the packet. - * - * Err: Must be 0 for a request. For a response, holds an error - * code relating to the request. If nonzero, the operation - * requested wasn't performed. - * - * 0 - no error - * 1 - incompatable implementation number - * 2 - unimplemented request code - * 3 - format error (wrong data items, data size, packet size etc.) - * 4 - no data available (e.g. request for details on unknown peer) - * 5-6 I don't know - * 7 - authentication failure (i.e. permission denied) - * - * Number of data items: number of data items in packet. 0 to 500 - * - * MBZ: A reserved data field, must be zero in requests and responses. - * - * Size of data item: size of each data item in packet. 0 to 500 - * - * Data: Variable sized area containing request/response data. For - * requests and responses the size in octets must be greater - * than or equal to the product of the number of data items - * and the size of a data item. For requests the data area - * must be exactly 40 octets in length. For responses the - * data area may be any length between 0 and 500 octets - * inclusive. - * - * Message Authentication Code: Same as NTP spec, in definition and function. - * May optionally be included in requests which require - * authentication, is never included in responses. - * - * The version number, mode and keyid have the same function and are - * in the same location as a standard NTP packet. The request packet - * is the same size as a standard NTP packet to ease receive buffer - * management, and to allow the same encryption procedure to be used - * both on mode 7 and standard NTP packets. The mac is included when - * it is required that a request be authenticated, the keyid should be - * zero in requests in which the mac is not included. - * - * The data format depends on the implementation number/request code pair - * and whether the packet is a request or a response. The only requirement - * is that data items start in the octet immediately following the size - * word and that data items be concatenated without padding between (i.e. - * if the data area is larger than data_items*size, all padding is at - * the end). Padding is ignored, other than for encryption purposes. - * Implementations using encryption might want to include a time stamp - * or other data in the request packet padding. The key used for requests - * is implementation defined, but key 15 is suggested as a default. - */ - -/* - * A request packet. These are almost a fixed length. - */ -struct req_pkt { - u_char rm_vn_mode; /* response, more, version, mode */ - u_char auth_seq; /* key, sequence number */ - u_char implementation; /* implementation number */ - u_char request; /* request number */ - u_short err_nitems; /* error code/number of data items */ - u_short mbz_itemsize; /* item size */ - char data[32]; /* data area */ - l_fp tstamp; /* time stamp, for authentication */ - U_LONG keyid; /* encryption key */ - char mac[MAX_MAC_LEN-sizeof(U_LONG)]; /* (optional) 8 byte auth code */ -}; - -/* - * Input packet lengths. One with the mac, one without. - */ -#define REQ_LEN_MAC (sizeof(struct req_pkt)) -#define REQ_LEN_NOMAC (sizeof(struct req_pkt) - MAX_MAC_LEN) - -/* - * A response packet. The length here is variable, this is a - * maximally sized one. Note that this implementation doesn't - * authenticate responses. - */ -#define RESP_HEADER_SIZE (8) -#define RESP_DATA_SIZE (500) - -struct resp_pkt { - u_char rm_vn_mode; /* response, more, version, mode */ - u_char auth_seq; /* key, sequence number */ - u_char implementation; /* implementation number */ - u_char request; /* request number */ - u_short err_nitems; /* error code/number of data items */ - u_short mbz_itemsize; /* item size */ - char data[RESP_DATA_SIZE]; /* data area */ -}; - - -/* - * Information error codes - */ -#define INFO_OKAY 0 -#define INFO_ERR_IMPL 1 /* incompatable implementation */ -#define INFO_ERR_REQ 2 /* unknown request code */ -#define INFO_ERR_FMT 3 /* format error */ -#define INFO_ERR_NODATA 4 /* no data for this request */ -#define INFO_ERR_AUTH 7 /* authentication failure */ - -/* - * Maximum sequence number. - */ -#define MAXSEQ 127 - - -/* - * Bit setting macros for multifield items. - */ -#define RESP_BIT 0x80 -#define MORE_BIT 0x40 - -#define ISRESPONSE(rm_vn_mode) (((rm_vn_mode)&RESP_BIT)!=0) -#define ISMORE(rm_vn_mode) (((rm_vn_mode)&MORE_BIT)!=0) -#define INFO_VERSION(rm_vn_mode) ((u_char)(((rm_vn_mode)>>3)&0x7)) -#define INFO_MODE(rm_vn_mode) ((rm_vn_mode)&0x7) - -#define RM_VN_MODE(resp, more) ((u_char)(((resp)?RESP_BIT:0)\ - |((more)?MORE_BIT:0)\ - |((NTP_VERSION)<<3)\ - |(MODE_PRIVATE))) - -#define INFO_IS_AUTH(auth_seq) (((auth_seq) & 0x80) != 0) -#define INFO_SEQ(auth_seq) ((auth_seq)&0x7f) -#define AUTH_SEQ(auth, seq) ((u_char)((((auth)!=0)?0x80:0)|((seq)&0x7f))) - -#define INFO_ERR(err_nitems) ((u_short)((ntohs(err_nitems)>>12)&0xf)) -#define INFO_NITEMS(err_nitems) ((u_short)(ntohs(err_nitems)&0xfff)) -#define ERR_NITEMS(err, nitems) (htons((((u_short)(err)<<12)&0xf000)\ - |((u_short)(nitems)&0xfff))) - -#define INFO_MBZ(mbz_itemsize) ((ntohs(mbz_itemsize)>>12)&0xf) -#define INFO_ITEMSIZE(mbz_itemsize) (ntohs(mbz_itemsize)&0xfff) -#define MBZ_ITEMSIZE(itemsize) (htons((u_short)(itemsize))) - - -/* - * Implementation numbers. One for universal use and one for xntpd. - */ -#define IMPL_UNIV 0 -#define IMPL_XNTPD 2 - -/* - * Some limits related to authentication. Frames which are - * authenticated must include a time stamp which differs from - * the receive time stamp by no more than 10 seconds. - */ -#define INFO_TS_MAXSKEW_UI 10 - -/* - * Universal request codes go here. There aren't any. - */ - -/* - * XNTPD request codes go here. - */ -#define REQ_PEER_LIST 0 /* return list of peers */ -#define REQ_PEER_LIST_SUM 1 /* return summary info for all peers */ -#define REQ_PEER_INFO 2 /* get standard information on peer */ -#define REQ_PEER_STATS 3 /* get statistics for peer */ -#define REQ_SYS_INFO 4 /* get system information */ -#define REQ_SYS_STATS 5 /* get system stats */ -#define REQ_IO_STATS 6 /* get I/O stats */ -#define REQ_MEM_STATS 7 /* stats related to peer list maint */ -#define REQ_LOOP_INFO 8 /* info from the loop filter */ -#define REQ_TIMER_STATS 9 /* get timer stats */ -#define REQ_CONFIG 10 /* configure a new peer */ -#define REQ_UNCONFIG 11 /* unconfigure an existing peer */ -#define REQ_SET_SYS_FLAG 12 /* set system flags */ -#define REQ_CLR_SYS_FLAG 13 /* clear system flags */ -#define REQ_MONITOR 14 /* monitor clients */ -#define REQ_NOMONITOR 15 /* stop monitoring clients */ -#define REQ_GET_RESTRICT 16 /* return restrict list */ -#define REQ_RESADDFLAGS 17 /* add flags to restrict list */ -#define REQ_RESSUBFLAGS 18 /* remove flags from restrict list */ -#define REQ_UNRESTRICT 19 /* remove entry from restrict list */ -#define REQ_MON_GETLIST 20 /* return data collected by monitor */ -#define REQ_RESET_STATS 21 /* reset stat counters */ -#define REQ_RESET_PEER 22 /* reset peer stat counters */ -#define REQ_REREAD_KEYS 23 /* reread the encryption key file */ -#define REQ_DO_DIRTY_HACK 24 /* historical interest */ -#define REQ_DONT_DIRTY_HACK 25 /* Ibid. */ -#define REQ_TRUSTKEY 26 /* add a trusted key */ -#define REQ_UNTRUSTKEY 27 /* remove a trusted key */ -#define REQ_AUTHINFO 28 /* return authentication info */ -#define REQ_TRAPS 29 /* return currently set traps */ -#define REQ_ADD_TRAP 30 /* add a trap */ -#define REQ_CLR_TRAP 31 /* clear a trap */ -#define REQ_REQUEST_KEY 32 /* define a new request keyid */ -#define REQ_CONTROL_KEY 33 /* define a new control keyid */ -#define REQ_GET_CTLSTATS 34 /* get stats from the control module */ -#define REQ_GET_LEAPINFO 35 /* get leap information */ -#define REQ_GET_CLOCKINFO 36 /* get clock information */ -#define REQ_SET_CLKFUDGE 37 /* set clock fudge factors */ -#define REQ_GET_KERNEL 38 /* get kernel pll/pps information */ -#define REQ_GET_CLKBUGINFO 39 /* get clock debugging info */ -#define REQ_SET_PRECISION 41 /* set clock precision */ -#define REQ_MON_GETLIST_1 42 /* return data collected by monitor v1*/ - -/* - * Flags in the peer information returns - */ -#define INFO_FLAG_CONFIG 0x1 -#define INFO_FLAG_SYSPEER 0x2 -#define INFO_FLAG_UNUSED 0x4 -#define INFO_FLAG_REFCLOCK 0x8 -#define INFO_FLAG_PREFER 0x10 -#define INFO_FLAG_AUTHENABLE 0x20 -#define INFO_FLAG_SEL_CANDIDATE 0x40 -#define INFO_FLAG_SHORTLIST 0x80 - -/* - * Flags in the system information returns - */ -#define INFO_FLAG_BCLIENT 0x1 -#define INFO_FLAG_AUTHENTICATE 0x2 -#define INFO_FLAG_PLL 0x4 -#define INFO_FLAG_PPS 0x8 /* unused */ -#define INFO_FLAG_PLL_SYNC 0x10 -#define INFO_FLAG_PPS_SYNC 0x20 -#define INFO_FLAG_MONITOR 0x40 -#define INFO_FLAG_FILEGEN 0x80 - -/* - * Peer list structure. Used to return raw lists of peers. It goes - * without saying that everything returned is in network byte order. - */ -struct info_peer_list { - U_LONG address; /* address of peer */ - u_short port; /* port number of peer */ - u_char hmode; /* mode for this peer */ - u_char flags; /* flags (from above) */ -}; - - -/* - * Peer summary structure. Sort of the info that ntpdc returns by default. - */ -struct info_peer_summary { - U_LONG dstadr; /* local address (zero for undetermined) */ - U_LONG srcadr; /* source address */ - u_short srcport; /* source port */ - u_char stratum; /* stratum of peer */ - s_char hpoll; /* host polling interval */ - s_char ppoll; /* peer polling interval */ - u_char reach; /* reachability register */ - u_char flags; /* flags, from above */ - u_char hmode; /* peer mode */ - s_fp delay; /* peer.estdelay */ - l_fp offset; /* peer.estoffset */ - u_fp dispersion; /* peer.estdisp */ -}; - - -/* - * Peer information structure. - */ -struct info_peer { - U_LONG dstadr; /* local address */ - U_LONG srcadr; /* remote address */ - u_short srcport; /* remote port */ - u_char flags; /* peer flags */ - u_char leap; /* peer.leap */ - u_char hmode; /* peer.hmode */ - u_char pmode; /* peer.pmode */ - u_char stratum; /* peer.stratum */ - u_char ppoll; /* peer.ppoll */ - u_char hpoll; /* peer.hpoll */ - s_char precision; /* peer.precision */ - u_char version; /* peer.version */ - u_char valid; /* peer.valid */ - u_char reach; /* peer.reach */ - u_char unreach; /* peer.unreach */ - u_char flash; /* peer.flash */ - u_char ttl; /* peer.ttl */ - u_char unused8; /* (obsolete) */ - u_char unused9; - u_short associd; /* association ID */ - U_LONG keyid; /* auth key in use */ - U_LONG pkeyid; /* peer.pkeyid */ - U_LONG refid; /* peer.refid */ - U_LONG timer; /* peer.timer */ - s_fp rootdelay; /* peer.distance */ - u_fp rootdispersion; /* peer.dispersion */ - l_fp reftime; /* peer.reftime */ - l_fp org; /* peer.org */ - l_fp rec; /* peer.rec */ - l_fp xmt; /* peer.xmt */ - s_fp filtdelay[NTP_SHIFT]; /* delay shift register */ - l_fp filtoffset[NTP_SHIFT]; /* offset shift register */ - u_char order[NTP_SHIFT]; /* order of peers from last filter */ - s_fp delay; /* peer.estdelay */ - u_fp dispersion; /* peer.estdisp */ - l_fp offset; /* peer.estoffset */ - u_fp selectdisp; /* peer select dispersion */ - LONG unused1; /* (obsolete) */ - LONG unused2; - LONG unused3; - LONG unused4; - LONG unused5; - LONG unused6; - LONG unused7; - s_fp estbdelay; /* broadcast offset */ -}; - - -/* - * Peer statistics structure - */ -struct info_peer_stats { - U_LONG dstadr; /* local address */ - U_LONG srcadr; /* remote address */ - u_short srcport; /* remote port */ - u_short flags; /* peer flags */ - U_LONG timereset; /* time counters were reset */ - U_LONG timereceived; /* time since a packet received */ - U_LONG timetosend; /* time until a packet sent */ - U_LONG timereachable; /* time peer has been reachable */ - U_LONG sent; /* number sent */ - U_LONG unused1; /* (unused) */ - U_LONG processed; /* number processed */ - U_LONG unused2; /* (unused) */ - U_LONG badauth; /* bad authentication */ - U_LONG bogusorg; /* bogus origin */ - U_LONG oldpkt; /* duplicate */ - U_LONG unused3; /* (unused) */ - U_LONG unused4; /* (unused) */ - U_LONG seldisp; /* bad dispersion */ - U_LONG selbroken; /* bad reference time */ - U_LONG unused5; /* (unused) */ - u_char candidate; /* select order */ - u_char unused6; /* (unused) */ - u_char unused7; /* (unused) */ - u_char unused8; /* (unused) */ -}; - - -/* - * Loop filter variables - */ -struct info_loop { - l_fp last_offset; - l_fp drift_comp; - U_LONG compliance; - U_LONG watchdog_timer; -}; - - -/* - * System info. Mostly the sys.* variables, plus a few unique to - * the implementation. - */ -struct info_sys { - U_LONG peer; /* system peer address */ - u_char peer_mode; /* mode we are syncing to peer in */ - u_char leap; /* system leap bits */ - u_char stratum; /* our stratum */ - s_char precision; /* local clock precision */ - s_fp rootdelay; /* distance from sync source */ - u_fp rootdispersion; /* dispersion from sync source */ - U_LONG refid; /* reference ID of sync source */ - l_fp reftime; /* system reference time */ - U_LONG poll; /* system poll interval */ - u_char flags; /* system flags */ - u_char unused1; /* unused */ - u_char unused2; /* unused */ - u_char unused3; /* unused */ - s_fp bdelay; /* default broadcast offset */ - s_fp frequency; /* frequency residual (scaled ppm) */ - l_fp authdelay; /* default authentication delay */ - u_fp stability; /* clock stability (scaled ppm) */ -}; - - -/* - * System stats. These are collected in the protocol module - */ -struct info_sys_stats { - U_LONG timeup; /* time we have been up and running */ - U_LONG timereset; /* time since these were last cleared */ - U_LONG badstratum; /* packets claiming an invalid stratum */ - U_LONG oldversionpkt; /* old version packets received */ - U_LONG newversionpkt; /* new version packets received */ - U_LONG unknownversion; /* don't know version packets */ - U_LONG badlength; /* packets with bad length */ - U_LONG processed; /* packets processed */ - U_LONG badauth; /* packets dropped because of authorization */ - U_LONG wanderhold; /* (obsolete) */ - U_LONG limitrejected; /* rejected because of client limitation */ -}; - - -/* - * System stats - old version - */ -struct old_info_sys_stats { - U_LONG timeup; /* time we have been up and running */ - U_LONG timereset; /* time since these were last cleared */ - U_LONG badstratum; /* packets claiming an invalid stratum */ - U_LONG oldversionpkt; /* old version packets received */ - U_LONG newversionpkt; /* new version packets received */ - U_LONG unknownversion; /* don't know version packets */ - U_LONG badlength; /* packets with bad length */ - U_LONG processed; /* packets processed */ - U_LONG badauth; /* packets dropped because of authorization */ - U_LONG wanderhold; -}; - - -/* - * Peer memory statistics. Collected in the peer module. - */ -struct info_mem_stats { - U_LONG timereset; /* time since reset */ - u_short totalpeermem; - u_short freepeermem; - U_LONG findpeer_calls; - U_LONG allocations; - U_LONG demobilizations; - u_char hashcount[HASH_SIZE]; -}; - - -/* - * I/O statistics. Collected in the I/O module - */ -struct info_io_stats { - U_LONG timereset; /* time since reset */ - u_short totalrecvbufs; /* total receive bufs */ - u_short freerecvbufs; /* free buffers */ - u_short fullrecvbufs; /* full buffers */ - u_short lowwater; /* number of times we've added buffers */ - U_LONG dropped; /* dropped packets */ - U_LONG ignored; /* ignored packets */ - U_LONG received; /* received packets */ - U_LONG sent; /* packets sent */ - U_LONG notsent; /* packets not sent */ - U_LONG interrupts; /* interrupts we've handled */ - U_LONG int_received; /* received by interrupt handler */ -}; - - -/* - * Timer stats. Guess where from. - */ -struct info_timer_stats { - U_LONG timereset; /* time since reset */ - U_LONG alarms; /* alarms we've handled */ - U_LONG overflows; /* timer overflows */ - U_LONG xmtcalls; /* calls to xmit */ -}; - - -/* - * Structure for passing peer configuration information - */ -struct conf_peer { - U_LONG peeraddr; /* address to poll */ - u_char hmode; /* mode, either broadcast, active or client */ - u_char version; /* version number to poll with */ - u_char minpoll; /* min host poll interval */ - u_char maxpoll; /* max host poll interval */ - u_char flags; /* flags for this request */ - u_char ttl; /* time to live (multicast) */ - u_short unused; /* unused */ - U_LONG keyid; /* key to use for this association */ -}; - -#define CONF_FLAG_AUTHENABLE 0x1 -#define CONF_FLAG_PREFER 0x2 - -/* - * Structure for passing peer deletion information. Currently - * we only pass the address and delete all configured peers with - * this addess. - */ -struct conf_unpeer { - U_LONG peeraddr; /* address of peer */ -}; - -/* - * Structure for carrying system flags. - */ -struct conf_sys_flags { - U_LONG flags; -}; - -/* - * System flags we can set/clear - */ -#define SYS_FLAG_BCLIENT 0x1 -#define SYS_FLAG_AUTHENTICATE 0x2 -#define SYS_FLAG_PLL 0x4 -#define SYS_FLAG_PPS 0x8 -#define SYS_FLAG_MONITOR 0x10 -#define SYS_FLAG_FILEGEN 0x20 - -/* - * Structure used for returning restrict entries - */ -struct info_restrict { - U_LONG addr; /* match address */ - U_LONG mask; /* match mask */ - U_LONG count; /* number of packets matched */ - u_short flags; /* restrict flags */ - u_short mflags; /* match flags */ -}; - - -/* - * Structure used for specifying restrict entries - */ -struct conf_restrict { - U_LONG addr; /* match address */ - U_LONG mask; /* match mask */ - u_short flags; /* restrict flags */ - u_short mflags; /* match flags */ -}; - - -/* - * Structure used for returning monitor data - */ -struct info_monitor_1 { - U_LONG lasttime; /* last packet from this host */ - U_LONG firsttime; /* first time we received a packet */ - U_LONG lastdrop; /* last time we rejected a packet due to client limitation policy */ - U_LONG count; /* count of packets received */ - U_LONG addr; /* host address */ - U_LONG daddr; /* destination host address */ - U_LONG flags; /* flags about destination */ - u_short port; /* port number of last reception */ - u_char mode; /* mode of last packet */ - u_char version; /* version number of last packet */ -}; - - -/* - * Structure used for returning monitor data - */ -struct info_monitor { - U_LONG lasttime; /* last packet from this host */ - U_LONG firsttime; /* first time we received a packet */ - U_LONG lastdrop; /* last time we rejected a packet due to client limitation policy */ - U_LONG count; /* count of packets received */ - U_LONG addr; /* host address */ - u_short port; /* port number of last reception */ - u_char mode; /* mode of last packet */ - u_char version; /* version number of last packet */ -}; - -/* - * Structure used for returning monitor data (old format - */ -struct old_info_monitor { - U_LONG lasttime; /* last packet from this host */ - U_LONG firsttime; /* first time we received a packet */ - U_LONG count; /* count of packets received */ - U_LONG addr; /* host address */ - u_short port; /* port number of last reception */ - u_char mode; /* mode of last packet */ - u_char version; /* version number of last packet */ -}; - -/* - * Structure used for passing indication of flags to clear - */ -struct reset_flags { - U_LONG flags; -}; - -#define RESET_FLAG_ALLPEERS 0x01 -#define RESET_FLAG_IO 0x02 -#define RESET_FLAG_SYS 0x04 -#define RESET_FLAG_MEM 0x08 -#define RESET_FLAG_TIMER 0x10 -#define RESET_FLAG_AUTH 0x20 -#define RESET_FLAG_CTL 0x40 - -#define RESET_ALLFLAGS \ - (RESET_FLAG_ALLPEERS|RESET_FLAG_IO|RESET_FLAG_SYS \ - |RESET_FLAG_MEM|RESET_FLAG_TIMER|RESET_FLAG_AUTH|RESET_FLAG_CTL) - -/* - * Structure used to return information concerning the authentication - * module. - */ -struct info_auth { - U_LONG timereset; /* time counters were reset */ - U_LONG numkeys; /* number of keys we know */ - U_LONG numfreekeys; /* number of free keys */ - U_LONG keylookups; /* calls to authhavekey() */ - U_LONG keynotfound; /* requested key unknown */ - U_LONG encryptions; /* number of encryptions */ - U_LONG decryptions; /* number of decryptions */ - U_LONG unused; /* (unused) */ - U_LONG keyuncached; /* calls to encrypt/decrypt with uncached key */ -}; - - -/* - * Structure used to pass trap information to the client - */ -struct info_trap { - U_LONG local_address; /* local interface address */ - U_LONG trap_address; /* remote client's address */ - u_short trap_port; /* remote port number */ - u_short sequence; /* sequence number */ - U_LONG settime; /* time trap last set */ - U_LONG origtime; /* time trap originally set */ - U_LONG resets; /* number of resets on this trap */ - U_LONG flags; /* trap flags, as defined in ntp_control.h */ -}; - -/* - * Structure used to pass add/clear trap information to the client - */ -struct conf_trap { - U_LONG local_address; /* local interface address */ - U_LONG trap_address; /* remote client's address */ - u_short trap_port; /* remote client's port */ - u_short unused; -}; - - -/* - * Structure used to return statistics from the control module - */ -struct info_control { - U_LONG ctltimereset; - U_LONG numctlreq; /* number of requests we've received */ - U_LONG numctlbadpkts; /* number of bad control packets */ - U_LONG numctlresponses; /* # resp packets sent */ - U_LONG numctlfrags; /* # of fragments sent */ - U_LONG numctlerrors; /* number of error responses sent */ - U_LONG numctltooshort; /* number of too short input packets */ - U_LONG numctlinputresp; /* number of responses on input */ - U_LONG numctlinputfrag; /* number of fragments on input */ - U_LONG numctlinputerr; /* # input pkts with err bit set */ - U_LONG numctlbadoffset; /* # input pkts with nonzero offset */ - U_LONG numctlbadversion; /* # input pkts with unknown version */ - U_LONG numctldatatooshort; /* data too short for count */ - U_LONG numctlbadop; /* bad op code found in packet */ - U_LONG numasyncmsgs; /* # async messages we've sent */ -}; - - -/* - * Structure used to return leap information. - */ -struct info_leap { - u_char sys_leap; /* current sys_leap */ - u_char leap_indicator; /* current leap indicator */ - u_char leap_warning; /* current leap warning */ - u_char leap_bits; /* leap flags */ - U_LONG leap_timer; /* seconds to next interrupt */ - U_LONG leap_processcalls; /* calls to the leap process */ - U_LONG leap_notclose; /* found leap was not close */ - U_LONG leap_monthofleap; /* in month of leap */ - U_LONG leap_dayofleap; /* in day of leap */ - U_LONG leap_hoursfromleap; /* leap within two hours */ - U_LONG leap_happened; /* leap second happened */ -}; - -#define INFO_LEAP_MASK 0x3 /* flag for leap_bits */ -#define INFO_LEAP_SEENSTRATUM1 0x4 /* server has seen stratum 1 */ -#define INFO_LEAP_OVERRIDE 0x8 /* server will override the leap information */ - -/* - * Structure used to return clock information - */ -struct info_clock { - U_LONG clockadr; - u_char type; - u_char flags; - u_char lastevent; - u_char currentstatus; - U_LONG polls; - U_LONG noresponse; - U_LONG badformat; - U_LONG baddata; - U_LONG timestarted; - l_fp fudgetime1; - l_fp fudgetime2; - LONG fudgeval1; - LONG fudgeval2; -}; - - -/* - * Structure used for setting clock fudge factors - */ -struct conf_fudge { - U_LONG clockadr; - U_LONG which; - l_fp fudgetime; - LONG fudgeval_flags; -}; - -#define FUDGE_TIME1 1 -#define FUDGE_TIME2 2 -#define FUDGE_VAL1 3 -#define FUDGE_VAL2 4 -#define FUDGE_FLAGS 5 - - -/* - * Structure used for returning clock debugging info - */ -#define NUMCBUGVALUES 16 -#define NUMCBUGTIMES 32 - -struct info_clkbug { - U_LONG clockadr; - u_char nvalues; - u_char ntimes; - u_short svalues; - U_LONG stimes; - U_LONG values[NUMCBUGVALUES]; - l_fp times[NUMCBUGTIMES]; -}; - -/* - * Structure used for returning kernel pll/PPS information - */ -struct info_kernel { - LONG offset; - LONG freq; - LONG maxerror; - LONG esterror; - u_short status; - u_short shift; - LONG constant; - LONG precision; - LONG tolerance; - -/* - * Variables used only if PPS signal discipline is implemented - */ - LONG ppsfreq; - LONG jitter; - LONG stabil; - LONG jitcnt; - LONG calcnt; - LONG errcnt; - LONG stbcnt; -}; diff --git a/usr.sbin/xntpd/include/ntp_select.h b/usr.sbin/xntpd/include/ntp_select.h deleted file mode 100644 index 14e498d20b47..000000000000 --- a/usr.sbin/xntpd/include/ntp_select.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Not all machines define FD_SET in sys/types.h - */ -#ifndef _ntp_select_h -#define _ntp_select_h - -#if (defined(RS6000)||defined(SYS_PTX))&&!defined(_BSD) -#include <sys/select.h> -#endif - -#ifndef FD_SET -#define NFDBITS 32 -#define FD_SETSIZE 32 -#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) -#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) -#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) -#define FD_ZERO(p) memset((char *)(p), 0, sizeof(*(p))) -#endif - -#endif /* _ntp_select_h */ diff --git a/usr.sbin/xntpd/include/ntp_stdlib.h b/usr.sbin/xntpd/include/ntp_stdlib.h deleted file mode 100644 index 19cdad8cc742..000000000000 --- a/usr.sbin/xntpd/include/ntp_stdlib.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * ntp_stdlib.h - Prototypes for XNTP lib. - */ -#include <sys/types.h> - -#include "ntp_types.h" -#include "ntp_string.h" -#include "l_stdlib.h" - -#ifndef P -#if defined(__STDC__) || defined(USE_PROTOTYPES) -#define P(x) x -#else -#define P(x) () -#if !defined(const) -#define const -#endif -#endif -#endif - -#if defined(__STDC__) -extern void msyslog P((int, char *, ...)); -#else -extern void msyslog P(()); -#endif - -extern void auth_des P((u_long *, u_char *)); -extern void auth_delkeys P((void)); -extern int auth_havekey P((u_long)); -extern int auth_parity P((u_long *)); -extern void auth_setkey P((u_long, u_long *)); -extern void auth_subkeys P((u_long *, u_char *, u_char *)); -extern int authistrusted P((u_long)); -extern int authusekey P((u_long, int, const char *)); - -extern void auth_delkeys P((void)); - -extern void auth1crypt P((u_long, U_LONG *, int)); -extern int auth2crypt P((u_long, U_LONG *, int)); -extern int authdecrypt P((u_long, U_LONG *, int)); -extern int authencrypt P((u_long, U_LONG *, int)); -extern int authhavekey P((u_long)); -extern int authreadkeys P((const char *)); -extern void authtrust P((u_long, int)); -extern void calleapwhen P((u_long, u_long *, u_long *)); -extern u_long calyearstart P((u_long)); -extern const char *clockname P((int)); -extern int clocktime P((int, int, int, int, int, u_long, u_long *, U_LONG *)); -extern char * emalloc P((u_int)); -extern int ntp_getopt P((int, char **, char *)); -extern void init_auth P((void)); -extern void init_lib P((void)); -extern void init_random P((void)); - -#ifdef DES -extern void DESauth1crypt P((u_long, U_LONG *, int)); -extern int DESauth2crypt P((u_long, U_LONG *, int)); -extern int DESauthdecrypt P((u_long, const U_LONG *, int)); -extern int DESauthencrypt P((u_long, U_LONG *, int)); -extern void DESauth_setkey P((u_long, const U_LONG *)); -extern void DESauth_subkeys P((const U_LONG *, u_char *, u_char *)); -extern void DESauth_des P((U_LONG *, u_char *)); -extern int DESauth_parity P((U_LONG *)); -#endif /* DES */ - -#ifdef MD5 -extern void MD5auth1crypt P((u_long, U_LONG *, int)); -extern int MD5auth2crypt P((u_long, U_LONG *, int)); -extern int MD5authdecrypt P((u_long, const U_LONG *, int)); -extern int MD5authencrypt P((u_long, U_LONG *, int)); -extern void MD5auth_setkey P((u_long, const U_LONG *)); -#endif /* MD5 */ - -extern int atoint P((const char *, long *)); -extern int atouint P((const char *, u_long *)); -extern int hextoint P((const char *, u_long *)); -extern char * humandate P((u_long)); -extern char * inttoa P((long)); -extern char * mfptoa P((u_long, u_long, int)); -extern char * mfptoms P((u_long, u_long, int)); -extern char * modetoa P((int)); -extern u_int32_t netof P((u_int32_t)); -extern char * numtoa P((u_int32_t)); -extern char * numtohost P((u_int32_t)); -extern int octtoint P((const char *, u_long *)); -extern u_long ranp2 P((int)); -extern char * refnumtoa P((u_long)); -extern int tsftomsu P((u_long, int)); -extern char * uinttoa P((u_long)); - -extern int decodenetnum P((const char *, u_long *)); - -extern RETSIGTYPE signal_no_reset P((int, RETSIGTYPE (*func)())); diff --git a/usr.sbin/xntpd/include/ntp_string.h b/usr.sbin/xntpd/include/ntp_string.h deleted file mode 100644 index 90a29dae2aac..000000000000 --- a/usr.sbin/xntpd/include/ntp_string.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Define string ops: strchr strrchr memcmp memmove memset - */ - -#ifndef _ntp_string_h -#define _ntp_string_h - -#if defined(NTP_POSIX_SOURCE) - -# if defined(HAVE_MEMORY_H) -# include <memory.h> -# endif - -# include <string.h> - -#else - -# include <strings.h> -# define strchr(s,c) index(s,c) -# define strrchr(s,c) rindex(s,c) -# ifndef NTP_NEED_BOPS -# define NTP_NEED_BOPS -# endif -#endif /* NTP_POSIX_SOURCE */ - -#ifdef NTP_NEED_BOPS - -# define memcmp(a,b,c) bcmp(a,b,c) -# define memmove(t,f,c) bcopy(f,t,c) -# define memset(a,x,c) if (x == 0x00) bzero(a,c); else ntp_memset((char*)a,x,c) -void ntp_memset P((char *, int, int)); - -#endif /* NTP_NEED_BOPS */ - -#endif /* _ntp_string_h */ diff --git a/usr.sbin/xntpd/include/ntp_syslog.h b/usr.sbin/xntpd/include/ntp_syslog.h deleted file mode 100644 index 38b847bb82ca..000000000000 --- a/usr.sbin/xntpd/include/ntp_syslog.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * A hack for platforms which require specially built syslog facilities - */ -#ifdef GIZMO -#include "gizmo_syslog.h" -#else /* !GIZMO */ -#include <syslog.h> -#ifdef SYSLOG_FILE -#include <stdio.h> -#endif -#endif /* GIZMO */ -#ifdef SYSLOG_FILE -extern FILE *syslog_file; -#define syslog msyslog -#endif diff --git a/usr.sbin/xntpd/include/ntp_timex.h b/usr.sbin/xntpd/include/ntp_timex.h deleted file mode 100644 index cb8396ac23fe..000000000000 --- a/usr.sbin/xntpd/include/ntp_timex.h +++ /dev/null @@ -1,273 +0,0 @@ -/****************************************************************************** - * * - * Copyright (c) David L. Mills 1993, 1994 * - * * - * Permission to use, copy, modify, and distribute this software and its * - * documentation for any purpose and without fee is hereby granted, provided * - * that the above copyright notice appears in all copies and that both the * - * copyright notice and this permission notice appear in supporting * - * documentation, and that the name University of Delaware not be used in * - * advertising or publicity pertaining to distribution of the software * - * without specific, written prior permission. The University of Delaware * - * makes no representations about the suitability this software for any * - * purpose. It is provided "as is" without express or implied warranty. * - * * - ******************************************************************************/ - -/* - * Modification history timex.h - * - * 19 Mar 94 David L. Mills - * Moved defines from kernel routines to header file and added new - * defines for PPS phase-lock loop. - * - * 20 Feb 94 David L. Mills - * Revised status codes and structures for external clock and PPS - * signal discipline. - * - * 28 Nov 93 David L. Mills - * Adjusted parameters to improve stability and increase poll - * interval. - * - * 17 Sep 93 David L. Mills - * Created file - */ -/* - * This header file defines the Network Time Protocol (NTP) interfaces - * for user and daemon application programs. These are implemented using - * private syscalls and data structures and require specific kernel - * support. - * - * NAME - * ntp_gettime - NTP user application interface - * - * SYNOPSIS - * #include <sys/timex.h> - * - * int syscall(SYS_ntp_gettime, tptr) - * - * int SYS_ntp_gettime defined in syscall.h header file - * struct ntptimeval *tptr pointer to ntptimeval structure - * - * NAME - * ntp_adjtime - NTP daemon application interface - * - * SYNOPSIS - * #include <sys/timex.h> - * - * int syscall(SYS_ntp_adjtime, mode, tptr) - * - * int SYS_ntp_adjtime defined in syscall.h header file - * struct timex *tptr pointer to timex structure - * - */ -#ifndef MSDOS /* Microsoft specific */ -#include <sys/syscall.h> -#endif /* MSDOS */ - -/* - * The following defines establish the engineering parameters of the - * phase-lock loop (PLL) model used in the kernel implementation. These - * parameters have been carefully chosen by analysis for good stability - * and wide dynamic range. - * - * The hz variable is defined in the kernel build environment. It - * establishes the timer interrupt frequency, 100 Hz for the SunOS - * kernel, 256 Hz for the Ultrix kernel and 1024 Hz for the OSF/1 - * kernel. SHIFT_HZ expresses the same value as the nearest power of two - * in order to avoid hardware multiply operations. - * - * SHIFT_KG and SHIFT_KF establish the damping of the PLL and are chosen - * for a slightly underdamped convergence characteristic. - * - * MAXTC establishes the maximum time constant of the PLL. With the - * SHIFT_KG and SHIFT_KF values given and a time constant range from - * zero to MAXTC, the PLL will converge in 15 minutes to 16 hours, - * respectively. - */ -#define SHIFT_HZ 7 /* log2(hz) */ -#define SHIFT_KG 6 /* phase factor (shift) */ -#define SHIFT_KF 16 /* frequency factor (shift) */ -#define MAXTC 6 /* maximum time constant (shift) */ - -/* - * The following defines establish the scaling of the various variables - * used by the PLL. They are chosen to allow the greatest precision - * possible without overflow of a 32-bit word. - * - * SHIFT_SCALE defines the scaling (shift) of the time_phase variable, - * which serves as a an extension to the low-order bits of the system - * clock variable time.tv_usec. - * - * SHIFT_UPDATE defines the scaling (shift) of the time_offset variable, - * which represents the current time offset with respect to standard - * time. - * - * SHIFT_USEC defines the scaling (shift) of the time_freq and - * time_tolerance variables, which represent the current frequency - * offset and maximum frequency tolerance. - * - * FINEUSEC is 1 us in SHIFT_UPDATE units of the time_phase variable. - */ -#define SHIFT_SCALE 23 /* phase scale (shift) */ -#define SHIFT_UPDATE (SHIFT_KG + MAXTC) /* time offset scale (shift) */ -#define SHIFT_USEC 16 /* frequency offset scale (shift) */ -#define FINEUSEC (1L << SHIFT_SCALE) /* 1 us in phase units */ - -/* - * The following defines establish the performance envelope of the PLL. - * They insure it operates within predefined limits, in order to satisfy - * correctness assertions. An excursion which exceeds these bounds is - * clamped to the bound and operation proceeds accordingly. In practice, - * this can occur only if something has failed or is operating out of - * tolerance, but otherwise the PLL continues to operate in a stable - * mode. - * - * MAXPHASE must be set greater than or equal to CLOCK.MAX (128 ms), as - * defined in the NTP specification. CLOCK.MAX establishes the maximum - * time offset allowed before the system time is reset, rather than - * incrementally adjusted. Here, the maximum offset is clamped to - * MAXPHASE only in order to prevent overflow errors due to defective - * protocol implementations. - * - * MAXFREQ is the maximum frequency tolerance of the CPU clock - * oscillator plus the maximum slew rate allowed by the protocol. It - * should be set to at least the frequency tolerance of the oscillator - * plus 100 ppm for vernier frequency adjustments. If the kernel - * PPS discipline code is configured (PPS_SYNC), the oscillator time and - * frequency are disciplined to an external source, presumably with - * negligible time and frequency error relative to UTC, and MAXFREQ can - * be reduced. - * - * MAXTIME is the maximum jitter tolerance of the PPS signal if the - * kernel PPS discipline code is configured (PPS_SYNC). - * - * MINSEC and MAXSEC define the lower and upper bounds on the interval - * between protocol updates. - */ -#define MAXPHASE 128000L /* max phase error (us) */ -#ifdef PPS_SYNC -#define MAXFREQ (100L << SHIFT_USEC) /* max freq error (100 ppm) */ -#define MAXTIME (200L << PPS_AVG) /* max PPS error (jitter) (200 us) */ -#else -#define MAXFREQ (200L << SHIFT_USEC) /* max freq error (200 ppm) */ -#endif /* PPS_SYNC */ -#define MINSEC 16L /* min interval between updates (s) */ -#define MAXSEC 1200L /* max interval between updates (s) */ - -#ifdef PPS_SYNC -/* - * The following defines are used only if a pulse-per-second (PPS) - * signal is available and connected via a modem control lead, such as - * produced by the optional ppsclock feature incorporated in the Sun - * asynch driver. They establish the design parameters of the frequency- - * lock loop used to discipline the CPU clock oscillator to the PPS - * signal. - * - * PPS_AVG is the averaging factor for the frequency loop, as well as - * the time and frequency dispersion. - * - * PPS_SHIFT and PPS_SHIFTMAX specify the minimum and maximum - * calibration intervals, respectively, in seconds as a power of two. - * - * PPS_VALID is the maximum interval before the PPS signal is considered - * invalid and protocol updates used directly instead. - * - * MAXGLITCH is the maximum interval before a time offset of more than - * MAXTIME is believed. - */ -#define PPS_AVG 2 /* pps averaging constant (shift) */ -#define PPS_SHIFT 2 /* min interval duration (s) (shift) */ -#define PPS_SHIFTMAX 8 /* max interval duration (s) (shift) */ -#define PPS_VALID 120 /* pps signal watchdog max (s) */ -#define MAXGLITCH 30 /* pps signal glitch max (s) */ -#endif /* PPS_SYNC */ - -/* - * The following defines and structures define the user interface for - * the ntp_gettime() and ntp_adjtime() system calls. - * - * Control mode codes (timex.modes) - */ -#define MOD_OFFSET 0x0001 /* set time offset */ -#define MOD_FREQUENCY 0x0002 /* set frequency offset */ -#define MOD_MAXERROR 0x0004 /* set maximum time error */ -#define MOD_ESTERROR 0x0008 /* set estimated time error */ -#define MOD_STATUS 0x0010 /* set clock status bits */ -#define MOD_TIMECONST 0x0020 /* set pll time constant */ -#define MOD_CLKB 0x4000 /* set clock B */ -#define MOD_CLKA 0x8000 /* set clock A */ - -/* - * Status codes (timex.status) - */ -#define STA_PLL 0x0001 /* enable PLL updates (rw) */ -#define STA_PPSFREQ 0x0002 /* enable PPS freq discipline (rw) */ -#define STA_PPSTIME 0x0004 /* enable PPS time discipline (rw) */ - -#define STA_INS 0x0010 /* insert leap (rw) */ -#define STA_DEL 0x0020 /* delete leap (rw) */ -#define STA_UNSYNC 0x0040 /* clock unsynchronized (rw) */ - -#define STA_PPSSIGNAL 0x0100 /* PPS signal present (ro) */ -#define STA_PPSJITTER 0x0200 /* PPS signal jitter exceeded (ro) */ -#define STA_PPSWANDER 0x0400 /* PPS signal wander exceeded (ro) */ -#define STA_PPSERROR 0x0800 /* PPS signal calibration error (ro) */ - -#define STA_CLOCKERR 0x1000 /* clock hardware fault (ro) */ - -#define STA_RONLY (STA_PPSSIGNAL | STA_PPSJITTER | STA_PPSWANDER | \ - STA_PPSERROR | STA_CLOCKERR) /* read-only bits */ - -/* - * Clock states (time_state) - */ -#define TIME_OK 0 /* no leap second warning */ -#define TIME_INS 1 /* insert leap second warning */ -#define TIME_DEL 2 /* delete leap second warning */ -#define TIME_OOP 3 /* leap second in progress */ -#define TIME_WAIT 4 /* leap second has occured */ -#define TIME_ERROR 5 /* clock not synchronized */ - -/* - * NTP user interface (ntp_gettime()) - used to read kernel clock values - * - * Note: maximum error = NTP synch distance = dispersion + delay / 2; - * estimated error = NTP dispersion. - */ -struct ntptimeval { - struct timeval time; /* current time (ro) */ - LONG maxerror; /* maximum error (us) (ro) */ - LONG esterror; /* estimated error (us) (ro) */ -}; - -/* - * NTP daemon interface - (ntp_adjtime()) used to discipline CPU clock - * oscillator - */ -struct timex { - unsigned int modes; /* clock mode bits (wo) */ - LONG offset; /* time offset (us) (rw) */ - LONG freq; /* frequency offset (scaled ppm) (rw) */ - LONG maxerror; /* maximum error (us) (rw) */ - LONG esterror; /* estimated error (us) (rw) */ - int status; /* clock status bits (rw) */ - LONG constant; /* pll time constant (rw) */ - LONG precision; /* clock precision (us) (ro) */ - LONG tolerance; /* clock frequency tolerance (scaled - * ppm) (ro) */ - /* - * The following read-only structure members are implemented - * only if the PPS signal discipline is configured in the - * kernel. - */ - LONG ppsfreq; /* pps frequency (scaled ppm) (ro) */ - LONG jitter; /* pps jitter (us) (ro) */ - int shift; /* interval duration (s) (shift) (ro) */ - LONG stabil; /* pps stability (scaled ppm) (ro) */ - LONG jitcnt; /* jitter limit exceeded (ro) */ - LONG calcnt; /* calibration intervals (ro) */ - LONG errcnt; /* calibration errors (ro) */ - LONG stbcnt; /* stability limit exceeded (ro) */ - -}; diff --git a/usr.sbin/xntpd/include/ntp_types.h b/usr.sbin/xntpd/include/ntp_types.h deleted file mode 100644 index bbcea1bce405..000000000000 --- a/usr.sbin/xntpd/include/ntp_types.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * ntp_types.h - defines how LONG and U_LONG are treated. For 64 bit systems - * like the DEC Alpha, they has to be defined as int and u_int. for 32 bit - * systems, define them as long and u_long - */ -#include "ntp_machine.h" - -#ifndef _NTP_TYPES_ -#define _NTP_TYPES_ - -/* - * This is another naming conflict. - * On NetBSD for MAC the macro "mac" is defined as 1 - * this is fun for a as a paket structure contains an - * optional "mac" member - severe confusion results 8-) - * As we hopefully do not have to rely on that macro we - * just undefine that. - */ -#ifdef mac -#undef mac -#endif - -/* - * Set up for prototyping - */ -#ifndef P -#if defined(__STDC__) || defined(USE_PROTOTYPES) -#define P(x) x -#else /* __STDC__ USE_PROTOTYPES */ -#define P(x) () -#if !defined(const) -#define const -#endif /* const */ -#endif /* __STDC__ USE_PROTOTYPES */ -#endif /* P */ - -/* - * DEC Alpha systems need LONG and U_LONG defined as int and u_int - */ -#ifdef __alpha -#ifndef LONG -#define LONG int -#endif /* LONG */ -#ifndef U_LONG -#define U_LONG u_int -#endif /* U_LONG */ -/* - * All other systems fall into this part - */ -#else /* __alpha */ -#ifndef LONG -#define LONG long -#endif /* LONG */ -#ifndef U_LONG -#define U_LONG u_long -#endif /* U_LONG */ -#endif /* __ alplha */ - -#endif /* _NTP_TYPES_ */ - diff --git a/usr.sbin/xntpd/include/ntp_unixtime.h b/usr.sbin/xntpd/include/ntp_unixtime.h deleted file mode 100644 index 8007a06640c9..000000000000 --- a/usr.sbin/xntpd/include/ntp_unixtime.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * ntp_unixtime.h - contains constants and macros for converting between - * NTP time stamps (l_fp) and Unix times (struct timeval) - */ - -#include "ntp_types.h" -#include <sys/time.h> - -/* gettimeofday() takes two args in BSD and only one in SYSV */ -#ifdef SYSV_TIMEOFDAY -# define GETTIMEOFDAY(a, b) (gettimeofday(a)) -# define SETTIMEOFDAY(a, b) (settimeofday(a)) -#else /* ! SYSV_TIMEOFDAY */ -# define GETTIMEOFDAY(a, b) (gettimeofday(a, b)) -# define SETTIMEOFDAY(a, b) (settimeofday(a, b)) -#endif /* SYSV_TIMEOFDAY */ - -/* - * Time of day conversion constant. Ntp's time scale starts in 1900, - * Unix in 1970. - */ -#define JAN_1970 0x83aa7e80 /* 2208988800 1970 - 1900 in seconds */ - -/* - * These constants are used to round the time stamps computed from - * a struct timeval to the microsecond (more or less). This keeps - * things neat. - */ -#define TS_MASK 0xfffff000 /* mask to usec, for time stamps */ -#define TS_ROUNDBIT 0x00000800 /* round at this bit */ - - -/* - * Convert usec to a time stamp fraction. If you use this the program - * must include the following declarations: - */ -extern u_long ustotslo[]; -extern u_long ustotsmid[]; -extern u_long ustotshi[]; - -#define TVUTOTSF(tvu, tsf) \ - (tsf) = ustotslo[(tvu) & 0xff] \ - + ustotsmid[((tvu) >> 8) & 0xff] \ - + ustotshi[((tvu) >> 16) & 0xf] - -/* - * Convert a struct timeval to a time stamp. - */ -#define TVTOTS(tv, ts) \ - do { \ - (ts)->l_ui = (u_long)(tv)->tv_sec; \ - TVUTOTSF((tv)->tv_usec, (ts)->l_uf); \ - } while(0) - -#define sTVTOTS(tv, ts) \ - do { \ - int isneg = 0; \ - long usec; \ - (ts)->l_ui = (tv)->tv_sec; \ - usec = (tv)->tv_usec; \ - if (((tv)->tv_sec < 0) || ((tv)->tv_usec < 0)) { \ - usec = -usec; \ - (ts)->l_ui = -(ts)->l_ui; \ - isneg = 1; \ - } \ - TVUTOTSF(usec, (ts)->l_uf); \ - if (isneg) { \ - L_NEG((ts)); \ - } \ - } while(0) - -/* - * TV_SHIFT is used to turn the table result into a usec value. To round, - * add in TV_ROUNDBIT before shifting - */ -#define TV_SHIFT 3 -#define TV_ROUNDBIT 0x4 - - -/* - * Convert a time stamp fraction to microseconds. The time stamp - * fraction is assumed to be unsigned. To use this in a program, declare: - */ -extern long tstouslo[]; -extern long tstousmid[]; -extern long tstoushi[]; - -#define TSFTOTVU(tsf, tvu) \ - (tvu) = (tstoushi[((tsf) >> 24) & 0xff] \ - + tstousmid[((tsf) >> 16) & 0xff] \ - + tstouslo[((tsf) >> 9) & 0x7f] \ - + TV_ROUNDBIT) >> TV_SHIFT -/* - * Convert a time stamp to a struct timeval. The time stamp - * has to be positive. - */ -#define TSTOTV(ts, tv) \ - do { \ - (tv)->tv_sec = (ts)->l_ui; \ - TSFTOTVU((ts)->l_uf, (tv)->tv_usec); \ - if ((tv)->tv_usec == 1000000) { \ - (tv)->tv_sec++; \ - (tv)->tv_usec = 0; \ - } \ - } while (0) - -/* - * Convert milliseconds to a time stamp fraction. This shouldn't be - * here, but it is convenient since the guys who use the definition will - * often be including this file anyway. - */ -extern u_long msutotsflo[]; -extern u_long msutotsfhi[]; - -#define MSUTOTSF(msu, tsf) \ - (tsf) = msutotsfhi[((msu) >> 5) & 0x1f] + msutotsflo[(msu) & 0x1f] - -extern char * tvtoa P((const struct timeval *)); -extern char * utvtoa P((const struct timeval *)); diff --git a/usr.sbin/xntpd/include/ntpd.h b/usr.sbin/xntpd/include/ntpd.h deleted file mode 100644 index 53e3a913f2d6..000000000000 --- a/usr.sbin/xntpd/include/ntpd.h +++ /dev/null @@ -1,175 +0,0 @@ -/* - * ntpd.h - Prototypes for xntpd. - */ - -#include "ntp_syslog.h" -#include "ntp_fp.h" -#include "ntp.h" -#include "ntp_malloc.h" - -/* ntp_config.c */ -extern void getstartup P((int, char **)); -extern void getconfig P((int, char **)); - -/* ntp_config.c */ -extern void ctl_clr_stats P((void)); -extern int ctlclrtrap P((struct sockaddr_in *, struct interface *, int)); -extern u_short ctlpeerstatus P((struct peer *)); -extern int ctlsettrap P((struct sockaddr_in *, struct interface *, int, int)); -extern u_short ctlsysstatus P((void)); -extern void init_control P((void)); -extern void process_control P((struct recvbuf *, int)); -extern void report_event P((int, struct peer *)); - -/* ntp_control.c */ -/* - * Structure for translation tables between internal system - * variable indices and text format. - */ -struct ctl_var { - u_short code; - u_short flags; - char *text; -}; -/* - * Flag values - */ -#define CAN_READ 0x01 -#define CAN_WRITE 0x02 - -#define DEF 0x20 -#define PADDING 0x40 -#define EOV 0x80 - -#define RO (CAN_READ) -#define WO (CAN_WRITE) -#define RW (CAN_READ|CAN_WRITE) - -extern char * add_var P((struct ctl_var **, unsigned long, int)); -extern void free_varlist P((struct ctl_var *)); -extern void set_var P((struct ctl_var **, char *, unsigned long, int)); -extern void set_sys_var P((char *, unsigned long, int)); - -/* ntp_intres.c */ -extern void ntp_intres P((void)); - -/* ntp_io.c */ -extern struct interface *findbcastinter P((struct sockaddr_in *)); -extern struct interface *findinterface P((struct sockaddr_in *)); -extern void freerecvbuf P((struct recvbuf *)); -extern struct recvbuf *getrecvbufs P((void)); -extern void init_io P((void)); -extern void input_handler P((l_fp *)); -extern void io_clr_stats P((void)); -extern void io_setbclient P((void)); -extern void io_unsetbclient P((void)); -extern void io_multicast_add P((u_long)); -extern void io_multicast_del P((u_long)); - -extern void sendpkt P((struct sockaddr_in *, struct interface *, int, struct pkt *, int)); -#ifdef HAVE_SIGNALED_IO -extern void wait_for_signal P((void)); -extern void unblock_io_and_alarm P((void)); -extern void block_io_and_alarm P((void)); -#endif - -/* ntp_leap.c */ -extern void init_leap P((void)); -extern void leap_process P((void)); -extern int leap_setleap P((int, int)); -/* - * there seems to be a bug in the IRIX 4 compiler which prevents - * u_char from beeing used in prototyped functions. - * This is also true AIX compiler. - * So give up and define it to be int. WLJ - */ -extern int leap_actual P((int)); - -/* ntp_loopfilter.c */ -extern void init_loopfilter P((void)); -extern int local_clock P((l_fp *, struct peer *)); -extern void adj_frequency P((s_fp)); -extern void adj_host_clock P((void)); -extern void loop_config P((int, l_fp *, int)); -#if defined(PPS) || defined(PPSPPS) || defined(PPSCD) -extern int pps_sample P((l_fp *)); -#endif /* PPS || PPSDEV || PPSCD */ - -/* ntp_monitor.c */ -extern void init_mon P((void)); -extern void mon_start P((int)); -extern void mon_stop P((int)); -extern void monitor P((struct recvbuf *)); - -/* ntp_peer.c */ -extern void init_peer P((void)); -extern struct peer *findexistingpeer P((struct sockaddr_in *, struct peer *)); -extern struct peer *findpeer P((struct sockaddr_in *, struct interface *, int)); -extern struct peer *findpeerbyassoc P((int)); -extern struct peer *newpeer P((struct sockaddr_in *, struct interface *, int, int, int, int, int, u_long)); -extern void peer_all_reset P((void)); -extern void peer_clr_stats P((void)); -extern struct peer *peer_config P((struct sockaddr_in *, struct interface *, int, int, int, int, int, int, u_long)); -extern void peer_reset P((struct peer *)); -extern int peer_unconfig P((struct sockaddr_in *, struct interface *)); -extern void unpeer P((struct peer *)); - -/* ntp_proto.c */ -extern void transmit P((struct peer *)); -extern void receive P((struct recvbuf *)); -extern void peer_clear P((struct peer *)); -extern int process_packet P((struct peer *, struct pkt *, l_fp *, int, int)); -extern void clock_update P((struct peer *)); - -/* - * there seems to be a bug in the IRIX 4 compiler which prevents - * u_char from beeing used in prototyped functions. - * This is also true AIX compiler. - * So give up and define it to be int. WLJ - */ -extern void poll_update P((struct peer *, unsigned int, int)); - -extern void clear P((struct peer *)); -extern void clock_filter P((struct peer *, l_fp *, s_fp, u_fp)); -extern void clock_select P((void)); -extern void clock_combine P((struct peer **, int)); -extern void fast_xmit P((struct recvbuf *, int, int)); -extern void init_proto P((void)); -extern void proto_config P((int, u_long)); -extern void proto_clr_stats P((void)); - -#ifdef REFCLOCK -/* ntp_refclock.c */ -extern int refclock_newpeer P((struct peer *)); -extern void refclock_unpeer P((struct peer *)); -extern void refclock_receive P((struct peer *, l_fp *, s_fp, u_fp, l_fp *, l_fp *, int)); -extern void refclock_leap P((void)); -extern void init_refclock P((void)); -#endif /* REFCLOCK */ - -/* ntp_request.c */ -extern void init_request P((void)); -extern void process_private P((struct recvbuf *, int)); - -/* ntp_restrict.c */ -extern void init_restrict P((void)); -extern int restrictions P((struct sockaddr_in *)); -extern void restrict P((int, struct sockaddr_in *, struct sockaddr_in *, int, int)); - -/* ntp_timer.c */ -extern void init_timer P((void)); -extern void timer P((void)); -extern void timer_clr_stats P((void)); - -/* ntp_unixclock.c */ -extern void init_systime P((void)); - -/* ntp_util.c */ -extern void init_util P((void)); -extern void hourly_stats P((void)); -extern void stats_config P((int, char *)); -extern void record_peer_stats P((struct sockaddr_in *, int, l_fp *, s_fp, u_fp)); -extern void record_loop_stats P((l_fp *, s_fp, int)); -extern void record_clock_stats P((struct sockaddr_in *, char *)); -extern void getauthkeys P((char *)); -extern void rereadkeys P((void)); diff --git a/usr.sbin/xntpd/include/parse.h b/usr.sbin/xntpd/include/parse.h deleted file mode 100644 index 774cf5e29ba9..000000000000 --- a/usr.sbin/xntpd/include/parse.h +++ /dev/null @@ -1,459 +0,0 @@ -/* - * /src/NTP/REPOSITORY/v3/include/parse.h,v 3.21 1994/05/30 20:58:34 kardel Exp - * - * parse.h,v 3.21 1994/05/30 20:58:34 kardel Exp - * - * Copyright (c) 1989,1990,1991,1992,1993,1994 - * Frank Kardel Friedrich-Alexander Universitaet Erlangen-Nuernberg - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#ifndef __PARSE_H__ -#define __PARSE_H__ -#if !(defined(lint) || defined(__GNUC__)) - static char parsehrcsid[]="parse.h,v 3.21 1994/05/30 20:58:34 kardel Exp"; -#endif - -#include "ntp_types.h" - -#include "parse_conf.h" - -/* - * we use the following datastructures in two modes - * either in the NTP itself where we use NTP time stamps at some places - * or in the kernel, where only struct timeval will be used. - */ -#undef PARSEKERNEL -#if defined(KERNEL) || defined(_KERNEL) -#ifndef PARSESTREAM -#define PARSESTREAM -#endif -#endif -#if defined(PARSESTREAM) && defined(STREAM) -#define PARSEKERNEL -#endif -#ifdef PARSEKERNEL -#ifndef _KERNEL -extern caddr_t kmem_alloc P((unsigned int)); -extern caddr_t kmem_free P((caddr_t, unsigned int)); -extern int splx(); -extern int splhigh(); -#define MALLOC(_X_) (char *)kmem_alloc(_X_) -#define FREE(_X_, _Y_) kmem_free((caddr_t)_X_, _Y_) -#else -#include <sys/kmem.h> -#define MALLOC(_X_) (char *)kmem_alloc(_X_, KM_SLEEP) -#define FREE(_X_, _Y_) kmem_free((caddr_t)_X_, _Y_) -#endif -#else -#define MALLOC(_X_) malloc(_X_) -#define FREE(_X_, _Y_) free(_X_) -#endif - -#if defined(PARSESTREAM) && defined(STREAM) -#include "sys/stream.h" -#include "sys/stropts.h" -#ifndef _KERNEL -extern int printf(); -#endif -#else /* STREAM */ -#include <stdio.h> -#include "ntp_syslog.h" -#ifdef DEBUG -extern int debug; -#define DD_PARSE 5 -#define DD_RAWDCF 4 -#define parseprintf(LEVEL, ARGS) if (debug > LEVEL) printf ARGS -#else /* DEBUG */ -#define parseprintf(LEVEL, ARGS) -#endif /* DEBUG */ -#endif /* PARSESTREAM */ - -#if defined(timercmp) && defined(__GNUC__) -#undef timercmp -#define timercmp(tvp, uvp, cmp) \ - ((tvp)->tv_sec cmp (uvp)->tv_sec || \ - ((tvp)->tv_sec == (uvp)->tv_sec && (tvp)->tv_usec cmp (uvp)->tv_usec)) -#endif - -#ifndef TIMES10 -#define TIMES10(_X_) (((_X_) << 3) + ((_X_) << 1)) -#endif - -/* - * state flags - */ -#define PARSEB_POWERUP 0x00000001 /* no synchronisation */ -#define PARSEB_NOSYNC 0x00000002 /* timecode currently not confirmed */ - -/* - * time zone information - */ -#define PARSEB_ANNOUNCE 0x00000010 /* switch time zone warning (DST switch) */ -#define PARSEB_DST 0x00000020 /* DST in effect */ -#define PARSEB_UTC 0x00000040 /* UTC time */ - -/* - * leap information - */ -#define PARSEB_LEAPDEL 0x00000100 /* LEAP deletion warning */ -#define PARSEB_LEAPADD 0x00000200 /* LEAP addition warning */ -#define PARSEB_LEAPS 0x00000300 /* LEAP warnings */ -#define PARSEB_LEAPSECOND 0x00000400 /* actual leap second */ -/* - * optional status information - */ -#define PARSEB_ALTERNATE 0x00001000 /* alternate antenna used */ -#define PARSEB_POSITION 0x00002000 /* position available */ - -/* - * feature information - */ -#define PARSEB_S_LEAP 0x00010000 /* supports LEAP */ -#define PARSEB_S_ANTENNA 0x00020000 /* supports antenna information */ -#define PARSEB_S_PPS 0x00040000 /* supports PPS time stamping */ -#define PARSEB_S_POSITION 0x00080000 /* supports position information (GPS) */ - -/* - * time stamp availality - */ -#define PARSEB_TIMECODE 0x10000000 /* valid time code sample */ -#define PARSEB_PPS 0x20000000 /* valid PPS sample */ - -#define PARSE_TCINFO (PARSEB_ANNOUNCE|PARSEB_POWERUP|PARSEB_NOSYNC|PARSEB_DST|\ - PARSEB_UTC|PARSEB_LEAPS|PARSEB_ALTERNATE|PARSEB_S_LEAP|\ - PARSEB_S_LOCATION|PARSEB_TIMECODE) - -#define PARSE_POWERUP(x) ((x) & PARSEB_POWERUP) -#define PARSE_NOSYNC(x) (((x) & (PARSEB_POWERUP|PARSEB_NOSYNC)) == PARSEB_NOSYNC) -#define PARSE_SYNC(x) (((x) & (PARSEB_POWERUP|PARSEB_NOSYNC)) == 0) -#define PARSE_ANNOUNCE(x) ((x) & PARSEB_ANNOUNCE) -#define PARSE_DST(x) ((x) & PARSEB_DST) -#define PARSE_UTC(x) ((x) & PARSEB_UTC) -#define PARSE_LEAPADD(x) (PARSE_SYNC(x) && (((x) & PARSEB_LEAPS) == PARSEB_LEAPADD)) -#define PARSE_LEAPDEL(x) (PARSE_SYNC(x) && (((x) & PARSEB_LEAPS) == PARSEB_LEAPDEL)) -#define PARSE_ALTERNATE(x) ((x) & PARSEB_ALTERNATE) -#define PARSE_LEAPSECOND(x) (PARSE_SYNC(x) && ((x) & PARSEB_LEAP_SECOND)) - -#define PARSE_S_LEAP(x) ((x) & PARSEB_S_LEAP) -#define PARSE_S_ANTENNA(x) ((x) & PARSEB_S_ANTENNA) -#define PARSE_S_PPS(x) ((x) & PARSEB_S_PPS) -#define PARSE_S_POSITION(x) ((x) & PARSEB_S_POSITION) - -#define PARSE_TIMECODE(x) ((x) & PARSEB_TIMECODE) -#define PARSE_PPS(x) ((x) & PARSEB_PPS) -#define PARSE_POSITION(x) ((x) & PARSEB_POSITION) - -/* - * operation flags - some are also fudge flags - */ -#define PARSE_STAT_FLAGS 0x03 /* interpreted by io module */ -#define PARSE_STAT_FILTER 0x01 /* filter incoming data */ -#define PARSE_STAT_AVG 0x02 /* 1:median average / 0: median point */ -#define PARSE_LEAP_DELETE 0x04 /* delete leap */ -#define PARSE_STATISTICS 0x08 /* enable statistics */ -#define PARSE_FIXED_FMT 0x10 /* fixed format */ -#define PARSE_PPSCLOCK 0x20 /* try to get PPS time stamp via ppsclock ioctl */ - -typedef union timestamp -{ - struct timeval tv; /* timeval - usually kernel view */ - l_fp fp; /* fixed point - xntp view */ -} timestamp_t; - -/* - * standard time stamp structure - */ -struct parsetime -{ - u_long parse_status; /* data status - CVT_OK, CVT_NONE, CVT_FAIL ... */ - timestamp_t parse_time; /* PARSE timestamp */ - timestamp_t parse_stime; /* telegram sample timestamp */ - timestamp_t parse_ptime; /* PPS time stamp */ - long parse_usecerror; /* sampled/filtered usec error */ - long parse_usecdisp; /* sampled usecdispersion */ - u_long parse_state; /* current receiver state */ - unsigned short parse_format; /* format code */ -}; - -typedef struct parsetime parsetime_t; - -/*---------- STREAMS interface ----------*/ - -#ifdef STREAM -/* - * ioctls - */ -#define PARSEIOC_ENABLE (('D'<<8) + 'E') -#define PARSEIOC_DISABLE (('D'<<8) + 'D') -#define PARSEIOC_SETSTAT (('D'<<8) + 'S') -#define PARSEIOC_GETSTAT (('D'<<8) + 'G') -#define PARSEIOC_SETFMT (('D'<<8) + 'f') -#define PARSEIOC_GETFMT (('D'<<8) + 'F') -#define PARSEIOC_SETCS (('D'<<8) + 'C') -#define PARSEIOC_TIMECODE (('D'<<8) + 'T') - -#endif - -/*------ IO handling flags (sorry) ------*/ - -#define PARSE_IO_CSIZE 0x00000003 -#define PARSE_IO_CS5 0x00000000 -#define PARSE_IO_CS6 0x00000001 -#define PARSE_IO_CS7 0x00000002 -#define PARSE_IO_CS8 0x00000003 - -/* - * sizes - */ -#define PARSE_TCMAX 128 - -/* - * ioctl structure - */ -union parsectl -{ - struct parsestatus - { - u_long flags; /* new/old flags */ - } parsestatus; - - struct parsegettc - { - u_long parse_state; /* last state */ - u_long parse_badformat; /* number of bad packets since last query */ - unsigned short parse_format;/* last decoded format */ - unsigned short parse_count; /* count of valid time code bytes */ - char parse_buffer[PARSE_TCMAX+1]; /* timecode buffer */ - } parsegettc; - - struct parseformat - { - unsigned short parse_format;/* number of examined format */ - unsigned short parse_count; /* count of valid string bytes */ - char parse_buffer[PARSE_TCMAX+1]; /* format code string */ - } parseformat; - - struct parsesetcs - { - u_long parse_cs; /* character size (needed for stripping) */ - } parsesetcs; -}; - -typedef union parsectl parsectl_t; - -/*------ for conversion routines --------*/ - -#define PARSE_DELTA 16 - -struct parse /* parse module local data */ -{ - int parse_flags; /* operation and current status flags */ - - int parse_ioflags; /* io handling flags (5-8 Bit control currently) */ - int parse_syncflags; /* possible sync events (START/END/character) */ - /* - * RS232 input parser information - */ - unsigned char parse_startsym[32]; /* possible start packet values */ - unsigned char parse_endsym[32]; /* possible end packet values */ - unsigned char parse_syncsym[32]; /* sync characters */ - struct timeval parse_timeout; /* max gap between characters (us) */ - - /* - * PPS 'input' buffer - */ - struct timeval parse_lastone; /* time stamp of last PPS 1 transition */ - struct timeval parse_lastzero; /* time stamp of last PPS 0 transition */ - - /* - * character input buffer - */ - timestamp_t parse_lastchar; /* time stamp of last received character */ - - /* - * private data - fixed format only - */ - unsigned short parse_plen; /* length of private data */ - void *parse_pdata; /* private data pointer */ - - /* - * time code input buffer (from RS232 or PPS) - */ - unsigned short parse_index; /* current buffer index */ - char *parse_data; /* data buffer */ - unsigned short parse_dsize; /* size of data buffer */ - unsigned short parse_lformat; /* last format used */ - u_long parse_lstate; /* last state code */ - char *parse_ldata; /* last data buffer */ - unsigned short parse_ldsize; /* last data buffer length */ - u_long parse_badformat; /* number of unparsable pakets */ - - /* - * time stamp filtering - */ - long parse_delta[PARSE_DELTA]; /* delta buffer */ - int parse_dindex; - - parsetime_t parse_dtime; /* external data prototype */ -}; - -typedef struct parse parse_t; - -struct clocktime /* clock time broken up from time code */ -{ - long day; - long month; - long year; - long hour; - long minute; - long second; - long usecond; - long utcoffset; /* in seconds */ - time_t utctime; /* the actual time - alternative to date/time */ - long flags; /* current clock status */ -}; - -typedef struct clocktime clocktime_t; - -/* - * clock formats specify routines to be called to - * convert the buffer into a struct clock. - * functions are called - * fn(buffer, data, clock) -> CVT_NONE, CVT_FAIL, CVT_OK - * - * the private data pointer can be used to - * distingush between different formats of a common - * base type - */ -#define F_START 0x00000001 /* start packet delimiter */ -#define F_END 0x00000002 /* end packet delimiter */ -#define SYNC_TIMEOUT 0x00000004 /* packet restart after timeout */ -#define SYNC_START 0x00000008 /* packet start is sync event */ -#define SYNC_END 0x00000010 /* packet end is sync event */ -#define SYNC_CHAR 0x00000020 /* special character is sync event */ -#define SYNC_ONE 0x00000040 /* PPS synchronize on 'ONE' transition */ -#define SYNC_ZERO 0x00000080 /* PPS synchronize on 'ZERO' transition */ -#define SYNC_SYNTHESIZE 0x00000100 /* generate intermediate time stamps */ -#define CVT_FIXEDONLY 0x00010000 /* convert only in fixed configuration */ - -/* - * parser related return/error codes - */ -#define CVT_MASK 0x0000000F /* conversion exit code */ -#define CVT_NONE 0x00000001 /* format not applicable */ -#define CVT_FAIL 0x00000002 /* conversion failed - error code returned */ -#define CVT_OK 0x00000004 /* conversion succeeded */ -#define CVT_SKIP 0x00000008 /* conversion succeeded */ -#define CVT_BADFMT 0x00000010 /* general format error - (unparsable) */ -#define CVT_BADDATE 0x00000020 /* date field incorrect */ -#define CVT_BADTIME 0x00000040 /* time field incorrect */ - -struct clockformat -{ - u_long (*input)(); /* special input protocol - implies fixed format */ - u_long (*convert)(); /* conversion routine */ - void (*syncevt)(); /* routine for handling RS232 sync events (time stamps) */ - u_long (*syncpps)(); /* PPS input routine */ - u_long (*synth)(); /* time code synthesizer */ - void *data; /* local parameters */ - char *name; /* clock format name */ - unsigned short length; /* maximum length of data packet */ - u_long flags; /* valid start symbols etc. */ - unsigned short plen; /* length of private data - implies fixed format */ - struct timeval timeout; /* buffer restart after timeout (us) */ - unsigned char startsym; /* start symbol */ - unsigned char endsym; /* end symbol */ - unsigned char syncsym; /* sync symbol */ -}; - -typedef struct clockformat clockformat_t; - -/* - * parse interface - */ -extern int parse_ioinit P((parse_t *)); -extern void parse_ioend P((parse_t *)); -extern int parse_ioread P((parse_t *, unsigned char, timestamp_t *)); -extern int parse_iopps P((parse_t *, int, timestamp_t *)); -extern void parse_iodone P((parse_t *)); - -extern int parse_getstat P((parsectl_t *, parse_t *)); -extern int parse_setstat P((parsectl_t *, parse_t *)); -extern int parse_timecode P((parsectl_t *, parse_t *)); -extern int parse_getfmt P((parsectl_t *, parse_t *)); -extern int parse_setfmt P((parsectl_t *, parse_t *)); -extern int parse_setcs P((parsectl_t *, parse_t *)); - -extern int Strok P((char *, char *)); -extern int Stoi P((char *, long *, int)); - -extern time_t parse_to_unixtime P((clocktime_t *, u_long *)); -extern u_long updatetimeinfo P((parse_t *, time_t, u_long, u_long)); -extern void syn_simple P((parse_t *, timestamp_t *, struct format *, u_long)); -extern u_long pps_simple P((parse_t *, int, timestamp_t *)); -#endif - -/* - * History: - * - * parse.h,v - * Revision 3.21 1994/05/30 20:58:34 kardel - * fix prototypes - * - * Revision 3.20 1994/05/30 10:19:44 kardel - * LONG cleanup - * - * Revision 3.19 1994/05/15 11:30:33 kardel - * documented flag4 as statistics enable flag - * - * Revision 3.18 1994/05/12 12:40:34 kardel - * shut up gcc about broken Sun/BSD code - * - * Revision 3.17 1994/03/03 09:27:20 kardel - * rcs ids fixed - * - * Revision 3.13 1994/01/25 19:04:21 kardel - * 94/01/23 reconcilation - * - * Revision 3.12 1994/01/23 17:23:05 kardel - * 1994 reconcilation - * - * Revision 3.11 1993/11/11 11:20:18 kardel - * declaration fixes - * - * Revision 3.10 1993/11/01 19:59:48 kardel - * parse Solaris support (initial version) - * - * Revision 3.9 1993/10/06 00:14:57 kardel - * include fixes - * - * Revision 3.8 1993/10/05 23:15:41 kardel - * more STREAM protection - * - * Revision 3.7 1993/10/05 22:56:10 kardel - * STREAM must be defined for PARSESTREAMS - * - * Revision 3.6 1993/10/03 19:10:28 kardel - * restructured I/O handling - * - * Revision 3.5 1993/09/26 23:41:13 kardel - * new parse driver logic - * - * Revision 3.4 1993/09/01 21:46:31 kardel - * conditional cleanup - * - * Revision 3.3 1993/08/27 00:29:29 kardel - * compilation cleanup - * - * Revision 3.2 1993/07/09 11:37:05 kardel - * Initial restructured version + GPS support - * - * Revision 3.1 1993/07/06 09:59:12 kardel - * DCF77 driver goes generic... - * - */ diff --git a/usr.sbin/xntpd/include/parse_conf.h b/usr.sbin/xntpd/include/parse_conf.h deleted file mode 100644 index 3c512aac8bb6..000000000000 --- a/usr.sbin/xntpd/include/parse_conf.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * /src/NTP/REPOSITORY/v3/include/parse_conf.h,v 3.6 1994/05/30 10:19:49 kardel Exp - * - * parse_conf.h,v 3.6 1994/05/30 10:19:49 kardel Exp - * - * Copyright (c) 1993,1994 - * Frank Kardel Friedrich-Alexander Universitaet Erlangen-Nuernberg - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#ifndef __PARSE_CONF_H__ -#define __PARSE_CONF_H__ -#if !(defined(lint) || defined(__GNUC__)) - static char dcfhrcsid[]="parse_conf.h,v 3.6 1994/05/30 10:19:49 kardel Exp FAU"; -#endif - -/* - * field location structure (Meinberg clocks/simple format) - */ -#define O_DAY 0 -#define O_MONTH 1 -#define O_YEAR 2 -#define O_HOUR 3 -#define O_MIN 4 -#define O_SEC 5 -#define O_WDAY 6 -#define O_FLAGS 7 -#define O_ZONE 8 -#define O_UTCHOFFSET 9 -#define O_UTCMOFFSET 10 -#define O_UTCSOFFSET 11 -#define O_COUNT (O_UTCSOFFSET+1) - -#define MBG_EXTENDED 0x00000001 - -/* - * see below for field offsets - */ - -struct format -{ - struct foff - { - char offset; /* offset into buffer */ - char length; /* length of field */ - } field_offsets[O_COUNT]; - char *fixed_string; /* string with must be chars (blanks = wildcards) */ - u_long flags; -}; -#endif diff --git a/usr.sbin/xntpd/include/sys/bsd_audioirig.h b/usr.sbin/xntpd/include/sys/bsd_audioirig.h deleted file mode 100644 index 012028285664..000000000000 --- a/usr.sbin/xntpd/include/sys/bsd_audioirig.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * $FreeBSD$ - */ - -#ifndef _BSD_AUDIOIRIG_H_ -#define _BSD_AUDIOIRIG_H_ - -#include <sys/time.h> - -/********************************************************************/ -/* user interface */ - -/* - * irig ioctls - */ -#if defined(__STDC__) || !(defined(ibm032) && !defined(__GNUC)) -#define AUDIO_IRIG_OPEN _IO('A', 50) -#define AUDIO_IRIG_CLOSE _IO('A', 51) -#define AUDIO_IRIG_SETFORMAT _IOWR('A', 52, int) -#else -#define AUDIO_IRIG_OPEN _IO(A, 50) -#define AUDIO_IRIG_CLOSE _IO(A, 51) -#define AUDIO_IRIG_SETFORMAT _IOWR(A, 52, int) -#endif - -/* - * irig error codes - */ -#define AUDIO_IRIG_BADSIGNAL 0x01 -#define AUDIO_IRIG_BADDATA 0x02 -#define AUDIO_IRIG_BADSYNC 0x04 -#define AUDIO_IRIG_BADCLOCK 0x08 -#define AUDIO_IRIG_OLDDATA 0x10 - -/********************************************************************/ - -/* - * auib definitions - */ -#define AUIB_SIZE (0x0040) -#define AUIB_INC (0x0008) -#define AUIB_MOD(k) ((k) & 0x0038) -#define AUIB_INIT(ib) ((ib)->ib_head = (ib)->ib_tail = (ib)->ib_lock = \ - (ib)->phase = (ib)->shi = (ib)->slo = (ib)->high = \ - (ib)->level0 = (ib)->level1 = \ - (ib)->shift[0] = (ib)->shift[1] = (ib)->shift[2] = \ - (ib)->shift[3] = (ib)->sdata[0] = (ib)->sdata[1] = \ - (ib)->sdata[2] = (ib)->sdata[3] = (ib)->err = 0) -#define AUIB_EMPTY(ib) ((ib)->ib_head == (ib)->ib_tail) -#define AUIB_LEN(ib) (AUIB_MOD((ib)->ib_tail - (ib)->ib_head)) -#define AUIB_LEFT(ib) (AUIB_MOD((ib)->ib_head - (ib)->ib_tail - 1)) -#define IRIGDELAY 3 -#define IRIGLEVEL 1355 - -#ifndef LOCORE -/* - * irig_time holds IRIG data for one second - */ -struct irig_time { - struct timeval stamp; /* timestamp */ - u_char bits[13]; /* 100 irig data bits */ - u_char status; /* status byte */ - char time[14]; /* time string */ -}; - -/* - * auib's are used for IRIG data communication between the trap - * handler and the software interrupt. - */ -struct auib { - /* driver variables */ - u_short active; /* 0=inactive, else=active */ - u_short format; /* time output format */ - struct irig_time timestr; /* time structure */ - char buffer[14]; /* output formation buffer */ - - /* hardware interrupt variables */ - struct timeval tv1,tv2,tv3; /* time stamps (median filter) */ - int level0,level1; /* lo/hi input levels */ - int level; /* decision level */ - int high; /* recent largest sample */ - int sl0,sl1; /* recent sample levels */ - int lasts; /* last sample value */ - u_short scount; /* sample count */ - u_long eacc; /* 10-bit element accumulator */ - u_long ebit; /* current bit in element */ - u_char r_level,mmr1; /* recording level 0-255 */ - int shi,slo,phase; /* AGC variables */ - u_long err; /* error status bits */ - int ecount; /* count of elements this second */ - long shift[4]; /* shift register of pos ident */ - long sdata[4]; /* shift register of symbols */ - - int ib_head; /* queue head */ - int ib_tail; /* queue tail */ - u_short ib_lock; /* queue head lock */ - u_long ib_data[AUIB_SIZE]; /* data buffer */ -}; -#endif - -#endif /* _BSD_AUDIOIRIG_H_ */ diff --git a/usr.sbin/xntpd/include/sys/chudefs.h b/usr.sbin/xntpd/include/sys/chudefs.h deleted file mode 100644 index f5549f58b828..000000000000 --- a/usr.sbin/xntpd/include/sys/chudefs.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Definitions for the CHU line discipline v2.0 - */ - -/* - * The CHU time code consists of 10 BCD digits and is repeated - * twice for a total of 10 characters. A time is taken after - * the arrival of each character. The following structure is - * used to return this stuff. - */ -#define NCHUCHARS (10) - -struct chucode { - u_char codechars[NCHUCHARS]; /* code characters */ - u_char ncodechars; /* number of code characters */ - u_char chutype; /* packet type */ - struct timeval codetimes[NCHUCHARS]; /* arrival times */ -}; - -#define CHU_TIME 0 /* second half is equal to first half */ -#define CHU_YEAR 1 /* second half is one's complement */ - diff --git a/usr.sbin/xntpd/include/sys/clkdefs.h b/usr.sbin/xntpd/include/sys/clkdefs.h deleted file mode 100644 index afbc77a8f1ac..000000000000 --- a/usr.sbin/xntpd/include/sys/clkdefs.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Defines for the "clk" timestamping STREAMS module - */ - -#if defined(sun) -#include <sys/ioccom.h> -#else -#include <sys/ioctl.h> -#endif - -/* - * First, we need to define the maximum size of the set of - * characters to timestamp. 32 is MORE than enough. - */ - -#define CLK_MAXSTRSIZE 32 -struct clk_tstamp_charset { /* XXX to use _IOW not _IOWN */ - char val[CLK_MAXSTRSIZE]; -}; - -/* - * ioctl(fd, CLK_SETSTR, (char*)c ); - * - * will tell the driver that any char in the null-terminated - * string c should be timestamped. It is possible, though - * unlikely that this ioctl number could collide with an - * existing one on your system. If so, change the 'K' - * to some other letter. However, once you've compiled - * the kernel with this include file, you should NOT - * change this file. - */ - -#if defined(__STDC__) /* XXX avoid __STDC__=0 on SOLARIS */ -#define CLK_SETSTR _IOW('K', 01, struct clk_tstamp_charset) -#else -#define CLK_SETSTR _IOW(K, 01, struct clk_tstamp_charset) -#endif - diff --git a/usr.sbin/xntpd/include/sys/parsestreams.h b/usr.sbin/xntpd/include/sys/parsestreams.h deleted file mode 100644 index ac66f42845dc..000000000000 --- a/usr.sbin/xntpd/include/sys/parsestreams.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * /src/NTP/REPOSITORY/v3/include/sys/parsestreams.h,v 3.12 1994/06/01 08:21:08 kardel Exp - * - * parsestreams.h,v 3.12 1994/06/01 08:21:08 kardel Exp - * - * Copyright (c) 1989,1990,1991,1992,1993,1994 - * Frank Kardel Friedrich-Alexander Universitaet Erlangen-Nuernberg - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#if !(defined(lint) || defined(__GNUC__)) - static char parse77hrcsid[]="parsestreams.h,v 3.12 1994/06/01 08:21:08 kardel Exp"; -#endif - -#undef PARSEKERNEL -#if defined(KERNEL) || defined(_KERNEL) -#ifndef PARSESTREAM -#define PARSESTREAM -#endif -#endif -#if defined(PARSESTREAM) && defined(STREAM) -#define PARSEKERNEL -#include <sys/ppsclock.h> - -struct parsestream /* parse module local data */ -{ - queue_t *parse_queue; /* read stream for this channel */ - queue_t *parse_dqueue; /* driver queue entry (PPS support) */ - unsigned long parse_status; /* operation flags */ - void *parse_data; /* local data space (PPS support) */ - parse_t parse_io; /* io structure */ - struct ppsclockev parse_ppsclockev; /* copy of last pps event */ -}; - -typedef struct parsestream parsestream_t; - -#define PARSE_ENABLE 0x0001 - -/*--------------- debugging support ---------------------------------*/ - -#ifdef DEBUG_PARSE - -extern int parsedebug; - -#define DD_OPEN 0x00000001 -#define DD_CLOSE 0x00000002 -#define DD_RPUT 0x00000004 -#define DD_WPUT 0x00000008 -#define DD_RSVC 0x00000010 -#define DD_PARSE 0x00000020 -#define DD_INSTALL 0x00000040 -#define DD_ISR 0x00000080 -#define DD_RAWDCF 0x00000100 - -#define parseprintf(X, Y) if ((X) & parsedebug) printf Y - -#else - -#define parseprintf(X, Y) - -#endif -#endif diff --git a/usr.sbin/xntpd/include/sys/ppsclock.h b/usr.sbin/xntpd/include/sys/ppsclock.h deleted file mode 100644 index edf28aa2e1e8..000000000000 --- a/usr.sbin/xntpd/include/sys/ppsclock.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66. - * - * Copyright (c) 1992 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Lawrence Berkeley Laboratory. - * 4. The name of the University may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#define PPSCLOCKSTR "ppsclock" - -struct ppsclockev { - struct timeval tv; - u_int serial; -}; - -#if defined(__STDC__) || defined(SYS_HPUX) -#ifdef _IOR -#define CIOGETEV _IOR('C', 0, struct ppsclockev) /* get last pps event */ -#else /* XXX SOLARIS is different */ -#define CIO ('C'<<8) -#define CIOGETEV (CIO|0) /* get last pps event */ -#endif /* _IOR */ -#else /* __STDC__ */ -#ifdef _IOR -#define CIOGETEV _IOR(C, 0, struct ppsclockev) /* get last pps event */ -#else /* XXX SOLARIS is different */ -#define CIO ('C'<<8) -#define CIOGETEV (CIO|0) /* get last pps event */ -#endif /* _IOR */ -#endif /* __STDC__ */ diff --git a/usr.sbin/xntpd/include/sys/timex.h b/usr.sbin/xntpd/include/sys/timex.h deleted file mode 100644 index bc2d6349f46b..000000000000 --- a/usr.sbin/xntpd/include/sys/timex.h +++ /dev/null @@ -1,290 +0,0 @@ -/****************************************************************************** - * * - * Copyright (c) David L. Mills 1993, 1994 * - * * - * Permission to use, copy, modify, and distribute this software and its * - * documentation for any purpose and without fee is hereby granted, provided * - * that the above copyright notice appears in all copies and that both the * - * copyright notice and this permission notice appear in supporting * - * documentation, and that the name University of Delaware not be used in * - * advertising or publicity pertaining to distribution of the software * - * without specific, written prior permission. The University of Delaware * - * makes no representations about the suitability this software for any * - * purpose. It is provided "as is" without express or implied warranty. * - * * - ******************************************************************************/ - -/* - * Modification history timex.h - * - * 19 Mar 94 David L. Mills - * Moved defines from kernel routines to header file and added new - * defines for PPS phase-lock loop. - * - * 20 Feb 94 David L. Mills - * Revised status codes and structures for external clock and PPS - * signal discipline. - * - * 28 Nov 93 David L. Mills - * Adjusted parameters to improve stability and increase poll - * interval. - * - * 17 Sep 93 David L. Mills - * Created file - */ -/* - * This header file defines the Network Time Protocol (NTP) interfaces - * for user and daemon application programs. These are implemented using - * private syscalls and data structures and require specific kernel - * support. - * - * NAME - * ntp_gettime - NTP user application interface - * - * SYNOPSIS - * #include <sys/timex.h> - * - * int syscall(SYS_ntp_gettime, tptr) - * - * int SYS_ntp_gettime defined in syscall.h header file - * struct ntptimeval *tptr pointer to ntptimeval structure - * - * NAME - * ntp_adjtime - NTP daemon application interface - * - * SYNOPSIS - * #include <sys/timex.h> - * - * int syscall(SYS_ntp_adjtime, mode, tptr) - * - * int SYS_ntp_adjtime defined in syscall.h header file - * struct timex *tptr pointer to timex structure - * - */ -#ifndef _SYS_TIMEX_H_ -#define _SYS_TIMEX_H_ 1 - -#ifndef MSDOS /* Microsoft specific */ -#include <sys/syscall.h> -#endif /* MSDOS */ - -/* - * The following defines establish the engineering parameters of the - * phase-lock loop (PLL) model used in the kernel implementation. These - * parameters have been carefully chosen by analysis for good stability - * and wide dynamic range. - * - * The hz variable is defined in the kernel build environment. It - * establishes the timer interrupt frequency, 100 Hz for the SunOS - * kernel, 256 Hz for the Ultrix kernel and 1024 Hz for the OSF/1 - * kernel. SHIFT_HZ expresses the same value as the nearest power of two - * in order to avoid hardware multiply operations. - * - * SHIFT_KG and SHIFT_KF establish the damping of the PLL and are chosen - * for a slightly underdamped convergence characteristic. - * - * MAXTC establishes the maximum time constant of the PLL. With the - * SHIFT_KG and SHIFT_KF values given and a time constant range from - * zero to MAXTC, the PLL will converge in 15 minutes to 16 hours, - * respectively. - */ -#define SHIFT_HZ 7 /* log2(hz) */ -#define SHIFT_KG 6 /* phase factor (shift) */ -#define SHIFT_KF 16 /* frequency factor (shift) */ -#define MAXTC 6 /* maximum time constant (shift) */ - -/* - * The following defines establish the scaling of the various variables - * used by the PLL. They are chosen to allow the greatest precision - * possible without overflow of a 32-bit word. - * - * SHIFT_SCALE defines the scaling (shift) of the time_phase variable, - * which serves as a an extension to the low-order bits of the system - * clock variable time.tv_usec. - * - * SHIFT_UPDATE defines the scaling (shift) of the time_offset variable, - * which represents the current time offset with respect to standard - * time. - * - * SHIFT_USEC defines the scaling (shift) of the time_freq and - * time_tolerance variables, which represent the current frequency - * offset and maximum frequency tolerance. - * - * FINEUSEC is 1 us in SHIFT_UPDATE units of the time_phase variable. - */ -#define SHIFT_SCALE 23 /* phase scale (shift) */ -#define SHIFT_UPDATE (SHIFT_KG + MAXTC) /* time offset scale (shift) */ -#define SHIFT_USEC 16 /* frequency offset scale (shift) */ -#define FINEUSEC (1L << SHIFT_SCALE) /* 1 us in phase units */ - -/* - * The following defines establish the performance envelope of the PLL. - * They insure it operates within predefined limits, in order to satisfy - * correctness assertions. An excursion which exceeds these bounds is - * clamped to the bound and operation proceeds accordingly. In practice, - * this can occur only if something has failed or is operating out of - * tolerance, but otherwise the PLL continues to operate in a stable - * mode. - * - * MAXPHASE must be set greater than or equal to CLOCK.MAX (128 ms), as - * defined in the NTP specification. CLOCK.MAX establishes the maximum - * time offset allowed before the system time is reset, rather than - * incrementally adjusted. Here, the maximum offset is clamped to - * MAXPHASE only in order to prevent overflow errors due to defective - * protocol implementations. - * - * MAXFREQ is the maximum frequency tolerance of the CPU clock - * oscillator plus the maximum slew rate allowed by the protocol. It - * should be set to at least the frequency tolerance of the oscillator - * plus 100 ppm for vernier frequency adjustments. If the kernel - * PPS discipline code is configured (PPS_SYNC), the oscillator time and - * frequency are disciplined to an external source, presumably with - * negligible time and frequency error relative to UTC, and MAXFREQ can - * be reduced. - * - * MAXTIME is the maximum jitter tolerance of the PPS signal if the - * kernel PPS discipline code is configured (PPS_SYNC). - * - * MINSEC and MAXSEC define the lower and upper bounds on the interval - * between protocol updates. - */ -#define MAXPHASE 128000L /* max phase error (us) */ -#ifdef PPS_SYNC -#define MAXFREQ (100L << SHIFT_USEC) /* max freq error (100 ppm) */ -#define MAXTIME (200L << PPS_AVG) /* max PPS error (jitter) (200 us) */ -#else -#define MAXFREQ (200L << SHIFT_USEC) /* max freq error (200 ppm) */ -#endif /* PPS_SYNC */ -#define MINSEC 16L /* min interval between updates (s) */ -#define MAXSEC 1200L /* max interval between updates (s) */ - -#ifdef PPS_SYNC -/* - * The following defines are used only if a pulse-per-second (PPS) - * signal is available and connected via a modem control lead, such as - * produced by the optional ppsclock feature incorporated in the Sun - * asynch driver. They establish the design parameters of the frequency- - * lock loop used to discipline the CPU clock oscillator to the PPS - * signal. - * - * PPS_AVG is the averaging factor for the frequency loop, as well as - * the time and frequency dispersion. - * - * PPS_SHIFT and PPS_SHIFTMAX specify the minimum and maximum - * calibration intervals, respectively, in seconds as a power of two. - * - * PPS_VALID is the maximum interval before the PPS signal is considered - * invalid and protocol updates used directly instead. - * - * MAXGLITCH is the maximum interval before a time offset of more than - * MAXTIME is believed. - */ -#define PPS_AVG 2 /* pps averaging constant (shift) */ -#define PPS_SHIFT 2 /* min interval duration (s) (shift) */ -#define PPS_SHIFTMAX 8 /* max interval duration (s) (shift) */ -#define PPS_VALID 120 /* pps signal watchdog max (s) */ -#define MAXGLITCH 30 /* pps signal glitch max (s) */ -#endif /* PPS_SYNC */ - -/* - * The following defines and structures define the user interface for - * the ntp_gettime() and ntp_adjtime() system calls. - * - * Control mode codes (timex.modes) - */ -#define MOD_OFFSET 0x0001 /* set time offset */ -#define MOD_FREQUENCY 0x0002 /* set frequency offset */ -#define MOD_MAXERROR 0x0004 /* set maximum time error */ -#define MOD_ESTERROR 0x0008 /* set estimated time error */ -#define MOD_STATUS 0x0010 /* set clock status bits */ -#define MOD_TIMECONST 0x0020 /* set pll time constant */ -#define MOD_CLKB 0x4000 /* set clock B */ -#define MOD_CLKA 0x8000 /* set clock A */ - -/* - * Status codes (timex.status) - */ -#define STA_PLL 0x0001 /* enable PLL updates (rw) */ -#define STA_PPSFREQ 0x0002 /* enable PPS freq discipline (rw) */ -#define STA_PPSTIME 0x0004 /* enable PPS time discipline (rw) */ - -#define STA_INS 0x0010 /* insert leap (rw) */ -#define STA_DEL 0x0020 /* delete leap (rw) */ -#define STA_UNSYNC 0x0040 /* clock unsynchronized (rw) */ - -#define STA_PPSSIGNAL 0x0100 /* PPS signal present (ro) */ -#define STA_PPSJITTER 0x0200 /* PPS signal jitter exceeded (ro) */ -#define STA_PPSWANDER 0x0400 /* PPS signal wander exceeded (ro) */ -#define STA_PPSERROR 0x0800 /* PPS signal calibration error (ro) */ - -#define STA_CLOCKERR 0x1000 /* clock hardware fault (ro) */ - -#define STA_RONLY (STA_PPSSIGNAL | STA_PPSJITTER | STA_PPSWANDER | \ - STA_PPSERROR | STA_CLOCKERR) /* read-only bits */ - -/* - * Clock states (time_state) - */ -#define TIME_OK 0 /* no leap second warning */ -#define TIME_INS 1 /* insert leap second warning */ -#define TIME_DEL 2 /* delete leap second warning */ -#define TIME_OOP 3 /* leap second in progress */ -#define TIME_WAIT 4 /* leap second has occured */ -#define TIME_ERROR 5 /* clock not synchronized */ - -/* - * NTP user interface (ntp_gettime()) - used to read kernel clock values - * - * Note: maximum error = NTP synch distance = dispersion + delay / 2; - * estimated error = NTP dispersion. - */ -struct ntptimeval { - struct timeval time; /* current time (ro) */ - long maxerror; /* maximum error (us) (ro) */ - long esterror; /* estimated error (us) (ro) */ -}; - -/* - * NTP daemon interface - (ntp_adjtime()) used to discipline CPU clock - * oscillator - */ -struct timex { - unsigned int modes; /* clock mode bits (wo) */ - long offset; /* time offset (us) (rw) */ - long freq; /* frequency offset (scaled ppm) (rw) */ - long maxerror; /* maximum error (us) (rw) */ - long esterror; /* estimated error (us) (rw) */ - int status; /* clock status bits (rw) */ - long constant; /* pll time constant (rw) */ - long precision; /* clock precision (us) (ro) */ - long tolerance; /* clock frequency tolerance (scaled - * ppm) (ro) */ - /* - * The following read-only structure members are implemented - * only if the PPS signal discipline is configured in the - * kernel. - */ - long ppsfreq; /* pps frequency (scaled ppm) (ro) */ - long jitter; /* pps jitter (us) (ro) */ - int shift; /* interval duration (s) (shift) (ro) */ - long stabil; /* pps stability (scaled ppm) (ro) */ - long jitcnt; /* jitter limit exceeded (ro) */ - long calcnt; /* calibration intervals (ro) */ - long errcnt; /* calibration errors (ro) */ - long stbcnt; /* stability limit exceeded (ro) */ - -}; -#ifdef __FreeBSD__ - -#ifndef KERNEL -#include <sys/cdefs.h> - -__BEGIN_DECLS -extern int ntp_gettime __P((struct ntptimeval *)); -extern int ntp_adjtime __P((struct timex *)); -__END_DECLS - -#endif /* not KERNEL */ - -#endif /* __FreeBSD__ */ -#endif /* _SYS_TIMEX_H_ */ diff --git a/usr.sbin/xntpd/include/sys/tpro.h b/usr.sbin/xntpd/include/sys/tpro.h deleted file mode 100644 index f276f81bead0..000000000000 --- a/usr.sbin/xntpd/include/sys/tpro.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Structure for the KSI/Odetics TPRO-S data returned in reponse to a - * read() call. Note that these are driver-specific and not dependent on - * 32/64-bit architecture. - */ -struct tproval { - u_short day100; /* days * 100 */ - u_short day10; /* days * 10 */ - u_short day1; /* days * 1 */ - u_short hour10; /* hours * 10 */ - u_short hour1; /* hours * 1 */ - u_short min10; /* minutes * 10 */ - u_short min1; /* minutes * 1 */ - u_short sec10; /* seconds * 10 */ - u_short sec1; /* seconds * 1*/ - u_short ms100; /* milliseconds * 100 */ - u_short ms10; /* milliseconds * 10 */ - u_short ms1; /* milliseconds * 1 */ - u_short usec100; /* microseconds * 100 */ - u_short usec10; /* microseconds * 10 */ - u_short usec1; /* microseconds * 1 */ - long tv_sec; /* seconds */ - long tv_usec; /* microseconds */ - u_short status; /* status register */ -}; - -/* - * Status register bits - */ -#define TIMEAVAIL 0x0001 /* time available */ -#define NOSIGNAL 0x0002 /* insufficient IRIG-B signal */ -#define NOSYNC 0x0004 /* local oscillator not synchronized */ - -/* end of tpro.h */ diff --git a/usr.sbin/xntpd/kernel/README.kern b/usr.sbin/xntpd/kernel/README.kern deleted file mode 100644 index 64ba9c5bf379..000000000000 --- a/usr.sbin/xntpd/kernel/README.kern +++ /dev/null @@ -1,596 +0,0 @@ -Precision Time and Frequency Synchronization Using Modified Kernels - -1. Introduction - -This memo describes replacements for certain SunOS and Ultrix kernel -routines that manage the system clock and timer functions. They provide -improved accuracy and stability through the use of a disciplined clock -interface for use with the Network Time Protocol (NTP) or similar time- -synchronization protocol. In addition, for certain models of the -DECstation 5000 product line, the new routines provide improved -precision to +-1 microsecond (us) (SunOS 4.1.1 already does provide -precision to +-1 us). The current public NTP distribution cooperates -with these kernel routines to provide synchronization in principle to -within a microsecond, but in practice this is limited by the short-term -stability of the oscillator that drives the timer interrupt. - -This memo describes the principles behind the design and operation of -the software. There are two versions of the software, one that operates -with the SunOS 4.1.1 kernel and the other that operates with the Ultrix -4.2a kernel (and probably the 4.3 kernel, although this has not been -tested). A detailed description of the variables and algorithms is given -in the hope that similar improvements can be incorporated in Unix -kernels for other machines. The software itself is not included in this -memo, since it involves licensed code. Detailed instructions on where to -obtain it for either SunOS or Ultrix will be given separately. - -The principle function added to the SunOS and Ultrix kernels is to -change the way the system clock is controlled, in order to provide -precision time and frequency adjustments. Another function utilizes an -undocumented counter in the DECstation hardware to provide precise time -to the microsecond. This function can be used only with the DECstation -5000/240 and possibly others that use the same input/output chipset. - -2. Design Principles - -In order to understand how these routines work, it is useful to consider -how most Unix systems maintain the system clock. In the original design -a hardware timer interrupts the kernel at some fixed rate, such as 100 -Hz in the SunOS kernel and 256 Hz in the Ultrix kernel. Since 256 does -not evenly divide the second in microseconds, the kernel inserts 64 us -once each second so that the system clock stays in step with real time. -The time returned by the gettimeofday() routine is thus characterized by -255 advances of 3906 us plus one of 3970 us. - -Also in the original design it is possible to slew the system clock to a -new offset using the adjtime() system call. To do this the clock -frequency is changed by adding or subtracting a fixed amount (tickadj) -at each timer interrupt (tick) for a calculated number of ticks. Since -this calculation involves dividing the requested offset by tickadj, it -is possible to slew to a new offset with a precision only of tickadj, -which is usually in the neighborhood of 5 us, but sometimes much higher. - -In order to maintain the system clock within specified bounds with this -scheme, it is necessary to call adjtime() on a regular basis. For -instance, let the bound be set at 100 us, which is a reasonable value -for NTP-synchronized hosts on a local network, and let the onboard -oscillator tolerance be 100 ppm, which is a reasonably conservative -assumption. This requires that adjtime() be called at intervals not -exceeding 1 second (s), which is in fact what the unmodified NTP -software daemon does. - -In the modified kernel routines this scheme is replaced by another that -extends the low-order bits of the system clock to provide very precise -clock adjustments. At each timer interrupt a precisely calibrated time -adjustment is added to the composite time value and overflows handled as -required. The quantity to add is computed from the adjtime() call and, -in addition a frequency adjustment, which is automatically calculated -from previous time adjustments. This implementation operates as an -adaptive-parameter, first-order, type-II, phase-lock loop (PLL), which -in principle provides precision control of the system clock phase to -within +-1 us and frequency to within +-5 nanoseconds (ns) per day. - -This PLL model is identical to the one implemented in NTP, except that -in NTP the software daemon has to simulate the PLL using only the -original adjtime() system call. The daemon is considerably complicated -by the need to parcel time adjustments at frequent intervals in order to -maintain the accuracy to specified bounds. The kernel routines do this -directly, allowing vast gobs of ugly daemon code to be avoided at the -expense of only a small amount of new code in the kernel. In fact, the -amount of code added to the kernel for the new scheme is about the -amount removed for the old scheme. The new adjtime() routine needs to be -called only as each new time update is determined, which in NTP occurs -at intervals of from 64 s to 1024 s. In addition, doing the frequency -correction in the kernel means that the system time runs true even if -the daemon were to cease operation or the network paths to the primary -reference source fail. - -Note that the degree to which the adjtime() adjustment can be made is -limited to a specific maximum value, presently +-128 milliseconds (ms), -in order to achieve microsecond resolution. It is the intent in the -design that settimeofday() be used for changes in system time greater -than +-128 ms. It has been the Internet experience that the need to -change the system time in increments greater than +-128 milliseconds is -extremely rare and is usually associated with a hardware or software -malfunction. Nevertheless, the limit applies to each adjtime() call and -it is possible, but not recommended, that this routine is called at -intervals smaller than 64 seconds, which is the NTP lower limit. - -For the most accurate and stable operation, adjtime() should be called -at specified intervals; however, the PLL is quite forgiving and neither -moderate loss of updates nor variations in the length of the interval is -serious. The current engineering parameters have been optimized for -intervals not greater than about 64 s. For larger intervals the PLL time -constant can be adjusted to optimize the dynamic response up to -intervals of 1024 s. Normally, this is automatically done by NTP. In any -case, if updates are suspended, the PLL coasts at the frequency last -determinated, which usually results in errors increasing only to a few -tens of milliseconds over a day. - -The new code needs to know the initial frequency offset and time -constant for the PLL, and the daemon needs to know the current frequency -offset computed by the kernel for monitoring purposes. This is provided -by a small change in the second argument of the kernel adjtime() calling -sequence, which is documented later in this memo. Ordinarily, only the -daemon will call the adjtime() routine, so the modified calling sequence -is easily accommodated. Other than this change, the operation of -adjtime() is transparent to the original. - -In the DECstation 5000/240 and possibly other models there happens to be -an undocumented hardware register that counts system bus cycles at a -rate of 25 MHz. The new kernel routines test for the CPU type and, in -the case of the '240, use this register to interpolate system time -between hardware timer interrupts. This results in a precision of +-1 us -for all time values obtained via the gettimeofday() system call. This -routine calls the kernel routine microtime(), which returns the actual -interpolated value, but does not change the kernel time variable. -Therefore, other kernel routines that access the kernel time variable -directly and do not call either gettimeofday() or microtime() will -continue their present behavior. - -The new kernel routines include provisions for error statistics (maximum -error and estimated error), leap seconds and system clock status. These -are intended to support applications that need such things; however, -there are no applications other than the time-synchronization daemon -itself that presently use them. At issue is the manner in which these -data can be provided to application clients, such as new system calls -and data interfaces. While a proposed interface is described later in -this memo, it has not yet been implemented. This is an area for further -study. - -While any time-synchronization daemon can in principle be modified to -use the new code, the most likely will be users of the xntp3 -distribution of NTP. The code in the xntp3 distribution determines -whether the new kernel code is in use and automatically reconfigures as -required. When the new code is in use, the daemon reads the frequency -offset from a file and provides it and the initial time constant via -adjtime(). In subsequent calls to adjtime(), only the time adjustment -and time constant are affected. The daemon reads the frequency from the -kernel (returned as the second argument of adjtime()) at intervals of -one hour and writes it to the file. - -3. Technical Description - -Following is a technical description of how the new scheme works in -terms of the variables and algorithms involved. These components are -discussed as a distinct entity and do not involve coding details -specific to the Ultrix kernel. The algorithms involve only minor changes -to the system clock and interval timer routines, but do not in -themselves provide a conduit for application programs to learn the -system clock status or statistics of the time-synchronization process. -In a later section a number of new system calls are proposed to do this, -along with an interface specification. - -The new scheme works like the companion simulator called kern.c and -included in this directory. This stand-alone simulator includes code -fragments identical to those in the modified kernel routines and -operates in the same way. The system clock is implemented in the kernel -using a set of variables and algorithms defined below and in the -simulator. The algorithms are driven by explicit calls from the -synchronization protocol as each time update is computed. The clock is -read and set using the gettimeofday() and settimeofday() system calls, -which operate in the same way as the originals, but return a status word -describing the state of the system clock. - -Once the system clock has been set, the adjtime() system call is used to -provide periodic updates including the time offset and possibly -frequency offset and time constant. With NTP this occurs at intervals of -from 64 s to 1024 s, deending on the time constant value. The kernel -implements an adaptive-parameter, first-order, type-II, phase-lock loop -(PLL) in order to integrate this offset into the phase and frequency of -the system clock. The kernel keeps track of the time of the last update -and adjusts the maximum error to grow by an amount equal to the -oscillator frequency tolerance times the elapsed time since the last -update. - -Occasionally, it is necessary to adjust the PLL parameters in response -to environmental conditions, such as leap-second warning and oscillator -stability observations. While the interface to do this has not yet been -implemented, proposals to to that are included in a later section. A -system call (setloop()) is used on such occasions to communicate these -data. In addition, a system call (getloop())) is used to extract these -data from the kernel for monitoring purposes. - -All programs utilize the system clock status variable time_status, which -records whether the clock is synchronized, waiting for a leap second, -etc. The value of this variable is returned by each system call. It can -be set explicitly by the setloop() system call and implicitly by the -settimeofday() system call and in the timer-interrupt routine. Values -presently defined in the header file timex.h are as follows: - -int time_status = TIME_BAD; /* clock synchronization status */ - -#define TIME_UNS 0 /* unspecified or unknown */ -#define TIME_OK 1 /* operation succeeded */ -#define TIME_INS 1 /* insert leap second at end of current day */ -#define TIME_DEL 2 /* delete leap second at end of current day */ -#define TIME_OOP 3 /* leap second in progress */ -#define TIME_BAD 4 /* system clock is not synchronized */ -#define TIME_ADR -1 /* operation failed: invalid address */ -#define TIME_VAL -2 /* operation failed: invalid argument */ -#define TIME_PRV -3 /* operation failed: priviledged operation */ - -In case of a negative result code, the operation has failed; however, -some variables may have been modified before the error was detected. -Note that the new system calls never return a value of zero, so it is -possible to determine whether the old routines or the new ones are in -use. The syntax of the modified adjtime() is as follows: - -/* - * adjtime - adjuts system time - */ -#include <sys/timex.h> - -int gettimexofday(tp, fiddle) - -struct timeval *tp; /* system time adjustment*/ -struct timeval *fiddle; /* sneak path */ - -On entry the "timeval" sneak path is coded: - -struct timeval { - long tv_sec = time_constant; /* time constant */ - long tv_usec = time_freq; /* new frequency offset */ -} - -However, the sneak is ignored if fiddle is the null pointer and the new -frequency offset is ignored if zero. - -The value returned on exit is the system clock status defined above. The -"timeval" sneak path is modified as follows: - -struct timeval { - long tv_sec = time_precision; /* system clock precision */ - long tv_usec = time_freq; /* current frequency offset */ -} - -3.1. Kernel Variables - -The following variables are used by the new code: - -long time_offset = 0; /* time adjustment (us) */ - -This variable is used by the PLL to adjust the system time in small -increments. It is scaled by (1 << SHIFT_UPDATE) in binary microseconds. -The maximum value that can be represented is about +-130 ms and the -minimum value or precision is about one nanosecond. - -long time_constant = SHIFT_TAU; /* pll time constant */ - -This variable determines the bandwidth or "stiffness" of the PLL. It is -used as a shift, with the effective value in positive powers of two. The -optimum value for this variable is equal to 1/64 times the update -interval. The default value SHIFT_TAU (0) corresponds to a PLL time -constant of about one hour or an update interval of about one minute, -which is appropriate for typical uncompensated quartz oscillators used -in most computing equipment. Values larger than four are not useful, -unless the local clock timebase is derived from a precision oscillator. - -long time_tolerance = MAXFREQ; /* frequency tolerance (ppm) */ - -This variable represents the maximum frequency error or tolerance of the -particular platform and is a property of the architecture. It is -expressed as a positive number greater than zero in parts-per-million -(ppm). The default MAXFREQ (100) is appropriate for conventional -workstations. - -long time_precision = 1000000 / HZ; /* clock precision (us) */ - -This variable represents the maximum error in reading the system clock. -It is expressed as a positive number greater than zero in microseconds -and is usually based on the number of microseconds between timer -interrupts, in the case of the Ultrix kernel, 3906. However, in cases -where the time can be interpolated between timer interrupts with -microsecond resolution, the precision is specified as 1. This variable -is computed by the kernel for use by the time-synchronization daemon, -but is otherwise not used by the kernel. - -struct timeval time_maxerror; /* maximum error */ - -This variable represents the maximum error, expressed as a Unix timeval, -of the system clock. For NTP, it is computed as the synchronization -distance, which is equal to one-half the root delay plus the root -dispersion. It is increased by a small amount (time_tolerance) each -second to reflect the clock frequency tolerance. This variable is -computed by the time-synchronization daemon and the kernel for use by -the application program, but is otherwise not used by the kernel. - -struct timeval time_esterror; /* estimated error */ - -This variable represents the best estimate of the actual error, -expressed as a Unix timeval, of the system clock based on its past -behavior, together with observations of multiple clocks within the peer -group. This variable is computed by the time-synchronization daemon for -use by the application program, but is otherwise not used by the kernel. - -The PLL itself is controlled by the following variables: - -long time_phase = 0; /* phase offset (scaled us) */ -long time_freq = 0; /* frequency offset (scaled ppm) */long -time_adj = 0; /* tick adjust (scaled 1 / HZ) */ - -These variables control the phase increment and the frequency increment -of the system clock at each tick of the clock. The time_phase variable -is scaled by (1 << SHIFT_SCALE) in binary microseconds, giving a minimum -value (time resolution) of 9.3e-10 us. The time_freq variable is scaled -by (1 << SHIFT_KF) in parts-per-million (ppm), giving it a maximum value -of about +-130 ppm and a minimum value (frequency resolution) of 6e-8 -ppm. The time_adj variable is the actual phase increment in scaled -microseconds to add to time_phase once each tick. It is computed from -time_phase and time_freq once per second. - -long time_reftime = 0; /* time at last adjustment (s) */ - -This variable is the second's portion of the system time on the last -call to adjtime(). It is used to adjust the time_freq variable as the -time since the last update increases. - -The HZ define establishes the timer interrupt frequency, 256 Hz for the -Ultrix kernel and 100 Hz for the SunOS kernel. The SHIFT_HZ define -expresses the same value as the nearest power of two in order to avoid -hardware multiply operations. These are the only parameters that need to -be changed for different timer interrupt rates. - -#define HZ 256 /* timer interrupt frequency (Hz) */ -#define SHIFT_HZ 8 /* log2(HZ) */ - -The following defines establish the engineering parameters of the PLL -model. They are chosen for an initial convergence time of about an hour, -an overshoot of about seven percent and a final convergence time of -several hours, depending on initial frequency error. - -#define SHIFT_KG 10 /* shift for phase increment */ -#define SHIFT_KF 24 /* shift for frequency increment */ -#define SHIFT_TAU 0 /* default time constant (shift) */ - -The SHIFT_SCALE define establishes the decimal point on the time_phase -variable which serves as a an extension to the low-order bits of the -system clock variable. The SHIFT_UPDATE define establishes the decimal -point of the phase portion of the adjtime() update. The FINEUSEC define -represents 1 us in scaled units. - -#define SHIFT_SCALE 28 /* shift for scale factor */ -#define SHIFT_UPDATE 14 /* shift for offset scale factor */ -#define FINEUSEC (1 << SHIFT_SCALE) /* 1 us in scaled units */ - -The FINETUNE define represents the residual, in ppm, to be added to the -system clock variable in addition to the integral 1-us value given by -tick. This allows a systematic frequency offset in cases where the timer -interrupt frequency does not exactly divide the second in microseconds. - -#define FINETUNE (1000000 - (1000000 / HZ) * HZ) /* frequency adjustment - * for non-isochronous HZ (ppm) */ - -The following four defines establish the performance envelope of the -PLL, one to bound the maximum phase error, another to bound the maximum -frequency error and the last two to bound the minimum and maximum time -between updates. The intent of these bounds is to force the PLL to -operate within predefined limits in order to conform to the correctness -models assumed by time-synchronization protocols like NTP and DTSS. An -excursion which exceeds these bounds is clamped to the bound and -operation proceeds accordingly. In practice, this can occur only if -something has failed or is operating out of tolerance, but otherwise the -PLL continues to operate in a stable mode. Note that the MAXPHASE define -conforms to the maximum offset allowed in NTP before the system time is -reset, rather than incrementally adjusted. - -#define MAXPHASE 128000 /* max phase error (us) */ -#define MINSEC 64 /* min interval between updates (s) */ -#define MAXFREQ 100 /* max frequency error (ppm) */ -#define MAXSEC 1024 /* max interval between updates (s) */ - -3.2. Code Segments - -The code segments illustrated in the simulator should make clear the -operations at various points in the code. These segments are not derived -from any licensed code. The hardupdate() fragment is called by adjtime() -to update the system clock phase and frequency. This is an -implementation of an adaptive-parameter, first-order, type-II phase-lock -loop. Note that the time constant is in units of powers of two, so that -multiplies can be done by simple shifts. The phase variable is computed -as the offset multiplied by the time constant. Then, the time since the -last update is computed and clamped to a maximum (for robustness) and to -zero if initializing. The offset is multiplied (sorry about the ugly -multiply) by the result and by the square of the time constant and then -added to the frequency variable. Finally, the frequency variable is -clamped not to exceed the tolerance. Note that all shifts are assumed to -be positive and that a shift of a signed quantity to the right requires -a litle dance. - -With the defines given, the maximum time offset is determined by the -size in bits of the long type (32) less the SHIFT_UPDATE (14) scale -factor or 18 bits (signed). The scale factor is chosen so that there is -no loss of significance in later steps, which may involve a right shift -up to 14 bits. This results in a maximum offset of about +-130 ms. Since -the time_constant must be greater than or equal to zero, the maximum -frequency offset is determined by the SHIFT_KF (24) scale factor, or -about +-130 ppm. In the addition step the value of offset * mtemp is -represented in 18 + 10 = 28 bits, which will not overflow a long add. -There could be a loss of precision due to the right shift of up to eight -bits, since time_constant is bounded at four. This results in a net -worst-case frequency error of about 2^-16 us or well down into the -oscillator phase noise. While the time_offset value is assumed checked -before entry, the time_phase variable is an accumulator, so is clamped -to the tolerance on every call. This helps to damp transients before the -oscillator frequency has been determined, as well as to satisfy the -correctness assertions if the time-synchronization protocol comes -unstuck. - -The hardclock() fragment is inserted in the hardware timer interrupt -routine at the point the system clock is to be incremented. The phase -adjustment (time_adj) is added to the clock phase (time_phase) and -tested for overflow of the microsecond. If an overflow occurs, the -microsecond (tick) in incremented or decremented. - -The second_overflow() fragment is inserted at the point where the -microseconds field of the system time variable is being checked for -overflow. On rollover of the second the maximum error is increased by -the tolerance. The time offset is divided by the phase weight (SHIFT_KG) -and time constant. The time offset is then reduced by the result and the -result is scaled and becomes the value of the phase adjustment. The -phase adjustment is then corrected for the calculated frequency offset -and a fixed offset FINETUNE which is a property of the architecture. On -rollover of the day the leap-warning indicator is checked and the -apparent time adjusted +-1 s accordingly. The gettimeofday() routine -insures that the reported time is always monotonically increasing. - -The simulator can be used to check the loop operation over the design -range of +-128 ms in time error and +-100 ppm in frequency error. This -confirms that no overflows occur and that the loop initially converges -in about 50-60 minutes for timer interrupt rates from 50 Hz to 1024 Hz. -The loop has a normal overshoot of about seven percent and a final -convergence time of several hours, depending on the initional frequency -error. - -3.3. Leap Seconds - -The leap-warning condition is determined by the synchronization protocol -(if remotely synchronized), by the timecode receiver (if available), or -by the operator (if awake). The time_status value must be set on the day -the leap event is to occur (30 June or 31 December) and is automatically -reset after the event. If the value is TIME_DEL, the kernel adds one -second to the system time immediately following second 23:59:58 and -resets time_status to TIME_OK. If the value is TIME_INS, the kernel -subtracts one second from the system time immediately following second -23:59:59 and resets time_status to TIME_OOP, in effect causing system -time to repeat second 59. Immediately following the repeated second, the -kernel resets time_status to TIME_OK. - -Depending upon the system call implementation, the reported time during -a leap second may repeat (with a return code set to advertise that fact) -or be monotonically adjusted until system time "catches up" to reported -time. With the latter scheme the reported time will be correct before -and after the leap second, but freeze or slowly advance during the leap -second itself. However, Most programs will probably use the ctime() -library routine to convert from timeval (seconds, microseconds) format -to tm format (seconds, minutes,...). If this routine is modified to -inspect the return code of the gettimeofday() routine, it could simply -report the leap second as second 60. - -To determine local midnight without fuss, the kernel simply finds the -residue of the time.tv_sec value mod 86,400, but this requires a messy -divide. Probably a better way to do this is to initialize an auxiliary -counter in the settimeofday() routine using an ugly divide and increment -the counter at the same time the time.tv_sec is incremented in the timer -interrupt routine. For future embellishment. - -4. Proposed Application Program Interface - -Most programs read the system clock using the gettimeofday() system -call, which returns the system time and time-zone data. In the modified -5000/240 kernel, the gettimeofday() routine calls the microtime() -routine, which interpolates between hardware timer interrupts to a -precision of +-1 microsecond. However, the synchronization protocol -provides additional information that will be of interest in many -applications. For some applications it is necessary to know the maximum -error of the reported time due to all causes, including those due to the -system clock reading error, oscillator frequency error and accumulated -errors due to intervening time servers on the path to a primary -reference source. However, for those protocols that adjust the system -clock frequency as well as the time offset, the errors expected in -actual use will almost always be much less than the maximum error. -Therefore, it is useful to report the estimated error, as well as the -maximum error. - -It does not seem useful to provide additional details private to the -kernel and synchronization protocol, such as stratum, reference -identifier, reference timestamp and so forth. It would in principle be -possible for the application to independently evaluate the quality of -time and project into the future how long this time might be "valid." -However, to do that properly would duplicate the functionality of the -synchronization protocol and require knowledge of many mundane details -of the platform architecture, such as the tick value, reachability -status and related variables. Therefore, the application interface does -not reveal anything except the time, timezone and error data. - -With respect to NTP, the data maintained by the protocol include the -roundtrip delay and total dispersion to the source of synchronization. -In terms of the above, the maximum error is computed as half the delay -plus the dispersion, while the estimated error is equal to the -dispersion. These are reported in timeval structures. A new system call -is proposed that includes all the data in the gettimeofday() plus the -two new timeval structures. - -The proposed interface involves modifications to the gettimeofday(), -settimeofday() and adjtime() system calls, as well as new system calls -to get and set various system parameters. In order to minimize -confusion, by convention the new system calls are named with an "x" -following the "time"; e.g., adjtime() becomes adjtimex(). The operation -of the modified gettimexofday(), settimexofday() and adjtimex() system -calls is identical to that of their prototypes, except for the error -quantities and certain other side effects, as documented below. By -convention, a NULL pointer can be used in place of any argument, in -which case the argument is ignored. - -The synchronization protocol daemon needs to set and adjust the system -clock and certain other kernel variables. It needs to read these -variables for monitoring purposes as well. The present list of these -include a subset of the variables defined previously: - -long time_precision -long time_timeconstant -long time_tolerance -long time_freq -long time_status - -/* - * gettimexofday, settimexofday - get/set date and time - */ -#include <sys/timex.h> - -int gettimexofday(tp, tzp, tmaxp, testp) - -struct timeval *tp; /* system time */ -struct timezone *tzp; /* timezone */ -struct timeval *tmaxp; /* maximum error */ -struct timeval *testp; /* estimated error */ - -The settimeofday() syntax is identical. Note that a call to -settimexofday() automatically results in the system being declared -unsynchronized (TIME_BAD return code), since the synchronization -condition can only be achieved by the synchronization daemon using an -internal or external primary reference source and the adjtimex() system -call. - -/* - * adjtimex - adjust system time - */ -#include <sys/timex.h> - -int adjtimex(tp, tzp, freq, tc) - -struct timeval *tp; /* system time */ -struct timezone *tzp; /* timezone */ -long freq; /* frequency adjustment */ -long tc; /* time constant */ - -/* - * getloop, setloop - get/set kernel time variables - */ -#include <sys/timex.h> - -int getloop(code, argp) - -int code; /* operation code */ -long *argp; /* argument pointer */ - -The paticular kernal variables affected by these routines are selected -by the operation code. Values presently defined in the header file -timex.h are as follows: - -#define TIME_PREC 1 /* precision (log2(sec)) */ -#define TIME_TCON 2 /* time constant (log2(sec) */ -#define TIME_FREQ 3 /* frequency tolerance */ -#define TIME_FREQ 4 /* frequency offset (scaled) */ -#define TIME_STAT 5 /* status (see return codes) */ - -The getloop() syntax is identical. - -Comments welcome, but very little support is available: - -David L. Mills -Electrical Engineering Department -University of Delaware -Newark, DE 19716 -302 831 8247 fax 302 831 4316 -mills@udel.edu diff --git a/usr.sbin/xntpd/kernel/chuinit.c b/usr.sbin/xntpd/kernel/chuinit.c deleted file mode 100644 index 77a4cd2cc4b8..000000000000 --- a/usr.sbin/xntpd/kernel/chuinit.c +++ /dev/null @@ -1,76 +0,0 @@ -/* -** dynamically loadable chu driver -** -** $FreeBSD$ -** -** william robertson <rob@agate.berkeley.edu> -*/ - -#include <sys/types.h> -#include <sys/conf.h> -#include <sys/errno.h> -#include <sys/stream.h> -#include <sys/syslog.h> - -#include <sun/openprom.h> -#include <sun/vddrv.h> - -extern int findmod(); /* os/str_io.c */ - -extern struct streamtab chuinfo; - -struct vdldrv vd = { - VDMAGIC_USER, - "chu" - }; - - -int -xxxinit(function_code, vdp, vdi, vds) -unsigned int function_code; -struct vddrv *vdp; -addr_t vdi; -struct vdstat *vds; -{ - register int i = 0; - register int j; - - switch (function_code) { - case VDLOAD: - - if (findmod("chu") >= 0) { - log(LOG_ERR, "chu stream module already loaded\n"); - return (EADDRINUSE); - } - - i = findmod("\0"); - - if (i == -1 || fmodsw[i].f_name[0] != '\0') - return(-1); - - for (j = 0; vd.Drv_name[j] != '\0'; j++) /* XXX check bounds */ - fmodsw[i].f_name[j] = vd.Drv_name[j]; - - fmodsw[i].f_name[j] = '\0'; - fmodsw[i].f_str = &chuinfo; - - vdp->vdd_vdtab = (struct vdlinkage *) &vd; - - return(0); - - case VDUNLOAD: - if ((i = findmod(vd.Drv_name)) == -1) - return(-1); - - fmodsw[i].f_name[0] = '\0'; - fmodsw[i].f_str = 0; - - return(0); - - case VDSTAT: - return(0); - - default: - return(EIO); - } -} diff --git a/usr.sbin/xntpd/kernel/clkinit.c b/usr.sbin/xntpd/kernel/clkinit.c deleted file mode 100644 index 9dae10d4e162..000000000000 --- a/usr.sbin/xntpd/kernel/clkinit.c +++ /dev/null @@ -1,76 +0,0 @@ -/* -** dynamically loadable clk driver -** -** $FreeBSD$ -** -** william robertson <rob@agate.berkeley.edu> -*/ - -#include <sys/types.h> -#include <sys/conf.h> -#include <sys/errno.h> -#include <sys/stream.h> -#include <sys/syslog.h> - -#include <sun/openprom.h> -#include <sun/vddrv.h> - -extern int findmod(); /* os/str_io.c */ - -extern struct streamtab clkinfo; - -struct vdldrv vd = { - VDMAGIC_USER, - "clk" - }; - - -int -xxxinit(function_code, vdp, vdi, vds) -unsigned int function_code; -struct vddrv *vdp; -addr_t vdi; -struct vdstat *vds; -{ - register int i = 0; - register int j; - - switch (function_code) { - case VDLOAD: - - if (findmod("clk") >= 0) { - log(LOG_ERR, "clk stream module already loaded\n"); - return (EADDRINUSE); - } - - i = findmod("\0"); - - if (i == -1 || fmodsw[i].f_name[0] != '\0') - return(-1); - - for (j = 0; vd.Drv_name[j] != '\0'; j++) /* XXX check bounds */ - fmodsw[i].f_name[j] = vd.Drv_name[j]; - - fmodsw[i].f_name[j] = '\0'; - fmodsw[i].f_str = &clkinfo; - - vdp->vdd_vdtab = (struct vdlinkage *) &vd; - - return(0); - - case VDUNLOAD: - if ((i = findmod(vd.Drv_name)) == -1) - return(-1); - - fmodsw[i].f_name[0] = '\0'; - fmodsw[i].f_str = 0; - - return(0); - - case VDSTAT: - return(0); - - default: - return(EIO); - } -} diff --git a/usr.sbin/xntpd/lib/Makefile b/usr.sbin/xntpd/lib/Makefile deleted file mode 100644 index 19b01ddb4275..000000000000 --- a/usr.sbin/xntpd/lib/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -# -# $FreeBSD$ -# - -CFLAGS+= -I${.CURDIR}/../include - -SRCS= atoint.c atolfp.c atouint.c auth12crypt.c authdecrypt.c authdes.c \ - authencrypt.c authkeys.c authparity.c authreadkeys.c authusekey.c \ - buftvtots.c caljulian.c calleapwhen.c caltontp.c calyearstart.c \ - clocktime.c dofptoa.c dolfptoa.c emalloc.c fptoa.c fptoms.c \ - gettstamp.c hextoint.c hextolfp.c humandate.c inttoa.c \ - lib_strbuf.c mfptoa.c mfptoms.c modetoa.c mstolfp.c \ - msutotsf.c netof.c numtoa.c refnumtoa.c numtohost.c octtoint.c \ - prettydate.c ranny.c tsftomsu.c tstotv.c tvtoa.c tvtots.c \ - uglydate.c uinttoa.c utvtoa.c clocktypes.c \ - md5.c a_md5encrypt.c a_md5decrypt.c \ - a_md512crypt.c decodenetnum.c systime.c msyslog.c syssignal.c \ - findconfig.c getopt.c - -NOMAN= -NOPROFILE= -LIB= ntp -CLEANFILES+=authdes.c - -.if !defined(NOCRYPT) && exists(${.CURDIR}/../../../secure/usr.sbin/xntpd/lib) -.PATH: ${.CURDIR}/../../../secure/usr.sbin/xntpd/lib -.else -authdes.c: authdes.c.export - cp ${.CURDIR}/authdes.c.export authdes.c -.endif - -# don't install this anywhere -install: - -.include <bsd.lib.mk> diff --git a/usr.sbin/xntpd/lib/README b/usr.sbin/xntpd/lib/README deleted file mode 100644 index c2b65d94cd81..000000000000 --- a/usr.sbin/xntpd/lib/README +++ /dev/null @@ -1,5 +0,0 @@ -README file for directory ./lib of the NTP Version 3 distribution - -This directory contains the sources for the NTP library used by most -programs in this distribution. See the README and RELNOTES files in the -parent directory for directions on how to make this library. diff --git a/usr.sbin/xntpd/lib/a_md512crypt.c b/usr.sbin/xntpd/lib/a_md512crypt.c deleted file mode 100644 index 515d83b68a6f..000000000000 --- a/usr.sbin/xntpd/lib/a_md512crypt.c +++ /dev/null @@ -1,86 +0,0 @@ -/* - * md5crypt - MD5 based authentication routines - */ - -#include "ntp_types.h" -#include "ntp_string.h" -#include "md5.h" -#include "ntp_stdlib.h" - -extern u_long cache_keyid; -extern char *cache_key; -extern int cache_keylen; - -/* - * Stat counters, imported from data base module - */ -extern U_LONG authencryptions; -extern U_LONG authdecryptions; -extern U_LONG authkeyuncached; -extern U_LONG authnokey; - -/* - * For our purposes an NTP packet looks like: - * - * a variable amount of encrypted data, multiple of 8 bytes, followed by: - * NOCRYPT_OCTETS worth of unencrypted data, followed by: - * BLOCK_OCTETS worth of ciphered checksum. - */ -#define NOCRYPT_OCTETS 4 -#define BLOCK_OCTETS 16 - -#define NOCRYPT_LONGS ((NOCRYPT_OCTETS)/sizeof(U_LONG)) -#define BLOCK_LONGS ((BLOCK_OCTETS)/sizeof(U_LONG)) - -static MD5_CTX ctx; - -/* - * Do first stage of a two stage authenticator generation. - */ - -void -MD5auth1crypt(keyno, pkt, length) - u_long keyno; - U_LONG *pkt; - int length; /* length of all encrypted data */ -{ - - authencryptions++; - - if (keyno != cache_keyid) { - authkeyuncached++; - if (!authhavekey(keyno)) { - authnokey++; - return; - } - } - - MD5Init(&ctx); - MD5Update(&ctx, cache_key, cache_keylen); - MD5Update(&ctx, (char *)pkt, length - 8); - /* just leave the partially computed value in the static MD5_CTX */ -} - -/* - * Do second state of a two stage authenticator generation. - */ -int -MD5auth2crypt(keyno, pkt, length) - u_long keyno; - U_LONG *pkt; - int length; /* total length of encrypted area */ -{ - /* - * Don't bother checking the keys. The first stage would have - * handled that. Finish up the generation by also including the - * last 8 bytes of the data area. - */ - - MD5Update(&ctx, (char *)(pkt) + length - 8, 8); - MD5Final(&ctx); - - memmove((char *) &pkt[NOCRYPT_LONGS + length/sizeof(U_LONG)], - (char *) ctx.digest, - BLOCK_OCTETS); - return (4 + BLOCK_OCTETS); -} diff --git a/usr.sbin/xntpd/lib/a_md5decrypt.c b/usr.sbin/xntpd/lib/a_md5decrypt.c deleted file mode 100644 index 958c21f61d9e..000000000000 --- a/usr.sbin/xntpd/lib/a_md5decrypt.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * md5crypt - MD5 based authentication routines - */ - -#include "ntp_types.h" -#include "ntp_string.h" -#include "md5.h" -#include "ntp_stdlib.h" - -extern u_long cache_keyid; -extern char *cache_key; -extern int cache_keylen; - -/* - * Stat counters, imported from data base module - */ -extern U_LONG authencryptions; -extern U_LONG authdecryptions; -extern U_LONG authkeyuncached; -extern U_LONG authnokey; - -/* - * For our purposes an NTP packet looks like: - * - * a variable amount of encrypted data, multiple of 8 bytes, followed by: - * NOCRYPT_OCTETS worth of unencrypted data, followed by: - * BLOCK_OCTETS worth of ciphered checksum. - */ -#define NOCRYPT_OCTETS 4 -#define BLOCK_OCTETS 16 - -#define NOCRYPT_LONGS ((NOCRYPT_OCTETS)/sizeof(U_LONG)) -#define BLOCK_LONGS ((BLOCK_OCTETS)/sizeof(U_LONG)) - -int -MD5authdecrypt(keyno, pkt, length) - u_long keyno; - const U_LONG *pkt; - int length; /* length of variable data in octets */ -{ - MD5_CTX ctx; - - authdecryptions++; - - if (keyno != cache_keyid) { - authkeyuncached++; - if (!authhavekey(keyno)) - return 0; - } - - MD5Init(&ctx); - MD5Update(&ctx, cache_key, cache_keylen); - MD5Update(&ctx, (char *)pkt, length); - MD5Final(&ctx); - - return (!memcmp((char *)ctx.digest, - (char *)pkt + length + 4, - BLOCK_OCTETS)); -} diff --git a/usr.sbin/xntpd/lib/a_md5encrypt.c b/usr.sbin/xntpd/lib/a_md5encrypt.c deleted file mode 100644 index 6fae6fbb7d11..000000000000 --- a/usr.sbin/xntpd/lib/a_md5encrypt.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * md5crypt - MD5 based authentication routines - */ - -#include "ntp_types.h" -#include "ntp_string.h" -#include "md5.h" -#include "ntp_stdlib.h" - -extern u_long cache_keyid; -extern char *cache_key; -extern int cache_keylen; - -/* - * Stat counters, imported from data base module - */ -extern U_LONG authencryptions; -extern U_LONG authdecryptions; -extern U_LONG authkeyuncached; -extern U_LONG authnokey; - -/* - * For our purposes an NTP packet looks like: - * - * a variable amount of encrypted data, multiple of 8 bytes, followed by: - * NOCRYPT_OCTETS worth of unencrypted data, followed by: - * BLOCK_OCTETS worth of ciphered checksum. - */ -#define NOCRYPT_OCTETS 4 -#define BLOCK_OCTETS 16 - -#define NOCRYPT_LONGS ((NOCRYPT_OCTETS)/sizeof(U_LONG)) -#define BLOCK_LONGS ((BLOCK_OCTETS)/sizeof(U_LONG)) - - -int -MD5authencrypt(keyno, pkt, length) - u_long keyno; - U_LONG *pkt; - int length; /* length of encrypted portion of packet */ -{ - MD5_CTX ctx; - int len; /* in 4 byte quantities */ - - authencryptions++; - - if (keyno != cache_keyid) { - authkeyuncached++; - if (!authhavekey(keyno)) { - authnokey++; - return 0; - } - } - - len = length / sizeof(U_LONG); - - /* - * Generate the authenticator. - */ - MD5Init(&ctx); - MD5Update(&ctx, cache_key, cache_keylen); - MD5Update(&ctx, (char *)pkt, length); - MD5Final(&ctx); - - memmove((char *)&pkt[NOCRYPT_LONGS + len], - (char *)ctx.digest, - BLOCK_OCTETS); - return (4 + BLOCK_OCTETS); /* return size of key and MAC */ -} diff --git a/usr.sbin/xntpd/lib/adjtimex.c b/usr.sbin/xntpd/lib/adjtimex.c deleted file mode 100644 index 03e9d79e359e..000000000000 --- a/usr.sbin/xntpd/lib/adjtimex.c +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. The Berkeley software License Agreement - * specifies the terms and conditions for redistribution. - */ - -#ifndef lint -_sccsid:.asciz "11/19/91 ULTRIX @(#)adjtime.c 6.1" -#endif not lint - -#include "SYS.h" - -SYSCALL(adjtimex) - ret - diff --git a/usr.sbin/xntpd/lib/atoint.c b/usr.sbin/xntpd/lib/atoint.c deleted file mode 100644 index 57abd4454ffc..000000000000 --- a/usr.sbin/xntpd/lib/atoint.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * atoint - convert an ascii string to a signed long, with error checking - */ -#include <sys/types.h> -#include <ctype.h> - -#include "ntp_types.h" - -int -atoint(str, ival) - const char *str; - long *ival; -{ - register long u; - register const char *cp; - register int isneg; - register int oflow_digit; - - cp = str; - - if (*cp == '-') { - cp++; - isneg = 1; - oflow_digit = '8'; - } else { - isneg = 0; - oflow_digit = '7'; - } - - if (*cp == '\0') - return 0; - - u = 0; - while (*cp != '\0') { - if (!isdigit(*cp)) - return 0; - if (u > 214748364 || (u == 214748364 && *cp > oflow_digit)) - return 0; /* overflow */ - u = (u << 3) + (u << 1); - u += *cp++ - '0'; /* ascii dependent */ - } - - if (isneg) - *ival = -u; - else - *ival = u; - return 1; -} diff --git a/usr.sbin/xntpd/lib/atolfp.c b/usr.sbin/xntpd/lib/atolfp.c deleted file mode 100644 index 644a38c41875..000000000000 --- a/usr.sbin/xntpd/lib/atolfp.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * atolfp - convert an ascii string to an l_fp number - */ -#include <stdio.h> -#include <ctype.h> - -#include "ntp_fp.h" -#include "ntp_string.h" - -/* - * Powers of 10 - */ -static u_long ten_to_the_n[10] = { - 0, - 10, - 100, - 1000, - 10000, - 100000, - 1000000, - 10000000, - 100000000, - 1000000000, -}; - - -int -atolfp(str, lfp) - const char *str; - l_fp *lfp; -{ - register const char *cp; - register u_long dec_i; - register u_long dec_f; - char *ind; - int ndec; - int isneg; - static char *digits = "0123456789"; - - isneg = 0; - dec_i = dec_f = 0; - ndec = 0; - cp = str; - - /* - * We understand numbers of the form: - * - * [spaces][-|+][digits][.][digits][spaces|\n|\0] - */ - while (isspace(*cp)) - cp++; - - if (*cp == '-') { - cp++; - isneg = 1; - } - - if (*cp == '+') - cp++; - - if (*cp != '.' && !isdigit(*cp)) - return 0; - - while (*cp != '\0' && (ind = strchr(digits, *cp)) != NULL) { - dec_i = (dec_i << 3) + (dec_i << 1); /* multiply by 10 */ - dec_i += (ind - digits); - cp++; - } - - if (*cp != '\0' && !isspace(*cp)) { - if (*cp++ != '.') - return 0; - - while (ndec < 9 && *cp != '\0' - && (ind = strchr(digits, *cp)) != NULL) { - ndec++; - dec_f = (dec_f << 3) + (dec_f << 1); /* *10 */ - dec_f += (ind - digits); - cp++; - } - - while (isdigit(*cp)) - cp++; - - if (*cp != '\0' && !isspace(*cp)) - return 0; - } - - if (ndec > 0) { - register u_long tmp; - register u_long bit; - register u_long ten_fact; - - ten_fact = ten_to_the_n[ndec]; - - tmp = 0; - bit = 0x80000000; - while (bit != 0) { - dec_f <<= 1; - if (dec_f >= ten_fact) { - tmp |= bit; - dec_f -= ten_fact; - } - bit >>= 1; - } - if ((dec_f << 1) > ten_fact) - tmp++; - dec_f = tmp; - } - - if (isneg) - M_NEG(dec_i, dec_f); - - lfp->l_ui = dec_i; - lfp->l_uf = dec_f; - return 1; -} diff --git a/usr.sbin/xntpd/lib/atouint.c b/usr.sbin/xntpd/lib/atouint.c deleted file mode 100644 index d826bb4f4d9a..000000000000 --- a/usr.sbin/xntpd/lib/atouint.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * atouint - convert an ascii string to an unsigned long, with error checking - */ -#include <sys/types.h> -#include <ctype.h> - -#include "ntp_types.h" - -int -atouint(str, uval) - const char *str; - u_long *uval; -{ - register u_long u; - register const char *cp; - - cp = str; - if (*cp == '\0') - return 0; - - u = 0; - while (*cp != '\0') { - if (!isdigit(*cp)) - return 0; - if (u > 429496729 || (u == 429496729 && *cp >= '6')) - return 0; /* overflow */ - u = (u << 3) + (u << 1); - u += *cp++ - '0'; /* ascii dependent */ - } - - *uval = u; - return 1; -} diff --git a/usr.sbin/xntpd/lib/auth12crypt.c b/usr.sbin/xntpd/lib/auth12crypt.c deleted file mode 100644 index 7d69122e0ce3..000000000000 --- a/usr.sbin/xntpd/lib/auth12crypt.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * auth12crypt.c - routines to support two stage NTP encryption - */ -#include "ntp_stdlib.h" - -/* - * For our purposes an NTP packet looks like: - * - * a variable amount of encrypted data, multiple of 8 bytes, which - * is encrypted in pass 1, followed by: - * an 8 byte chunk of data which is encrypted in pass 2 - * NOCRYPT_OCTETS worth of unencrypted data, followed by: - * BLOCK_OCTETS worth of ciphered checksum. - */ -#define NOCRYPT_OCTETS 4 -#define BLOCK_OCTETS 8 - -#define NOCRYPT_LONGS ((NOCRYPT_OCTETS)/sizeof(U_LONG)) -#define BLOCK_LONGS ((BLOCK_OCTETS)/sizeof(U_LONG)) - -/* - * Imported from the key data base module - */ -extern u_long cache_keyid; /* cached key ID */ -extern u_char DEScache_ekeys[]; /* cached decryption keys */ -extern u_char DESzeroekeys[]; /* zero key decryption keys */ - -/* - * Stat counters, from the database module - */ -extern U_LONG authencryptions; -extern U_LONG authkeyuncached; -extern U_LONG authnokey; - - -/* - * auth1crypt - do the first stage of a two stage encryption - */ -void -DESauth1crypt(keyno, pkt, length) - u_long keyno; - U_LONG *pkt; - int length; /* length of all encrypted data */ -{ - register U_LONG *pd; - register int i; - register u_char *keys; - U_LONG work[2]; - - authencryptions++; - - if (keyno == 0) { - keys = DESzeroekeys; - } else { - if (keyno != cache_keyid) { - authkeyuncached++; - if (!authhavekey(keyno)) { - authnokey++; - return; - } - } - keys = DEScache_ekeys; - } - - /* - * Do the first five encryptions. Stick the intermediate result - * in the mac field. The sixth encryption must wait until the - * caller freezes a transmit time stamp, and will be done in stage 2. - */ - pd = pkt; - work[0] = work[1] = 0; - - for (i = (length/BLOCK_OCTETS - 1); i > 0; i--) { - work[0] ^= *pd++; - work[1] ^= *pd++; - DESauth_des(work, keys); - } - - /* - * Space to the end of the packet and stick the intermediate - * result in the mac field. - */ - pd += BLOCK_LONGS + NOCRYPT_LONGS; - *pd++ = work[0]; - *pd = work[1]; -} - - -/* - * auth2crypt - do the second stage of a two stage encryption - */ -int -DESauth2crypt(keyno, pkt, length) - u_long keyno; - U_LONG *pkt; - int length; /* total length of encrypted area */ -{ - register U_LONG *pd; - register u_char *keys; - - /* - * Skip the key check. The call to the first stage should - * have got it. - */ - if (keyno == 0) - keys = DESzeroekeys; - else - keys = DEScache_ekeys; - - /* - * The mac currently should hold the results of the first `n' - * encryptions. We xor in the last block in data section and - * do the final encryption in place. - * - * Get a pointer to the MAC block. XOR in the last two words of - * the data area. Call the encryption routine. - */ - pd = pkt + (length/sizeof(U_LONG)) + NOCRYPT_LONGS; - - *pd ^= *(pd - NOCRYPT_LONGS - 2); - *(pd + 1) ^= *(pd - NOCRYPT_LONGS - 1); - DESauth_des(pd, keys); - - return 4 + 8; /* return size of key number and MAC */ -} diff --git a/usr.sbin/xntpd/lib/authdecrypt.c b/usr.sbin/xntpd/lib/authdecrypt.c deleted file mode 100644 index 6ad3aebaf467..000000000000 --- a/usr.sbin/xntpd/lib/authdecrypt.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * authdecrypt - routine to decrypt a packet to see if this guy knows our key. - */ -#include "ntp_stdlib.h" - -/* - * For our purposes an NTP packet looks like: - * - * a variable amount of unencrypted data, multiple of 8 bytes, followed by: - * NOCRYPT_OCTETS worth of unencrypted data, followed by: - * BLOCK_OCTETS worth of ciphered checksum. - */ -#define NOCRYPT_OCTETS 4 -#define BLOCK_OCTETS 8 - -#define NOCRYPT_LONGS ((NOCRYPT_OCTETS)/sizeof(U_LONG)) -#define BLOCK_LONGS ((BLOCK_OCTETS)/sizeof(U_LONG)) - -/* - * Imported from the key data base module - */ -extern u_long cache_keyid; /* cached key ID */ -extern u_char DEScache_dkeys[]; /* cached decryption keys */ -extern u_char DESzerodkeys[]; /* zero key decryption keys */ - -/* - * Stat counters, imported from data base module - */ -extern U_LONG authdecryptions; -extern U_LONG authkeyuncached; - -int -DESauthdecrypt(keyno, pkt, length) - u_long keyno; - const U_LONG *pkt; - int length; /* length of variable data in octets */ -{ - register const U_LONG *pd; - register int i; - register u_char *keys; - register int longlen; - U_LONG work[2]; - - authdecryptions++; - - if (keyno == 0) - keys = DESzerodkeys; - else { - if (keyno != cache_keyid) { - authkeyuncached++; - if (!authhavekey(keyno)) - return 0; - } - keys = DEScache_dkeys; - } - - /* - * Get encryption block data in host byte order and decrypt it. - */ - longlen = length / sizeof(U_LONG); - pd = pkt + longlen; /* points at NOCRYPT area */ - work[0] = *(pd + NOCRYPT_LONGS); - work[1] = *(pd + NOCRYPT_LONGS + 1); - - if (longlen & 0x1) { - DESauth_des(work, keys); - work[0] ^= *(--pd); - } - - for (i = longlen/2; i > 0; i--) { - DESauth_des(work, keys); - work[1] ^= *(--pd); - work[0] ^= *(--pd); - } - - /* - * Success if the encryption data is zero - */ - if ((work[0] == 0) && (work[1] == 0)) - return 1; - return 0; -} diff --git a/usr.sbin/xntpd/lib/authdes.c.export b/usr.sbin/xntpd/lib/authdes.c.export deleted file mode 100644 index a22fc83c614a..000000000000 --- a/usr.sbin/xntpd/lib/authdes.c.export +++ /dev/null @@ -1,41 +0,0 @@ -/* - * authdes.c - dummy encryption routines for destinations outside the USA. - * - * Sorry, folks; I hate this, too. Send me your e-mail address in an - * envelope bearing a US postmark and I'll send you the decryption key - * for the des program normally distributed with Unix in the USA. Outside - * the USA you are on your own; however, you should be able quickly to - * obtain the source from lots of places, homegrown or otherwise. - * - * to decrypt the des routine, mumble the following: - * - * des -d -k key authdes.c.des authdes.c - * - * , where key is as above, and rebuild. To restore the distribution - * to its exportable state, copy this file to authdes.c . - */ -#include <sys/types.h> -#include "ntp_stdlib.h" - -/* - * This routine is normally called to compute the key schedule. - */ -void -DESauth_subkeys(key, encryptkeys, decryptkeys) - const U_LONG *key; - u_char *encryptkeys; - u_char *decryptkeys; -{ -}; - -/* - * This routine is normally called to encrypt and decrypt the data. This - * is done in-place using the Digital Encryption Standard (DES) Cipher- - * Block Chaining (CBC) method as described in the NTP specification. - */ -void -DESauth_des(data, subkeys) - U_LONG *data; - u_char *subkeys; -{ -}; diff --git a/usr.sbin/xntpd/lib/authencrypt.c b/usr.sbin/xntpd/lib/authencrypt.c deleted file mode 100644 index f84d10fa7372..000000000000 --- a/usr.sbin/xntpd/lib/authencrypt.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * authencrypt - compute and encrypt the mac field in an NTP packet - */ -#include "ntp_stdlib.h" - -/* - * For our purposes an NTP packet looks like: - * - * a variable amount of encrypted data, multiple of 8 bytes, followed by: - * NOCRYPT_OCTETS worth of unencrypted data, followed by: - * BLOCK_OCTETS worth of ciphered checksum. - */ -#define NOCRYPT_OCTETS 4 -#define BLOCK_OCTETS 8 - -#define NOCRYPT_LONGS ((NOCRYPT_OCTETS)/sizeof(U_LONG)) -#define BLOCK_LONGS ((BLOCK_OCTETS)/sizeof(U_LONG)) - -/* - * Imported from the key data base module - */ -extern u_long cache_keyid; /* cached key ID */ -extern u_char DEScache_ekeys[]; /* cached decryption keys */ -extern u_char DESzeroekeys[]; /* zero key decryption keys */ - -/* - * Stat counters from the database module - */ -extern U_LONG authencryptions; -extern U_LONG authkeyuncached; -extern U_LONG authnokey; - -int -DESauthencrypt(keyno, pkt, length) - u_long keyno; - U_LONG *pkt; - int length; /* length of encrypted portion of packet */ -{ - register U_LONG *pd; - register int i; - register u_char *keys; - register int len; - U_LONG work[2]; - - authencryptions++; - - if (keyno == 0) { - keys = DESzeroekeys; - } else { - if (keyno != cache_keyid) { - authkeyuncached++; - if (!authhavekey(keyno)) { - authnokey++; - return 0; - } - } - keys = DEScache_ekeys; - } - - /* - * Do the encryption. Work our way forward in the packet, eight - * bytes at a time, encrypting as we go. Note that the byte order - * issues are handled by the DES routine itself - */ - pd = pkt; - work[0] = work[1] = 0; - len = length / sizeof(U_LONG); - - for (i = (len/2); i > 0; i--) { - work[0] ^= *pd++; - work[1] ^= *pd++; - DESauth_des(work, keys); - } - - if (len & 0x1) { - work[0] ^= *pd++; - DESauth_des(work, keys); - } - - /* - * Space past the keyid and stick the result back in the mac field - */ - pd += NOCRYPT_LONGS; - *pd++ = work[0]; - *pd = work[1]; - - return 4 + BLOCK_OCTETS; /* return size of key and MAC */ -} diff --git a/usr.sbin/xntpd/lib/authkeys.c b/usr.sbin/xntpd/lib/authkeys.c deleted file mode 100644 index 9fce02009100..000000000000 --- a/usr.sbin/xntpd/lib/authkeys.c +++ /dev/null @@ -1,601 +0,0 @@ -/* - * authkeys.c - routines to manage the storage of authentication keys - */ -#include <stdio.h> - -#include "ntp_types.h" -#include "ntp_string.h" -#include "ntp_malloc.h" -#include "ntp_stdlib.h" - -/* - * Structure to store keys in in the hash table. - */ -struct savekey { - struct savekey *next; - union { -#ifdef DES - U_LONG DES_key[2]; -#endif -#ifdef MD5 - char MD5_key[32]; -#endif - } k; - u_long keyid; - u_short flags; -#ifdef MD5 - int keylen; -#endif -}; - -#define KEY_TRUSTED 0x1 /* this key is trusted */ -#define KEY_KNOWN 0x2 /* this key is known */ - -#ifdef DES -#define KEY_DES 0x100 /* this is a DES type key */ -#endif - -#ifdef MD5 -#define KEY_MD5 0x200 /* this is a MD5 type key */ -#endif - -/* - * The hash table. This is indexed by the low order bits of the - * keyid. We make this fairly big for potentially busy servers. - */ -#define HASHSIZE 64 -#define HASHMASK ((HASHSIZE)-1) -#define KEYHASH(keyid) ((keyid) & HASHMASK) - -struct savekey *key_hash[HASHSIZE]; - -U_LONG authkeynotfound; -U_LONG authkeylookups; -U_LONG authnumkeys; -U_LONG authuncached; -U_LONG authkeyuncached; -U_LONG authnokey; /* calls to encrypt with no key */ -U_LONG authencryptions; -U_LONG authdecryptions; - -/* - * Storage for free key structures. We malloc() such things but - * never free them. - */ -struct savekey *authfreekeys; -int authnumfreekeys; - -#define MEMINC 12 /* number of new free ones to get at once */ - - -#ifdef DES -/* - * Size of the key schedule - */ -#define KEY_SCHED_SIZE 128 /* number of octets to store key schedule */ - -/* - * The zero key, which we always have. Store the permutted key - * zero in here. - */ -#define ZEROKEY_L 0x01010101 /* odd parity zero key */ -#define ZEROKEY_R 0x01010101 /* right half of same */ -u_char DESzeroekeys[KEY_SCHED_SIZE]; -u_char DESzerodkeys[KEY_SCHED_SIZE]; -u_char DEScache_ekeys[KEY_SCHED_SIZE]; -u_char DEScache_dkeys[KEY_SCHED_SIZE]; -#endif - -/* - * The key cache. We cache the last key we looked at here. - */ -u_long cache_keyid; -u_short cache_flags; - -#ifdef MD5 -int cache_keylen; -char *cache_key; -#endif - -/* - * init_auth - initialize internal data - */ -void -init_auth() -{ - U_LONG zerokey[2]; - - /* - * Initialize hash table and free list - */ - memset((char *)key_hash, 0, sizeof key_hash); - cache_flags = cache_keyid = 0; - - authnumfreekeys = authkeynotfound = authkeylookups = 0; - authnumkeys = authuncached = authkeyuncached = authnokey = 0; - authencryptions = authdecryptions = 0; - -#ifdef DES - /* - * Initialize the zero key - */ - zerokey[0] = ZEROKEY_L; - zerokey[1] = ZEROKEY_R; - /* could just zero all */ - DESauth_subkeys(zerokey, DESzeroekeys, DESzerodkeys); -#endif -} - - -/* - * auth_findkey - find a key in the hash table - */ -struct savekey * -auth_findkey(keyno) - u_long keyno; -{ - register struct savekey *sk; - - sk = key_hash[KEYHASH(keyno)]; - while (sk != 0) { - if (keyno == sk->keyid) - return sk; - sk = sk->next; - } - return 0; -} - - -/* - * auth_havekey - return whether a key is known - */ -int -auth_havekey(keyno) - u_long keyno; -{ - register struct savekey *sk; - - if (keyno == 0 || (keyno == cache_keyid)) - return 1; - - sk = key_hash[KEYHASH(keyno)]; - while (sk != 0) { - if (keyno == sk->keyid) { - if (sk->flags & KEY_KNOWN) - return 1; - else { - authkeynotfound++; - return 0; - } - } - sk = sk->next; - } - authkeynotfound++; - return 0; -} - - -/* - * authhavekey - return whether a key is known. Permute and cache - * the key as a side effect. - */ -int -authhavekey(keyno) - u_long keyno; -{ - register struct savekey *sk; - - authkeylookups++; - if (keyno == 0 || keyno == cache_keyid) - return 1; - - sk = key_hash[KEYHASH(keyno)]; - while (sk != 0) { - if (keyno == sk->keyid) - break; - sk = sk->next; - } - - if (sk == 0 || !(sk->flags & KEY_KNOWN)) { - authkeynotfound++; - return 0; - } - - cache_keyid = sk->keyid; - cache_flags = sk->flags; -#ifdef MD5 - if (sk->flags & KEY_MD5) { - cache_keylen = sk->keylen; - cache_key = (char *) sk->k.MD5_key; /* XXX */ - return 1; - } -#endif - -#ifdef DES - if (sk->flags & KEY_DES) { - DESauth_subkeys(sk->k.DES_key, DEScache_ekeys, DEScache_dkeys); - return 1; - } -#endif - return 0; -} - - -/* - * auth_moremem - get some more free key structures - */ -int -auth_moremem() -{ - register struct savekey *sk; - register int i; - - sk = (struct savekey *)malloc(MEMINC * sizeof(struct savekey)); - if (sk == 0) - return 0; - - for (i = MEMINC; i > 0; i--) { - sk->next = authfreekeys; - authfreekeys = sk++; - } - authnumfreekeys += MEMINC; - return authnumfreekeys; -} - - -/* - * authtrust - declare a key to be trusted/untrusted - */ -void -authtrust(keyno, trust) - u_long keyno; - int trust; -{ - register struct savekey *sk; - - sk = key_hash[KEYHASH(keyno)]; - while (sk != 0) { - if (keyno == sk->keyid) - break; - sk = sk->next; - } - - if (sk == 0 && !trust) - return; - - if (sk != 0) { - if (cache_keyid == keyno) - cache_flags = cache_keyid = 0; - - if (trust) { - sk->flags |= KEY_TRUSTED; - return; - } - - sk->flags &= ~KEY_TRUSTED; - if (!(sk->flags & KEY_KNOWN)) { - register struct savekey *skp; - - skp = key_hash[KEYHASH(keyno)]; - if (skp == sk) { - key_hash[KEYHASH(keyno)] = sk->next; - } else { - while (skp->next != sk) - skp = skp->next; - skp->next = sk->next; - } - authnumkeys--; - - sk->next = authfreekeys; - authfreekeys = sk; - authnumfreekeys++; - } - return; - } - - if (authnumfreekeys == 0) - if (auth_moremem() == 0) - return; - - sk = authfreekeys; - authfreekeys = sk->next; - authnumfreekeys--; - - sk->keyid = keyno; - sk->flags = KEY_TRUSTED; - sk->next = key_hash[KEYHASH(keyno)]; - key_hash[KEYHASH(keyno)] = sk; - authnumkeys++; - return; -} - - -/* - * authistrusted - determine whether a key is trusted - */ -int -authistrusted(keyno) - u_long keyno; -{ - register struct savekey *sk; - - if (keyno == cache_keyid) - return ((cache_flags & KEY_TRUSTED) != 0); - - authkeyuncached++; - - sk = key_hash[KEYHASH(keyno)]; - while (sk != 0) { - if (keyno == sk->keyid) - break; - sk = sk->next; - } - - if (sk == 0 || !(sk->flags & KEY_TRUSTED)) - return 0; - return 1; -} - - - -#ifdef DES -/* - * DESauth_setkey - set a key into the key array - */ -void -DESauth_setkey(keyno, key) - u_long keyno; - const U_LONG *key; -{ - register struct savekey *sk; - - /* - * See if we already have the key. If so just stick in the - * new value. - */ - sk = key_hash[KEYHASH(keyno)]; - while (sk != 0) { - if (keyno == sk->keyid) { - sk->k.DES_key[0] = key[0]; - sk->k.DES_key[1] = key[1]; - sk->flags |= KEY_KNOWN | KEY_DES; - if (cache_keyid == keyno) - cache_flags = cache_keyid = 0; - return; - } - sk = sk->next; - } - - /* - * Need to allocate new structure. Do it. - */ - if (authnumfreekeys == 0) { - if (auth_moremem() == 0) - return; - } - - sk = authfreekeys; - authfreekeys = sk->next; - authnumfreekeys--; - - sk->k.DES_key[0] = key[0]; - sk->k.DES_key[1] = key[1]; - sk->keyid = keyno; - sk->flags = KEY_KNOWN | KEY_DES; - sk->next = key_hash[KEYHASH(keyno)]; - key_hash[KEYHASH(keyno)] = sk; - authnumkeys++; - return; -} -#endif - -#ifdef MD5 -void -MD5auth_setkey(keyno, key) - u_long keyno; - const U_LONG *key; -{ - register struct savekey *sk; - - /* - * See if we already have the key. If so just stick in the - * new value. - */ - sk = key_hash[KEYHASH(keyno)]; - while (sk != 0) { - if (keyno == sk->keyid) { - strncpy(sk->k.MD5_key, (char *)key, sizeof(sk->k.MD5_key)); - if ((sk->keylen = strlen((char *)key)) > - sizeof(sk->k.MD5_key)) - sk->keylen = sizeof(sk->k.MD5_key); - - sk->flags |= KEY_KNOWN | KEY_MD5; - if (cache_keyid == keyno) - cache_flags = cache_keyid = 0; - return; - } - sk = sk->next; - } - - /* - * Need to allocate new structure. Do it. - */ - if (authnumfreekeys == 0) { - if (auth_moremem() == 0) - return; - } - - sk = authfreekeys; - authfreekeys = sk->next; - authnumfreekeys--; - - strncpy(sk->k.MD5_key, (char *)key, sizeof(sk->k.MD5_key)); - if ((sk->keylen = strlen((char *)key)) > sizeof(sk->k.MD5_key)) - sk->keylen = sizeof(sk->k.MD5_key); - - sk->keyid = keyno; - sk->flags = KEY_KNOWN | KEY_MD5; - sk->next = key_hash[KEYHASH(keyno)]; - key_hash[KEYHASH(keyno)] = sk; - authnumkeys++; - return; -} -#endif - -/* - * auth_delkeys - delete all known keys, in preparation for rereading - * the keys file (presumably) - */ -void -auth_delkeys() -{ - register struct savekey *sk; - register struct savekey **skp; - register int i; - - for (i = 0; i < HASHSIZE; i++) { - skp = &(key_hash[i]); - sk = key_hash[i]; - while (sk != 0) { - sk->flags &= ~(KEY_KNOWN -#ifdef MD5 - | KEY_MD5 -#endif -#ifdef DES - | KEY_DES -#endif - ); - if (sk->flags == 0) { - *skp = sk->next; - authnumkeys--; - sk->next = authfreekeys; - authfreekeys = sk; - authnumfreekeys++; - sk = *skp; - } else { - skp = &(sk->next); - sk = sk->next; - } - } - } -} - - -/* - * auth1crypt - support for two stage encryption, part 1. - */ -void -auth1crypt(keyno, pkt, length) - u_long keyno; - U_LONG *pkt; - int length; /* length of all encrypted data */ -{ - if (keyno && keyno != cache_keyid) { - authkeyuncached++; - if (!authhavekey(keyno)) { - authnokey++; - return; - } - } - -#ifdef DES - if (!keyno || (cache_flags & KEY_DES)) { - DESauth1crypt(keyno, pkt, length); - return; - } -#endif - -#ifdef MD5 - if (cache_flags & KEY_MD5) { - MD5auth1crypt(keyno, pkt, length); - return; - } -#endif -} - - -/* - * auth1crypt - support for two stage encryption, part 1. - */ -int -auth2crypt(keyno, pkt, length) - u_long keyno; - U_LONG *pkt; - int length; /* total length of encrypted area */ -{ - if (keyno && keyno != cache_keyid) { - authkeyuncached++; - if (!authhavekey(keyno)) { - authnokey++; - return 0; - } - } - -#ifdef DES - if (!keyno || (cache_flags & KEY_DES)) - return DESauth2crypt(keyno, pkt, length); -#endif - -#ifdef MD5 - if (cache_flags & KEY_MD5) - return MD5auth2crypt(keyno, pkt, length); -#endif - - return 0; -} - -int -authencrypt(keyno, pkt, length) - u_long keyno; - U_LONG *pkt; - int length; /* length of encrypted portion of packet */ -{ - int sendlength = 0; - - if (keyno && keyno != cache_keyid) { - authkeyuncached++; - if (!authhavekey(keyno)) { - authnokey++; - return 0; - } - } - -#ifdef DES - if (!keyno || (cache_flags & KEY_DES)) - return sendlength = DESauthencrypt(keyno, pkt, length); -#endif - -#ifdef MD5 - if (cache_flags & KEY_MD5) - return MD5authencrypt(keyno, pkt, length); -#endif - return 0; -} - - -int -authdecrypt(keyno, pkt, length) - u_long keyno; - U_LONG *pkt; - int length; /* length of variable data in octets */ -{ - if (keyno && (keyno != cache_keyid)) { - authkeyuncached++; - if (!authhavekey(keyno)) { - authnokey++; - return 0; - } - } - -#ifdef DES - if (!keyno || (cache_flags & KEY_DES)) - return DESauthdecrypt(keyno, pkt, length); -#endif - -#ifdef MD5 - if (cache_flags & KEY_MD5) - return MD5authdecrypt(keyno, pkt, length); -#endif - - return 0; -} diff --git a/usr.sbin/xntpd/lib/authparity.c b/usr.sbin/xntpd/lib/authparity.c deleted file mode 100644 index a5b59e3eddb7..000000000000 --- a/usr.sbin/xntpd/lib/authparity.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * auth_parity - set parity on a key/check for odd parity - */ -#include "ntp_stdlib.h" - -int -DESauth_parity(key) - U_LONG *key; -{ - U_LONG mask; - int parity_err; - int bitcount; - int half; - int byte; - int i; - - /* - * Go through counting bits in each byte. Check to see if - * each parity bit was set correctly. If not, note the error - * and set it right. - */ - parity_err = 0; - for (half = 0; half < 2; half++) { /* two halves of key */ - mask = 0x80000000; - for (byte = 0; byte < 4; byte++) { /* 4 bytes per half */ - bitcount = 0; - for (i = 0; i < 7; i++) { /* 7 data bits / byte */ - if (key[half] & mask) - bitcount++; - mask >>= 1; - } - - /* - * If bitcount is even, parity must be set. If - * bitcount is odd, parity must be clear. - */ - if ((bitcount & 0x1) == 0) { - if (!(key[half] & mask)) { - parity_err++; - key[half] |= mask; - } - } else { - if (key[half] & mask) { - parity_err++; - key[half] &= ~mask; - } - } - mask >>= 1; - } - } - - /* - * Return the result of the parity check. - */ - return (parity_err == 0); -} - - diff --git a/usr.sbin/xntpd/lib/authreadkeys.c b/usr.sbin/xntpd/lib/authreadkeys.c deleted file mode 100644 index ee134411e5fc..000000000000 --- a/usr.sbin/xntpd/lib/authreadkeys.c +++ /dev/null @@ -1,191 +0,0 @@ -/* - * authreadkeys.c - routines to support the reading of the key file - */ -#include <stdio.h> -#include <ctype.h> - -#include "ntp_stdlib.h" -#include "ntp_syslog.h" - -#ifdef DES -/* - * Types of ascii representations for keys. "Standard" means a 64 bit - * hex number in NBS format, i.e. with the low order bit of each byte - * a parity bit. "NTP" means a 64 bit key in NTP format, with the - * high order bit of each byte a parity bit. "Ascii" means a 1-to-8 - * character string whose ascii representation is used as the key. - */ -#define KEY_TYPE_STD 1 -#define KEY_TYPE_NTP 2 -#define KEY_TYPE_ASCII 3 -#endif - -#ifdef MD5 -/* - * Arbitrary LONG string of ASCII characters. - */ -#define KEY_TYPE_MD5 4 -#endif - -/* - * nexttok - basic internal tokenizing routine - */ -static char * -nexttok(str) - char **str; -{ - register char *cp; - char *starttok; - - cp = *str; - - /* - * Space past white space - */ - while (*cp == ' ' || *cp == '\t') - cp++; - - /* - * Save this and space to end of token - */ - starttok = cp; - while (*cp != '\0' && *cp != '\n' && *cp != ' ' - && *cp != '\t' && *cp != '#') - cp++; - - /* - * If token length is zero return an error, else set end of - * token to zero and return start. - */ - if (starttok == cp) - return 0; - - if (*cp == ' ' || *cp == '\t') - *cp++ = '\0'; - else - *cp = '\0'; - - *str = cp; - return starttok; -} - - -/* - * authreadkeys - (re)read keys from a file. - */ -int -authreadkeys(file) - const char *file; -{ - FILE *fp; - char *line; - char *token; - u_long keyno; - int keytype; - char buf[512]; /* lots of room for line? */ -extern FILE * fopen P((const char *filename, const char *type)); -extern int fclose P((FILE *stream)); - - /* - * Open file. Complain and return if it can't be opened. - */ - fp = fopen(file, "r"); - if (fp == NULL) { - syslog(LOG_ERR, "can't open key file %s: %m", file); - return 0; - } - - /* - * Remove all existing keys - */ - auth_delkeys(); - - /* - * Now read lines from the file, looking for key entries - */ - while ((line = fgets(buf, sizeof buf, fp)) != NULL) { - token = nexttok(&line); - if (token == 0) - continue; - - /* - * First is key number. See if it is okay. - */ - keyno = atoi(token); - if (keyno == 0) { - syslog(LOG_ERR, - "cannot change keyid 0, key entry `%s' ignored", - token); - continue; - } - - /* - * Next is keytype. See if that is all right. - */ - token = nexttok(&line); - if (token == 0) { - syslog(LOG_ERR, - "no key type for key number %ld, entry ignored", - keyno); - continue; - } - switch (*token) { -#ifdef DES - case 'S': - case 's': - keytype = KEY_TYPE_STD; break; - - case 'N': - case 'n': - keytype = KEY_TYPE_NTP; break; - - case 'A': - case 'a': - keytype = KEY_TYPE_ASCII; break; -#endif -#ifdef MD5 - case 'M': - case 'm': - keytype = KEY_TYPE_MD5; break; -#endif - default: - syslog(LOG_ERR, - "invalid key type for key number %ld, entry ignored", - keyno); - continue; - } - - /* - * Finally, get key and insert it - */ - token = nexttok(&line); - if (token == 0) { - syslog(LOG_ERR, - "no key for number %ld entry, entry ignored", - keyno); - } else { - switch(keytype) { -#ifdef DES - case KEY_TYPE_STD: - case KEY_TYPE_NTP: - case KEY_TYPE_ASCII: - if (!authusekey(keyno, keytype, token)) - syslog(LOG_ERR, - "format/parity error for DES key %ld, not used", - keyno); - break; -#endif -#ifdef MD5 - case KEY_TYPE_MD5: - if (!authusekey(keyno, keytype, token)) - syslog(LOG_ERR, - "format/parity error for MD5 key %ld, not used", - keyno); - break; -#endif - } - } - } - (void) fclose(fp); - return 1; -} diff --git a/usr.sbin/xntpd/lib/authusekey.c b/usr.sbin/xntpd/lib/authusekey.c deleted file mode 100644 index 05fc0d79c7f1..000000000000 --- a/usr.sbin/xntpd/lib/authusekey.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * authusekey - decode a key from ascii and use it - */ -#include <stdio.h> -#include <ctype.h> - -#include "ntp_types.h" -#include "ntp_string.h" -#include "ntp_stdlib.h" - -/* - * Types of ascii representations for keys. "Standard" means a 64 bit - * hex number in NBS format, i.e. with the low order bit of each byte - * a parity bit. "NTP" means a 64 bit key in NTP format, with the - * high order bit of each byte a parity bit. "Ascii" means a 1-to-8 - * character string whose ascii representation is used as the key. - */ -#ifdef DES -#define KEY_TYPE_STD 1 -#define KEY_TYPE_NTP 2 -#define KEY_TYPE_ASCII 3 - -#define STD_PARITY_BITS 0x01010101 - -#endif - -#ifdef MD5 -#define KEY_TYPE_MD5 4 -#endif - -int -authusekey(keyno, keytype, str) - u_long keyno; - int keytype; - const char *str; -{ - U_LONG key[2]; - u_char keybytes[8]; - const char *cp; - char *xdigit; - int len; - int i; - static char *hex = "0123456789abcdef"; - - cp = str; - len = strlen(cp); - if (len == 0) - return 0; - - switch(keytype) { -#ifdef DES - case KEY_TYPE_STD: - case KEY_TYPE_NTP: - if (len != 16) /* Lazy. Should define constant */ - return 0; - /* - * Decode hex key. - */ - key[0] = 0; - key[1] = 0; - for (i = 0; i < 16; i++) { - if (!isascii(*cp)) - return 0; - xdigit = strchr(hex, isupper(*cp) ? tolower(*cp) : *cp); - cp++; - if (xdigit == 0) - return 0; - key[i>>3] <<= 4; - key[i>>3] |= (U_LONG)(xdigit - hex) & 0xf; - } - - /* - * If this is an NTP format key, put it into NBS format - */ - if (keytype == KEY_TYPE_NTP) { - for (i = 0; i < 2; i++) - key[i] = ((key[i] << 1) & ~STD_PARITY_BITS) - | ((key[i] >> 7) & STD_PARITY_BITS); - } - - /* - * Check the parity, reject the key if the check fails - */ - if (!DESauth_parity(key)) { - return 0; - } - - /* - * We can't find a good reason not to use this key. - * So use it. - */ - DESauth_setkey(keyno, key); - break; - - case KEY_TYPE_ASCII: - /* - * Make up key from ascii representation - */ - memset((char *) keybytes, 0, sizeof(keybytes)); - for (i = 0; i < 8 && i < len; i++) - keybytes[i] = *cp++ << 1; - key[0] = (U_LONG)keybytes[0] << 24 | (U_LONG)keybytes[1] << 16 - | (U_LONG)keybytes[2] << 8 | (U_LONG)keybytes[3]; - key[1] = (U_LONG)keybytes[4] << 24 | (U_LONG)keybytes[5] << 16 - | (U_LONG)keybytes[6] << 8 | (U_LONG)keybytes[7]; - - /* - * Set parity on key - */ - (void)DESauth_parity(key); - - /* - * Now set key in. - */ - DESauth_setkey(keyno, key); - break; -#endif - -#ifdef MD5 - case KEY_TYPE_MD5: - /* XXX FIXME: MD5auth_setkey() casts arg2 back to (char *) */ - MD5auth_setkey(keyno, (U_LONG *)str); - break; -#endif - - default: - /* Oh, well */ - return 0; - } - - return 1; -} diff --git a/usr.sbin/xntpd/lib/buftvtots.c b/usr.sbin/xntpd/lib/buftvtots.c deleted file mode 100644 index 7e1ec63a12f1..000000000000 --- a/usr.sbin/xntpd/lib/buftvtots.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * buftvtots - pull a Unix-format (struct timeval) time stamp out of - * an octet stream and convert it to a l_fp time stamp. - * This is useful when using the clock line discipline. - */ -#include "ntp_fp.h" -#include "ntp_unixtime.h" - -int -buftvtots(bufp, ts) - const char *bufp; - l_fp *ts; -{ - register const u_char *bp; - register u_long sec; - register u_long usec; - -#ifdef XNTP_BIG_ENDIAN - bp = (u_char *)bufp; - - sec = (u_long)*bp++ & 0xff; - sec <<= 8; - sec += (u_long)*bp++ & 0xff; - sec <<= 8; - sec += (u_long)*bp++ & 0xff; - sec <<= 8; - sec += (u_long)*bp++ & 0xff; - - usec = (u_long)*bp++ & 0xff; - usec <<= 8; - usec += (u_long)*bp++ & 0xff; - usec <<= 8; - usec += (u_long)*bp++ & 0xff; - usec <<= 8; - usec += (u_long)*bp & 0xff; -#else - bp = (u_char *)bufp + 7; - - usec = (u_long)*bp-- & 0xff; - usec <<= 8; - usec += (u_long)*bp-- & 0xff; - usec <<= 8; - usec += (u_long)*bp-- & 0xff; - usec <<= 8; - usec += (u_long)*bp-- & 0xff; - - sec = (u_long)*bp-- & 0xff; - sec <<= 8; - sec += (u_long)*bp-- & 0xff; - sec <<= 8; - sec += (u_long)*bp-- & 0xff; - sec <<= 8; - sec += (u_long)*bp & 0xff; -#endif - if (usec > 999999) - return 0; - - ts->l_ui = sec + (u_long)JAN_1970; - TVUTOTSF(usec, ts->l_uf); - return 1; -} diff --git a/usr.sbin/xntpd/lib/caljulian.c b/usr.sbin/xntpd/lib/caljulian.c deleted file mode 100644 index 64efd1e0e0d7..000000000000 --- a/usr.sbin/xntpd/lib/caljulian.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * caljulian - determine the Julian date from an NTP time. - */ -#include <sys/types.h> - -#include "ntp_types.h" -#include "ntp_calendar.h" -#include "ntp_stdlib.h" - -/* - * calmonthtab - month start offsets from the beginning of a cycle. - */ -static u_short calmonthtab[12] = { - 0, /* March */ - MAR, /* April */ - (MAR+APR), /* May */ - (MAR+APR+MAY), /* June */ - (MAR+APR+MAY+JUN), /* July */ - (MAR+APR+MAY+JUN+JUL), /* August */ - (MAR+APR+MAY+JUN+JUL+AUG), /* September */ - (MAR+APR+MAY+JUN+JUL+AUG+SEP), /* October */ - (MAR+APR+MAY+JUN+JUL+AUG+SEP+OCT), /* November */ - (MAR+APR+MAY+JUN+JUL+AUG+SEP+OCT+NOV), /* December */ - (MAR+APR+MAY+JUN+JUL+AUG+SEP+OCT+NOV+DEC), /* January */ - (MAR+APR+MAY+JUN+JUL+AUG+SEP+OCT+NOV+DEC+JAN), /* February */ -}; - -/* - * caldaytab - calendar year start day offsets - */ -static u_short caldaytab[YEARSPERCYCLE] = { - (DAYSPERYEAR - (JAN + FEB)), - ((DAYSPERYEAR * 2) - (JAN + FEB)), - ((DAYSPERYEAR * 3) - (JAN + FEB)), - ((DAYSPERYEAR * 4) - (JAN + FEB)), -}; - -void -caljulian(ntptime, jt) - u_long ntptime; - register struct calendar *jt; -{ - register int i; - register u_long nt; - register u_short snt; - register int cyear; - - /* - * Find the start of the cycle this is in. - */ - nt = ntptime; - if (nt >= MAR1988) { - cyear = CYCLE22; - nt -= MAR1988; - } else { - cyear = 0; - nt -= MAR1900; - } - while (nt >= SECSPERCYCLE) { - nt -= SECSPERCYCLE; - cyear++; - } - - /* - * Seconds, minutes and hours are too hard to do without - * divides, so we don't. - */ - jt->second = nt % SECSPERMIN; - nt /= SECSPERMIN; /* nt in minutes */ - jt->minute = nt % MINSPERHR; - snt = nt / MINSPERHR; /* snt in hours */ - jt->hour = snt % HRSPERDAY; - snt /= HRSPERDAY; /* nt in days */ - - /* - * snt is now the number of days into the cycle, from 0 to 1460. - */ - cyear <<= 2; - if (snt < caldaytab[0]) { - jt->yearday = snt + JAN + FEBLEAP + 1; /* first year is leap */ - } else { - for (i = 1; i < YEARSPERCYCLE; i++) - if (snt < caldaytab[i]) - break; - jt->yearday = snt - caldaytab[i-1] + 1; - cyear += i; - } - jt->year = cyear + 1900; - - /* - * One last task, to compute the month and day. Normalize snt to - * a day within a cycle year. - */ - while (snt >= DAYSPERYEAR) - snt -= DAYSPERYEAR; - for (i = 0; i < 11; i++) - if (snt < calmonthtab[i+1]) - break; - - if (i > 9) - jt->month = i - 9; /* January or February */ - else - jt->month = i + 3; /* March through December */ - jt->monthday = snt - calmonthtab[i] + 1; -} diff --git a/usr.sbin/xntpd/lib/calleapwhen.c b/usr.sbin/xntpd/lib/calleapwhen.c deleted file mode 100644 index d68bbe97bb03..000000000000 --- a/usr.sbin/xntpd/lib/calleapwhen.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * calleapwhen - determine the number of seconds to the next possible - * leap occurance and the last one. - */ -#include <sys/types.h> - -#include "ntp_types.h" -#include "ntp_calendar.h" -#include "ntp_stdlib.h" - -/* - * calleaptab - leaps occur at the end of December and June - */ -long calleaptab[10] = { - -(JAN+FEBLEAP)*SECSPERDAY, /* leap previous to cycle */ - (MAR+APR+MAY+JUN)*SECSPERDAY, /* end of June */ - (MAR+APR+MAY+JUN+JUL+AUG+SEP+OCT+NOV+DEC)*SECSPERDAY, /* end of Dec */ - (MAR+APR+MAY+JUN)*SECSPERDAY + SECSPERYEAR, - (MAR+APR+MAY+JUN+JUL+AUG+SEP+OCT+NOV+DEC)*SECSPERDAY + SECSPERYEAR, - (MAR+APR+MAY+JUN)*SECSPERDAY + 2*SECSPERYEAR, - (MAR+APR+MAY+JUN+JUL+AUG+SEP+OCT+NOV+DEC)*SECSPERDAY + 2*SECSPERYEAR, - (MAR+APR+MAY+JUN)*SECSPERDAY + 3*SECSPERYEAR, - (MAR+APR+MAY+JUN+JUL+AUG+SEP+OCT+NOV+DEC)*SECSPERDAY + 3*SECSPERYEAR, - (MAR+APR+MAY+JUN+JUL+AUG+SEP+OCT+NOV+DEC+JAN+FEBLEAP+MAR+APR+MAY+JUN) - *SECSPERDAY + 3*SECSPERYEAR, /* next after current cycle */ -}; - -void -calleapwhen(ntpdate, leaplast, leapnext) - u_long ntpdate; - u_long *leaplast; - u_long *leapnext; -{ - register u_long dateincycle; - register int i; - - /* - * Find the offset from the start of the cycle - */ - dateincycle = ntpdate; - if (dateincycle >= MAR1988) - dateincycle -= MAR1988; - else - dateincycle -= MAR1900; - - while (dateincycle >= SECSPERCYCLE) - dateincycle -= SECSPERCYCLE; - - /* - * Find where we are with respect to the leap events. - */ - for (i = 1; i < 9; i++) - if (dateincycle < (u_long)calleaptab[i]) - break; - - /* - * i points at the next leap. Compute the last and the next. - */ - *leaplast = (u_long)((long)dateincycle - calleaptab[i-1]); - *leapnext = (u_long)(calleaptab[i] - (long)dateincycle); -} diff --git a/usr.sbin/xntpd/lib/caltontp.c b/usr.sbin/xntpd/lib/caltontp.c deleted file mode 100644 index a0c8f610c7de..000000000000 --- a/usr.sbin/xntpd/lib/caltontp.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * caltontp - convert a julian date to an NTP time - */ -#include <sys/types.h> - -#include "ntp_types.h" -#include "ntp_calendar.h" -#include "ntp_stdlib.h" - -/* - * calmonthtab - month start offsets from the beginning of a cycle. - */ -static u_short calmonthtab[12] = { - 0, /* March */ - MAR, /* April */ - (MAR+APR), /* May */ - (MAR+APR+MAY), /* June */ - (MAR+APR+MAY+JUN), /* July */ - (MAR+APR+MAY+JUN+JUL), /* August */ - (MAR+APR+MAY+JUN+JUL+AUG), /* September */ - (MAR+APR+MAY+JUN+JUL+AUG+SEP), /* October */ - (MAR+APR+MAY+JUN+JUL+AUG+SEP+OCT), /* November */ - (MAR+APR+MAY+JUN+JUL+AUG+SEP+OCT+NOV), /* December */ - (MAR+APR+MAY+JUN+JUL+AUG+SEP+OCT+NOV+DEC), /* January */ - (MAR+APR+MAY+JUN+JUL+AUG+SEP+OCT+NOV+DEC+JAN), /* February */ -}; - -u_long -caltontp(jt) - register const struct calendar *jt; -{ - register int cyear; - register int resyear; - register u_long nt; - register int yearday; - - /* - * Find the start of the cycle this is in. - */ - cyear = (int)(jt->year - 1900) >> 2; - resyear = (jt->year - 1900) - (cyear << 2); - yearday = 0; - if (resyear == 0) { - if (jt->yearday == 0) { - if (jt->month == 1 || jt->month == 2) { - cyear--; - resyear = 3; - } - } else { - if (jt->yearday <= (u_short)(JAN+FEBLEAP)) { - cyear--; - resyear = 3; - yearday = calmonthtab[10] + jt->yearday; - } else { - yearday = jt->yearday - (JAN+FEBLEAP); - } - } - } else { - if (jt->yearday == 0) { - if (jt->month == 1 || jt->month == 2) - resyear--; - } else { - if (jt->yearday <= (u_short)(JAN+FEB)) { - resyear--; - yearday = calmonthtab[10] + jt->yearday; - } else { - yearday = jt->yearday - (JAN+FEB); - } - } - } - - if (yearday == 0) { - if (jt->month >= 3) { - yearday = calmonthtab[jt->month - 3] + jt->monthday; - } else { - yearday = calmonthtab[jt->month + 9] + jt->monthday; - } - } - - nt = TIMESDPERC((u_long)cyear); - while (resyear-- > 0) - nt += DAYSPERYEAR; - nt += (u_long) (yearday - 1); - - nt = TIMES24(nt) + (u_long)jt->hour; - nt = TIMES60(nt) + (u_long)jt->minute; - nt = TIMES60(nt) + (u_long)jt->second; - - return nt + MAR1900; -} diff --git a/usr.sbin/xntpd/lib/calyearstart.c b/usr.sbin/xntpd/lib/calyearstart.c deleted file mode 100644 index e78c058a4557..000000000000 --- a/usr.sbin/xntpd/lib/calyearstart.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * calyearstart - determine the NTP time at midnight of January 1 in - * the year of the given date. - */ -#include <sys/types.h> - -#include "ntp_types.h" -#include "ntp_calendar.h" -#include "ntp_stdlib.h" - -/* - * calyeartab - year start offsets from the beginning of a cycle - */ -u_long calyeartab[YEARSPERCYCLE] = { - (SECSPERLEAPYEAR-JANFEBLEAP), - (SECSPERLEAPYEAR-JANFEBLEAP) + SECSPERYEAR, - (SECSPERLEAPYEAR-JANFEBLEAP) + 2*SECSPERYEAR, - (SECSPERLEAPYEAR-JANFEBLEAP) + 3*SECSPERYEAR -}; - -u_long -calyearstart(dateinyear) - register u_long dateinyear; -{ - register u_long cyclestart; - register u_long nextyear, lastyear; - register int i; - - /* - * Find the start of the cycle this is in. - */ - if (dateinyear >= MAR1988) - cyclestart = MAR1988; - else - cyclestart = MAR1900; - while ((cyclestart + SECSPERCYCLE) <= dateinyear) - cyclestart += SECSPERCYCLE; - - /* - * If we're in the first year of the cycle, January 1 is - * two months back from the cyclestart and the year is - * a leap year. - */ - lastyear = cyclestart + calyeartab[0]; - if (dateinyear < lastyear) - return (cyclestart - JANFEBLEAP); - - /* - * Look for an intermediate year - */ - for (i = 1; i < YEARSPERCYCLE; i++) { - nextyear = cyclestart + calyeartab[i]; - if (dateinyear < nextyear) - return lastyear; - lastyear = nextyear; - } - - /* - * Not found, must be in last two months of cycle - */ - return nextyear; -} diff --git a/usr.sbin/xntpd/lib/clocktime.c b/usr.sbin/xntpd/lib/clocktime.c deleted file mode 100644 index 0217f2b5c4a6..000000000000 --- a/usr.sbin/xntpd/lib/clocktime.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - * clocktime - compute the NTP date from a day of year, hour, minute - * and second. - */ -#include "ntp_fp.h" -#include "ntp_unixtime.h" -#include "ntp_stdlib.h" - -/* - * Hacks to avoid excercising the multiplier. I have no pride. - */ -#define MULBY10(x) (((x)<<3) + ((x)<<1)) -#define MULBY60(x) (((x)<<6) - ((x)<<2)) /* watch overflow */ -#define MULBY24(x) (((x)<<4) + ((x)<<3)) - -/* - * Two days, in seconds. - */ -#define TWODAYS (2*24*60*60) - -/* - * We demand that the time be within CLOSETIME seconds of the receive - * time stamp. This is about 4 hours, which hopefully should be - * wide enough to collect most data, while close enough to keep things - * from getting confused. - */ -#define CLOSETIME (4*60*60) - - -int -clocktime(yday, hour, minute, second, tzoff, rec_ui, yearstart, ts_ui) - int yday; - int hour; - int minute; - int second; - int tzoff; - u_long rec_ui; - u_long *yearstart; - U_LONG *ts_ui; -{ - register long tmp; - register u_long date; - register u_long yst; - - /* - * Compute the offset into the year in seconds. Note that - * this could come out to be a negative number. - */ - tmp = (long)(MULBY24((yday-1)) + hour + tzoff); - tmp = MULBY60(tmp) + (long)minute; - tmp = MULBY60(tmp) + (long)second; - - /* - * Initialize yearstart, if necessary. - */ - yst = *yearstart; - if (yst == 0) { - yst = calyearstart(rec_ui); - *yearstart = yst; - } - - /* - * Now the fun begins. We demand that the received clock time - * be within CLOSETIME of the receive timestamp, but - * there is uncertainty about the year the timestamp is in. - * Use the current year start for the first check, this should - * work most of the time. - */ - date = (u_long)(tmp + (long)yst); - if (date < (rec_ui + CLOSETIME) && - date > (rec_ui - CLOSETIME)) { - *ts_ui = date; - return 1; - } - - /* - * Trouble. Next check is to see if the year rolled over and, if - * so, try again with the new year's start. - */ - yst = calyearstart(rec_ui); - if (yst != *yearstart) { - date = (u_long)((long)yst + tmp); - *ts_ui = date; - if (date < (rec_ui + CLOSETIME) && - date > (rec_ui - CLOSETIME)) { - *yearstart = yst; - return 1; - } - } - - /* - * Here we know the year start matches the current system - * time. One remaining possibility is that the time code - * is in the year previous to that of the system time. This - * is only worth checking if the receive timestamp is less - * than a couple of days into the new year. - */ - if ((rec_ui - yst) < TWODAYS) { - yst = calyearstart(yst - TWODAYS); - if (yst != *yearstart) { - date = (u_long)(tmp + (long)yst); - if (date < (rec_ui + CLOSETIME) && - date > (rec_ui - CLOSETIME)) { - *yearstart = yst; - *ts_ui = date; - return 1; - } - } - } - - /* - * One last possibility is that the time stamp is in the year - * following the year the system is in. Try this one before - * giving up. - */ - yst = calyearstart(rec_ui + TWODAYS); - if (yst != *yearstart) { - date = (u_long)((long)yst + tmp); - if (date < (rec_ui + CLOSETIME) && - date > (rec_ui - CLOSETIME)) { - *yearstart = yst; - *ts_ui = date; - return 1; - } - } - - /* - * Give it up. - */ - return 0; -} diff --git a/usr.sbin/xntpd/lib/clocktypes.c b/usr.sbin/xntpd/lib/clocktypes.c deleted file mode 100644 index 4c5f437f39ca..000000000000 --- a/usr.sbin/xntpd/lib/clocktypes.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Data for pretty printing clock types - */ -#include <stdio.h> - -#include "ntp_fp.h" -#include "ntp.h" -#include "lib_strbuf.h" -#include "ntp_refclock.h" - -struct clktype clktypes[] = { - { REFCLK_NONE, "unspecified type (0)", - "UNKNOWN" }, - { REFCLK_LOCALCLOCK, "Undisciplined local clock (1)", - "LOCAL" }, - { REFCLK_GPS_TRAK, "TRAK 8810 GPS Receiver (2)", - "GPS_TRAK" }, - { REFCLK_WWV_PST, "PSTI/Traconex WWV/WWVH Receiver (3)", - "WWV_PST" }, - { REFCLK_WWVB_SPECTRACOM, "Spectracom WWVB Receiver (4)", - "WWVB_SPEC" }, - { REFCLK_GOES_TRUETIME, "TrueTime GPS/GOES Receivers (5)", - "GPS_GOES_TRUE" }, - { REFCLK_IRIG_AUDIO, "IRIG Audio Decoder (6)", - "IRIG_AUDIO" }, - { REFCLK_CHU, "Scratchbuilt CHU Receiver (7)", - "CHU" }, - { REFCLK_PARSE, "Generic reference clock driver (8)", - "GENERIC" }, - { REFCLK_GPS_MX4200, "Magnavox MX4200 GPS Receiver (9)", - "GPS_MX4200" }, - { REFCLK_GPS_AS2201, "Austron 2201A GPS Receiver (10)", - "GPS_AS2201" }, - { REFCLK_OMEGA_TRUETIME, "TrueTime OM-DC OMEGA Receiver (11)", - "OMEGA_TRUE" }, - { REFCLK_IRIG_TPRO, "KSI/Odetics TPRO/S IRIG Interface (12)", - "IRIG_TPRO" }, - { REFCLK_ATOM_LEITCH, "Leitch CSD 5300 Master Clock Controller (13)", - "ATOM_LEITCH" }, - { REFCLK_MSF_EES, "EES M201 MSF Receiver (14)", - "MSF_EES" }, - { REFCLK_GPSTM_TRUETIME, "TrueTime GPS/TM-TMD Receiver (15)", - "GPS_TRUE" }, - { REFCLK_IRIG_BANCOMM, "Bancomm GPS/IRIG Receiver (16)", - "GPS_BANC" }, - { REFCLK_GPS_DATUM, "Datum Precision Time System (17)", - "GPS_DATUM" }, - { REFCLK_NIST_ACTS, "NIST Automated Computer Time Service (18)", - "NIST_ACTS" }, - { REFCLK_WWV_HEATH, "Heath WWV/WWVH Receiver (19)", - "WWV_HEATH" }, - { REFCLK_GPS_NMEA, "Generic NMEA GPS Receiver (20)", - "GPS_NMEA" }, - { REFCLK_GPS_MOTO, "Motorola Six Gun GPS Receiver (21)", - "GPS_MOTO" }, - { REFCLK_ATOM_PPS, "PPS Clock Discipline (22)", - "ATOM_PPS" }, - { -1, "", "" } -}; - -const char * -clockname(num) - int num; -{ - register struct clktype *clk; - - for (clk = clktypes; clk->code != -1; clk++) { - if (num == clk->code) - return (clk->abbrev); - } - return (NULL); -} diff --git a/usr.sbin/xntpd/lib/decodenetnum.c b/usr.sbin/xntpd/lib/decodenetnum.c deleted file mode 100644 index f19b1376c8e3..000000000000 --- a/usr.sbin/xntpd/lib/decodenetnum.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * decodenetnum - return a net number (this is crude, but careful) - */ -#include <sys/types.h> -#include <ctype.h> -#include <sys/socket.h> -#include <netinet/in.h> - -#include "ntp_stdlib.h" - -int -decodenetnum(num, netnum) - const char *num; - u_long *netnum; -{ - register const char *cp; - register char *bp; - register int i; - register int temp; - register int eos; - char buf[80]; /* will core dump on really stupid stuff */ - - cp = num; - *netnum = 0; - - if (*cp == '[') { - eos = ']'; - cp++; - } else { - eos = '\0'; - } - - for (i = 0; i < 4; i++) { - bp = buf; - while (isdigit(*cp)) - *bp++ = *cp++; - if (bp == buf) - break; - - if (i < 3) { - if (*cp++ != '.') - break; - } else if (*cp != eos) - break; - - *bp = '\0'; - temp = atoi(buf); - if (temp > 255) - break; - *netnum <<= 8; - *netnum += temp; - } - - if (i < 4) - return 0; - *netnum = htonl(*netnum); - return 1; -} diff --git a/usr.sbin/xntpd/lib/dofptoa.c b/usr.sbin/xntpd/lib/dofptoa.c deleted file mode 100644 index bfa9c713fe02..000000000000 --- a/usr.sbin/xntpd/lib/dofptoa.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * dofptoa - do the grunge work to convert an fp number to ascii - */ -#include <stdio.h> - -#include "ntp_fp.h" -#include "lib_strbuf.h" -#include "ntp_string.h" -#include "ntp_stdlib.h" - -char * -dofptoa(fpv, neg, ndec, msec) - u_fp fpv; - int neg; - int ndec; - int msec; -{ - register u_char *cp, *cpend; - register u_long val; - register short dec; - u_char cbuf[12]; - u_char *cpdec; - char *buf; - char *bp; - - /* - * Get a string buffer before starting - */ - LIB_GETBUF(buf); - - /* - * Zero out the buffer - */ - memset((char *)cbuf, 0, sizeof cbuf); - - /* - * Set the pointers to point at the first - * decimal place. Get a local copy of the value. - */ - cp = cpend = &cbuf[5]; - val = fpv; - - /* - * If we have to, decode the integral part - */ - if (!(val & 0xffff0000)) - cp--; - else { - register u_short sv = (u_short)(val >> 16); - register u_short tmp; - register u_short ten = 10; - - do { - tmp = sv; - sv /= ten; - *(--cp) = tmp - ((sv<<3) + (sv<<1)); - } while (sv != 0); - } - - /* - * Figure out how much of the fraction to do - */ - if (msec) { - dec = ndec + 3; - if (dec < 3) - dec = 3; - cpdec = &cbuf[8]; - } else { - dec = ndec; - cpdec = cpend; - } - - if (dec > 6) - dec = 6; - - if (dec > 0) { - do { - val &= 0xffff; - val = (val << 3) + (val << 1); - *cpend++ = (u_char)(val >> 16); - } while (--dec > 0); - } - - if (val & 0x8000) { - register u_char *tp; - /* - * Round it. Ick. - */ - tp = cpend; - *(--tp) += 1; - while (*tp >= 10) { - *tp = 0; - *(--tp) += 1; - } - } - - /* - * Remove leading zeroes if necessary - */ - while (cp < (cpdec -1) && *cp == 0) - cp++; - - /* - * Copy it into the buffer, asciizing as we go. - */ - bp = buf; - if (neg) - *bp++ = '-'; - - while (cp < cpend) { - if (cp == cpdec) - *bp++ = '.'; - *bp++ = (char)(*cp++ + '0'); - } - *bp = '\0'; - return buf; -} diff --git a/usr.sbin/xntpd/lib/dolfptoa.c b/usr.sbin/xntpd/lib/dolfptoa.c deleted file mode 100644 index 24fc2138d787..000000000000 --- a/usr.sbin/xntpd/lib/dolfptoa.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * dolfptoa - do the grunge work of converting an l_fp number to decimal - */ -#include <stdio.h> - -#include "ntp_fp.h" -#include "lib_strbuf.h" -#include "ntp_string.h" -#include "ntp_stdlib.h" - -char * -dolfptoa(fpi, fpv, neg, ndec, msec) - u_long fpi; - u_long fpv; - int neg; - int ndec; - int msec; -{ - register u_char *cp, *cpend; - register u_long lwork; - register int dec; - u_char cbuf[24]; - u_char *cpdec; - char *buf; - char *bp; - - /* - * Get a string buffer before starting - */ - LIB_GETBUF(buf); - - /* - * Zero the character buffer - */ - memset((char *) cbuf, 0, sizeof(cbuf)); - - /* - * Work on the integral part. This is biased by what I know - * compiles fairly well for a 68000. - */ - cp = cpend = &cbuf[10]; - lwork = fpi; - if (lwork & 0xffff0000) { - register u_long lten = 10; - register u_long ltmp; - - do { - ltmp = lwork; - lwork /= lten; - ltmp -= (lwork << 3) + (lwork << 1); - *--cp = (u_char)ltmp; - } while (lwork & 0xffff0000); - } - if (lwork != 0) { - register u_short sten = 10; - register u_short stmp; - register u_short swork = (u_short)lwork; - - do { - stmp = swork; - swork /= sten; - stmp -= (swork<<3) + (swork<<1); - *--cp = (u_char)stmp; - } while (swork != 0); - } - - /* - * Done that, now deal with the problem of the fraction. First - * determine the number of decimal places. - */ - if (msec) { - dec = ndec + 3; - if (dec < 3) - dec = 3; - cpdec = &cbuf[13]; - } else { - dec = ndec; - if (dec < 0) - dec = 0; - cpdec = &cbuf[10]; - } - if (dec > 12) - dec = 12; - - /* - * If there's a fraction to deal with, do so. - */ - if (fpv != 0) { - l_fp work; - - work.l_ui = 0; - work.l_uf = fpv; - while (dec > 0) { - l_fp ftmp; - - dec--; - /* - * The scheme here is to multiply the - * fraction (0.1234...) by ten. This moves - * a junk of BCD into the units part. - * record that and iterate. - */ - work.l_ui = 0; - L_LSHIFT(&work); - ftmp = work; - L_LSHIFT(&work); - L_LSHIFT(&work); - L_ADD(&work, &ftmp); - *cpend++ = (u_char)work.l_ui; - if (work.l_uf == 0) - break; - } - - /* - * Rounding is rotten - */ - if (work.l_uf & 0x80000000) { - register u_char *tp = cpend; - - *(--tp) += 1; - while (*tp >= 10) { - *tp = 0; - *(--tp) += 1; - }; - if (tp < cp) - cp = tp; - } - } - cpend += dec; - - - /* - * We've now got the fraction in cbuf[], with cp pointing at - * the first character, cpend pointing past the last, and - * cpdec pointing at the first character past the decimal. - * Remove leading zeros, then format the number into the - * buffer. - */ - while (cp < cpdec) { - if (*cp != 0) - break; - cp++; - } - if (cp == cpdec) - --cp; - - bp = buf; - if (neg) - *bp++ = '-'; - while (cp < cpend) { - if (cp == cpdec) - *bp++ = '.'; - *bp++ = (char)(*cp++ + '0'); /* ascii dependent? */ - } - *bp = '\0'; - - /* - * Done! - */ - return buf; -} diff --git a/usr.sbin/xntpd/lib/emalloc.c b/usr.sbin/xntpd/lib/emalloc.c deleted file mode 100644 index 61d4cb6a9786..000000000000 --- a/usr.sbin/xntpd/lib/emalloc.c +++ /dev/null @@ -1,20 +0,0 @@ -/* - * emalloc - return new memory obtained from the system. Belch if none. - */ -#include "ntp_types.h" -#include "ntp_malloc.h" -#include "ntp_stdlib.h" -#include "ntp_syslog.h" - -char * -emalloc(size) - u_int size; -{ - char *mem; - - if ((mem = (char *)malloc(size)) == 0) { - syslog(LOG_ERR, "No more memory!"); - exit(1); - } - return mem; -} diff --git a/usr.sbin/xntpd/lib/findconfig.c b/usr.sbin/xntpd/lib/findconfig.c deleted file mode 100755 index a65f32c0b2fc..000000000000 --- a/usr.sbin/xntpd/lib/findconfig.c +++ /dev/null @@ -1,62 +0,0 @@ -#ifdef SYS_HPUX -#include <string.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/utsname.h> - -char * -FindConfig(base) - char *base; -{ - static char result[BUFSIZ]; - char hostname[BUFSIZ], *cp; - struct stat sbuf; - struct utsname unamebuf; - - /* All keyed by initial target being a directory */ - (void) strcpy(result, base); - if (stat(result, &sbuf) == 0) { - if (S_ISDIR(sbuf.st_mode)) { - - /* First choice is my hostname */ - if (gethostname(hostname, BUFSIZ) >= 0) { - (void) sprintf(result, "%s/%s", base, hostname); - if (stat(result, &sbuf) == 0) { - goto outahere; - } else { - - /* Second choice is of form default.835 */ - (void) uname(&unamebuf); - if (strncmp(unamebuf.machine, "9000/", 5) == 0) - cp = unamebuf.machine + 5; - else - cp = unamebuf.machine; - (void) sprintf(result, "%s/default.%s", base, cp); - if (stat(result, &sbuf) == 0) { - goto outahere; - } else { - - /* Last choice is just default */ - (void) sprintf(result, "%s/default", base); - if (stat(result, &sbuf) == 0) { - goto outahere; - } else { - (void) strcpy(result, "/not/found"); - } - } - } - } - } - } -outahere: - return(result); -} -#else -char * -FindConfig(base) - char *base; -{ - return base; -} -#endif diff --git a/usr.sbin/xntpd/lib/fptoa.c b/usr.sbin/xntpd/lib/fptoa.c deleted file mode 100644 index b0d7a1484ebb..000000000000 --- a/usr.sbin/xntpd/lib/fptoa.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * fptoa - return an asciized representation of an s_fp number - */ -#include "ntp_fp.h" -#include "ntp_stdlib.h" - -char * -fptoa(fpv, ndec) - s_fp fpv; - int ndec; -{ - u_fp plusfp; - int neg; - - if (fpv < 0) { - plusfp = (u_fp)(-fpv); - neg = 1; - } else { - plusfp = (u_fp)fpv; - neg = 0; - } - - return dofptoa(plusfp, neg, ndec, 0); -} diff --git a/usr.sbin/xntpd/lib/fptoms.c b/usr.sbin/xntpd/lib/fptoms.c deleted file mode 100644 index f8ae6ba64e33..000000000000 --- a/usr.sbin/xntpd/lib/fptoms.c +++ /dev/null @@ -1,23 +0,0 @@ -/* - * fptoms - return an asciized s_fp number in milliseconds - */ -#include "ntp_fp.h" - -char * -fptoms(fpv, ndec) - s_fp fpv; - int ndec; -{ - u_fp plusfp; - int neg; - - if (fpv < 0) { - plusfp = (u_fp)(-fpv); - neg = 1; - } else { - plusfp = (u_fp)fpv; - neg = 0; - } - - return dofptoa(plusfp, neg, ndec, 1); -} diff --git a/usr.sbin/xntpd/lib/getopt.c b/usr.sbin/xntpd/lib/getopt.c deleted file mode 100644 index b5164c608ac3..000000000000 --- a/usr.sbin/xntpd/lib/getopt.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * getopt - get option letter from argv - * - * This is a version of the public domain getopt() implementation by - * Henry Spencer, changed for 4.3BSD compatibility (in addition to System V). - * It allows rescanning of an option list by setting optind to 0 before - * calling, which is why we use it even if the system has its own (in fact, - * this one has a unique name so as not to conflict with the system's). - * Thanks to Dennis Ferguson for the appropriate modifications. - * - * This file is in the Public Domain. - */ - -/*LINTLIBRARY*/ - -#include <stdio.h> - -#include "ntp_stdlib.h" - -#ifdef lint -#undef putc -#define putc fputc -#endif /* lint */ - -char *ntp_optarg; /* Global argument pointer. */ -int ntp_optind = 0; /* Global argv index. */ -int ntp_opterr = 1; /* for compatibility, should error be printed? */ -int ntp_optopt; /* for compatibility, option character checked */ - -static char *scan = NULL; /* Private scan pointer. */ -static char *prog = "amnesia"; - -/* - * Print message about a bad option. - */ -static int -badopt(mess, ch) - char *mess; - int ch; -{ - if (ntp_opterr) { - fputs(prog, stderr); - fputs(mess, stderr); - (void) putc(ch, stderr); - (void) putc('\n', stderr); - } - return ('?'); -} - -int -ntp_getopt(argc, argv, optstring) - int argc; - char *argv[]; - char *optstring; -{ - register char c; - register char *place; - - prog = argv[0]; - ntp_optarg = NULL; - - if (ntp_optind == 0) { - scan = NULL; - ntp_optind++; - } - - if (scan == NULL || *scan == '\0') { - if (ntp_optind >= argc - || argv[ntp_optind][0] != '-' - || argv[ntp_optind][1] == '\0') { - return (EOF); - } - if (argv[ntp_optind][1] == '-' - && argv[ntp_optind][2] == '\0') { - ntp_optind++; - return (EOF); - } - - scan = argv[ntp_optind++]+1; - } - - c = *scan++; - ntp_optopt = c & 0377; - for (place = optstring; place != NULL && *place != '\0'; ++place) - if (*place == c) - break; - - if (place == NULL || *place == '\0' || c == ':' || c == '?') { - return (badopt(": unknown option -", c)); - } - - place++; - if (*place == ':') { - if (*scan != '\0') { - ntp_optarg = scan; - scan = NULL; - } else if (ntp_optind >= argc) { - return (badopt(": option requires argument -", c)); - } else { - ntp_optarg = argv[ntp_optind++]; - } - } - - return (c & 0377); -} diff --git a/usr.sbin/xntpd/lib/gettstamp.c b/usr.sbin/xntpd/lib/gettstamp.c deleted file mode 100644 index 53b124a80ee1..000000000000 --- a/usr.sbin/xntpd/lib/gettstamp.c +++ /dev/null @@ -1,29 +0,0 @@ -/* - * gettstamp - return the system time in timestamp format - */ -#include <stdio.h> -#include <sys/time.h> - -#include "ntp_fp.h" -#include "ntp_unixtime.h" -#include "ntp_stdlib.h" - -void -gettstamp(ts) - l_fp *ts; -{ - struct timeval tv; - - /* - * Quickly get the time of day and convert it - */ - (void) GETTIMEOFDAY(&tv, (struct timezone *)NULL); - if (tv.tv_usec >= 1000000) { /* bum solaris */ - tv.tv_usec -= 1000000; - tv.tv_sec++; - } - TVTOTS(&tv, ts); - ts->l_uf += TS_ROUNDBIT; /* guaranteed not to overflow */ - ts->l_ui += JAN_1970; - ts->l_uf &= TS_MASK; -} diff --git a/usr.sbin/xntpd/lib/hextoint.c b/usr.sbin/xntpd/lib/hextoint.c deleted file mode 100644 index 23f8c08464f8..000000000000 --- a/usr.sbin/xntpd/lib/hextoint.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * hextoint - convert an ascii string in hex to an unsigned - * long, with error checking - */ -#include <ctype.h> - -#include "ntp_stdlib.h" - -int -hextoint(str, ival) - const char *str; - u_long *ival; -{ - register u_long u; - register const char *cp; - - cp = str; - - if (*cp == '\0') - return 0; - - u = 0; - while (*cp != '\0') { - if (!isxdigit(*cp)) - return 0; - if (u >= 0x10000000) - return 0; /* overflow */ - u <<= 4; - if (*cp <= '9') /* very ascii dependent */ - u += *cp++ - '0'; - else if (*cp >= 'a') - u += *cp++ - 'a' + 10; - else - u += *cp++ - 'A' + 10; - } - *ival = u; - return 1; -} diff --git a/usr.sbin/xntpd/lib/hextolfp.c b/usr.sbin/xntpd/lib/hextolfp.c deleted file mode 100644 index 104446c9f963..000000000000 --- a/usr.sbin/xntpd/lib/hextolfp.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * hextolfp - convert an ascii hex string to an l_fp number - */ -#include <stdio.h> -#include <ctype.h> - -#include "ntp_fp.h" -#include "ntp_string.h" -#include "ntp_stdlib.h" - -int -hextolfp(str, lfp) - const char *str; - l_fp *lfp; -{ - register const char *cp; - register const char *cpstart; - register u_long dec_i; - register u_long dec_f; - char *ind = NULL; - static char *digits = "0123456789abcdefABCDEF"; - - dec_i = dec_f = 0; - cp = str; - - /* - * We understand numbers of the form: - * - * [spaces]8_hex_digits[.]8_hex_digits[spaces|\n|\0] - */ - while (isspace(*cp)) - cp++; - - cpstart = cp; - while (*cp != '\0' && (cp - cpstart) < 8 && - (ind = strchr(digits, *cp)) != NULL) { - dec_i = dec_i << 4; /* multiply by 16 */ - dec_i += ((ind - digits) > 15) ? (ind - digits) - 6 - : (ind - digits); - cp++; - } - - if ((cp - cpstart) < 8 || ind == NULL) - return 0; - if (*cp == '.') - cp++; - - cpstart = cp; - while (*cp != '\0' && (cp - cpstart) < 8 && - (ind = strchr(digits, *cp)) != NULL) { - dec_f = dec_f << 4; /* multiply by 16 */ - dec_f += ((ind - digits) > 15) ? (ind - digits) - 6 - : (ind - digits); - cp++; - } - - if ((cp - cpstart) < 8 || ind == NULL) - return 0; - - if (*cp != '\0' && !isspace(*cp)) - return 0; - - lfp->l_ui = dec_i; - lfp->l_uf = dec_f; - return 1; -} diff --git a/usr.sbin/xntpd/lib/humandate.c b/usr.sbin/xntpd/lib/humandate.c deleted file mode 100644 index b7b89bc6ec4f..000000000000 --- a/usr.sbin/xntpd/lib/humandate.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * humandate - convert an NTP (or the current) time to something readable - */ -#include <stdio.h> - -#include "ntp_fp.h" -#include "ntp_unixtime.h" -#include "lib_strbuf.h" -#include "ntp_stdlib.h" - -#ifdef NTP_POSIX_SOURCE -#include <time.h> -#endif - -static char *months[] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -}; -static char *days[] = { - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" -}; - -char * -humandate(ntptime) - u_long ntptime; -{ - char *bp; - struct tm *tm; - time_t sec; - - LIB_GETBUF(bp); - - sec = ntptime - JAN_1970; - tm = localtime(&sec); - - (void) sprintf(bp, "%s, %s %2d %4d %2d:%02d:%02d", - days[tm->tm_wday], months[tm->tm_mon], tm->tm_mday, - 1900+tm->tm_year, tm->tm_hour, tm->tm_min, tm->tm_sec); - - return bp; -} - - -/* This is used in msyslog.c; we don't want to clutter up the log with - the year and day of the week, etc.; just the minimal date and time. */ - -char * -humanlogtime() -{ - char *bp; - time_t cursec = time((time_t *) 0); - struct tm *tm = localtime(&cursec); - - LIB_GETBUF(bp); - - (void) sprintf(bp, "%2d %s %02d:%02d:%02d", - tm->tm_mday, months[tm->tm_mon], - tm->tm_hour, tm->tm_min, tm->tm_sec); - - return bp; -} diff --git a/usr.sbin/xntpd/lib/inttoa.c b/usr.sbin/xntpd/lib/inttoa.c deleted file mode 100644 index ff886f592a84..000000000000 --- a/usr.sbin/xntpd/lib/inttoa.c +++ /dev/null @@ -1,19 +0,0 @@ -/* - * inttoa - return an asciized signed integer - */ -#include <stdio.h> - -#include "lib_strbuf.h" -#include "ntp_stdlib.h" - -char * -inttoa(ival) - long ival; -{ - register char *buf; - - LIB_GETBUF(buf); - - (void) sprintf(buf, "%ld", (long)ival); - return buf; -} diff --git a/usr.sbin/xntpd/lib/lib_strbuf.c b/usr.sbin/xntpd/lib/lib_strbuf.c deleted file mode 100644 index 47df66decd21..000000000000 --- a/usr.sbin/xntpd/lib/lib_strbuf.c +++ /dev/null @@ -1,21 +0,0 @@ -/* - * lib_strbuf - library string storage - */ - -#include "lib_strbuf.h" - -/* - * Storage declarations - */ -char lib_stringbuf[LIB_NUMBUFS][LIB_BUFLENGTH]; -int lib_nextbuf; - - -/* - * initialization routine. Might be needed if the code is ROMized. - */ -void -init_lib() -{ - lib_nextbuf = 0; -} diff --git a/usr.sbin/xntpd/lib/lib_strbuf.h b/usr.sbin/xntpd/lib/lib_strbuf.h deleted file mode 100644 index 699b9787323b..000000000000 --- a/usr.sbin/xntpd/lib/lib_strbuf.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * lib_strbuf.h - definitions for routines which use the common string buffers - */ - -/* - * Sizes of things - */ -#define LIB_NUMBUFS 20 -#define LIB_BUFLENGTH 80 - -/* - * Macro to get a pointer to the next buffer - */ -#define LIB_GETBUF(buf) \ - do { \ - buf = &lib_stringbuf[lib_nextbuf][0]; \ - if (++lib_nextbuf >= LIB_NUMBUFS) \ - lib_nextbuf = 0; \ - } while (0) - -extern char lib_stringbuf[LIB_NUMBUFS][LIB_BUFLENGTH]; -extern int lib_nextbuf; diff --git a/usr.sbin/xntpd/lib/machines.c b/usr.sbin/xntpd/lib/machines.c deleted file mode 100644 index b6cd04b7f7df..000000000000 --- a/usr.sbin/xntpd/lib/machines.c +++ /dev/null @@ -1,61 +0,0 @@ -/* machines.c - provide special support for peculiar architectures - * - * Real bummers unite ! - * - * $FreeBSD$ - */ - -#include "ntp_stdlib.h" - -#ifdef SYS_PTX -#include <sys/types.h> -#include <sys/procstats.h> - -int -settimeofday(tvp) - struct timeval *tvp; -{ - return (stime(&tvp->tv_sec)); /* lie as bad as SysVR4 */ -} - -int -gettimeofday(tvp) - struct timeval *tvp; -{ - /* - * hi, this is Sequents sneak path to get to a clock - * this is also the most logical syscall for such a function - */ - return (get_process_stats(tvp, PS_SELF, (struct procstats *) 0, - (struct procstats *) 0)); -} -#endif - -#if !defined(NTP_POSIX_SOURCE) || defined(NTP_NEED_BOPS) -void -ntp_memset(a, x, c) - char *a; - int x, c; -{ - while (c-- > 0) - *a++ = x; -} -#endif /*POSIX*/ - -#if defined(USE_CLOCK_SETTIME) - -#include <time.h> - -int -settimeofday(tvp) - struct timeval *tvp; -{ - struct timespec ts; - - /* Convert timeval to timespec */ - ts.tv_sec = tvp->tv_sec; - ts.tv_nsec = 1000 * tvp->tv_usec; - - return clock_settime(CLOCK_REALTIME, &ts); -} -#endif /* USE_CLOCK_SETTIME */ diff --git a/usr.sbin/xntpd/lib/md5.c b/usr.sbin/xntpd/lib/md5.c deleted file mode 100644 index a5aca7a2584f..000000000000 --- a/usr.sbin/xntpd/lib/md5.c +++ /dev/null @@ -1,322 +0,0 @@ -/* - *********************************************************************** - ** md5.c -- the source code for MD5 routines ** - ** RSA Data Security, Inc. MD5 Message-Digest Algorithm ** - ** Created: 2/17/90 RLR ** - ** Revised: 1/91 SRD,AJ,BSK,JT Reference C Version ** - ** Revised (for MD5): RLR 4/27/91 ** - ** -- G modified to have y&~z instead of y&z ** - ** -- FF, GG, HH modified to add in last register done ** - ** -- Access pattern: round 2 works mod 5, round 3 works mod 3 ** - ** -- distinct additive constant for each step ** - ** -- round 4 added, working mod 7 ** - *********************************************************************** - */ - -/* - *********************************************************************** - ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. ** - ** ** - ** License to copy and use this software is granted provided that ** - ** it is identified as the "RSA Data Security, Inc. MD5 Message- ** - ** Digest Algorithm" in all material mentioning or referencing this ** - ** software or this function. ** - ** ** - ** License is also granted to make and use derivative works ** - ** provided that such works are identified as "derived from the RSA ** - ** Data Security, Inc. MD5 Message-Digest Algorithm" in all ** - ** material mentioning or referencing the derived work. ** - ** ** - ** RSA Data Security, Inc. makes no representations concerning ** - ** either the merchantability of this software or the suitability ** - ** of this software for any particular purpose. It is provided "as ** - ** is" without express or implied warranty of any kind. ** - ** ** - ** These notices must be retained in any copies of any part of this ** - ** documentation and/or software. ** - *********************************************************************** - */ - -#include "md5.h" - -/* - *********************************************************************** - ** Message-digest routines: ** - ** To form the message digest for a message M ** - ** (1) Initialize a context buffer mdContext using MD5Init ** - ** (2) Call MD5Update on mdContext and M ** - ** (3) Call MD5Final on mdContext ** - ** The message digest is now in mdContext->digest[0...15] ** - *********************************************************************** - */ - -/* forward declaration */ -static void Transform (); - -#ifdef __STDC__ -static const -#else -static -#endif -unsigned char PADDING[64] = { - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -/* F, G, H and I are basic MD5 functions */ -#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) -#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) -#define H(x, y, z) ((x) ^ (y) ^ (z)) -#define I(x, y, z) ((y) ^ ((x) | (~z))) - -/* ROTATE_LEFT rotates x left n bits */ -#if defined(FAST_MD5) && defined(__GNUC__) && defined(mc68000) -/* - * If we're on a 68000 based CPU and using a GNU C compiler with - * inline assembly code, we can speed this up a bit. - */ -inline UINT4 ROTATE_LEFT(UINT4 x, int n) -{ - asm("roll %2,%0" : "=d" (x) : "0" (x), "Ir" (n)); - return x; -} -#else -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) -#endif - - -/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */ -/* Rotation is separate from addition to prevent recomputation */ -#define FF(a, b, c, d, x, s, ac) \ - {(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - } -#define GG(a, b, c, d, x, s, ac) \ - {(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - } -#define HH(a, b, c, d, x, s, ac) \ - {(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - } -#define II(a, b, c, d, x, s, ac) \ - {(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - } - -/* The routine MD5Init initializes the message-digest context - mdContext. All fields are set to zero. - */ -void MD5Init (mdContext) -MD5_CTX *mdContext; -{ - mdContext->i[0] = mdContext->i[1] = (UINT4)0; - - /* Load magic initialization constants. - */ - mdContext->buf[0] = (UINT4)0x67452301; - mdContext->buf[1] = (UINT4)0xefcdab89; - mdContext->buf[2] = (UINT4)0x98badcfe; - mdContext->buf[3] = (UINT4)0x10325476; -} - -/* The routine MD5Update updates the message-digest context to - account for the presence of each of the characters inBuf[0..inLen-1] - in the message whose digest is being computed. - */ -void MD5Update (mdContext, inBuf, inLen) -MD5_CTX *mdContext; -unsigned char *inBuf; -unsigned int inLen; -{ - UINT4 in[16]; - int mdi; - unsigned int i, ii; - - /* compute number of bytes mod 64 */ - mdi = (int)((mdContext->i[0] >> 3) & 0x3F); - - /* update number of bits */ - if ((mdContext->i[0] + ((UINT4)inLen << 3)) < mdContext->i[0]) - mdContext->i[1]++; - mdContext->i[0] += ((UINT4)inLen << 3); - mdContext->i[1] += ((UINT4)inLen >> 29); - - while (inLen--) { - /* add new character to buffer, increment mdi */ - mdContext->in[mdi++] = *inBuf++; - - /* transform if necessary */ - if (mdi == 0x40) { - for (i = 0, ii = 0; i < 16; i++, ii += 4) - in[i] = (((UINT4)mdContext->in[ii+3]) << 24) | - (((UINT4)mdContext->in[ii+2]) << 16) | - (((UINT4)mdContext->in[ii+1]) << 8) | - ((UINT4)mdContext->in[ii]); - Transform (mdContext->buf, in); - mdi = 0; - } - } -} - -/* The routine MD5Final terminates the message-digest computation and - ends with the desired message digest in mdContext->digest[0...15]. - */ - -void MD5Final (mdContext) -MD5_CTX *mdContext; -{ - UINT4 in[16]; - int mdi; - unsigned int i, ii; - unsigned int padLen; - - /* save number of bits */ - in[14] = mdContext->i[0]; - in[15] = mdContext->i[1]; - - /* compute number of bytes mod 64 */ - mdi = (int)((mdContext->i[0] >> 3) & 0x3F); - - /* pad out to 56 mod 64 */ - padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi); - MD5Update (mdContext, PADDING, padLen); - - /* append length in bits and transform */ - for (i = 0, ii = 0; i < 14; i++, ii += 4) - in[i] = (((UINT4)mdContext->in[ii+3]) << 24) | - (((UINT4)mdContext->in[ii+2]) << 16) | - (((UINT4)mdContext->in[ii+1]) << 8) | - ((UINT4)mdContext->in[ii]); - Transform (mdContext->buf, in); - - /* store buffer in digest */ - for (i = 0, ii = 0; i < 4; i++, ii += 4) { - mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xFF); - mdContext->digest[ii+1] = - (unsigned char)((mdContext->buf[i] >> 8) & 0xFF); - mdContext->digest[ii+2] = - (unsigned char)((mdContext->buf[i] >> 16) & 0xFF); - mdContext->digest[ii+3] = - (unsigned char)((mdContext->buf[i] >> 24) & 0xFF); - } -} - -/* Basic MD5 step. Transforms buf based on in. - */ -static void Transform (buf, in) -UINT4 *buf; -UINT4 *in; -{ - UINT4 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; - - /* Round 1 */ -#define S11 7 -#define S12 12 -#define S13 17 -#define S14 22 - - FF ( a, b, c, d, in[ 0], S11, 0xd76aa478); /* 1 */ - FF ( d, a, b, c, in[ 1], S12, 0xe8c7b756); /* 2 */ - FF ( c, d, a, b, in[ 2], S13, 0x242070db); /* 3 */ - FF ( b, c, d, a, in[ 3], S14, 0xc1bdceee); /* 4 */ - FF ( a, b, c, d, in[ 4], S11, 0xf57c0faf); /* 5 */ - FF ( d, a, b, c, in[ 5], S12, 0x4787c62a); /* 6 */ - FF ( c, d, a, b, in[ 6], S13, 0xa8304613); /* 7 */ - FF ( b, c, d, a, in[ 7], S14, 0xfd469501); /* 8 */ - FF ( a, b, c, d, in[ 8], S11, 0x698098d8); /* 9 */ - FF ( d, a, b, c, in[ 9], S12, 0x8b44f7af); /* 10 */ - FF ( c, d, a, b, in[10], S13, 0xffff5bb1); /* 11 */ - FF ( b, c, d, a, in[11], S14, 0x895cd7be); /* 12 */ - FF ( a, b, c, d, in[12], S11, 0x6b901122); /* 13 */ - FF ( d, a, b, c, in[13], S12, 0xfd987193); /* 14 */ - FF ( c, d, a, b, in[14], S13, 0xa679438e); /* 15 */ - FF ( b, c, d, a, in[15], S14, 0x49b40821); /* 16 */ - - /* Round 2 */ -#define S21 5 -#define S22 9 -#define S23 14 -#define S24 20 - GG ( a, b, c, d, in[ 1], S21, 0xf61e2562); /* 17 */ - GG ( d, a, b, c, in[ 6], S22, 0xc040b340); /* 18 */ - GG ( c, d, a, b, in[11], S23, 0x265e5a51); /* 19 */ - GG ( b, c, d, a, in[ 0], S24, 0xe9b6c7aa); /* 20 */ - GG ( a, b, c, d, in[ 5], S21, 0xd62f105d); /* 21 */ - GG ( d, a, b, c, in[10], S22, 0x2441453); /* 22 */ - GG ( c, d, a, b, in[15], S23, 0xd8a1e681); /* 23 */ - GG ( b, c, d, a, in[ 4], S24, 0xe7d3fbc8); /* 24 */ - GG ( a, b, c, d, in[ 9], S21, 0x21e1cde6); /* 25 */ - GG ( d, a, b, c, in[14], S22, 0xc33707d6); /* 26 */ - GG ( c, d, a, b, in[ 3], S23, 0xf4d50d87); /* 27 */ - GG ( b, c, d, a, in[ 8], S24, 0x455a14ed); /* 28 */ - GG ( a, b, c, d, in[13], S21, 0xa9e3e905); /* 29 */ - GG ( d, a, b, c, in[ 2], S22, 0xfcefa3f8); /* 30 */ - GG ( c, d, a, b, in[ 7], S23, 0x676f02d9); /* 31 */ - GG ( b, c, d, a, in[12], S24, 0x8d2a4c8a); /* 32 */ - - /* Round 3 */ -#define S31 4 -#define S32 11 -#define S33 16 -#define S34 23 - HH ( a, b, c, d, in[ 5], S31, 0xfffa3942); /* 33 */ - HH ( d, a, b, c, in[ 8], S32, 0x8771f681); /* 34 */ - HH ( c, d, a, b, in[11], S33, 0x6d9d6122); /* 35 */ - HH ( b, c, d, a, in[14], S34, 0xfde5380c); /* 36 */ - HH ( a, b, c, d, in[ 1], S31, 0xa4beea44); /* 37 */ - HH ( d, a, b, c, in[ 4], S32, 0x4bdecfa9); /* 38 */ - HH ( c, d, a, b, in[ 7], S33, 0xf6bb4b60); /* 39 */ - HH ( b, c, d, a, in[10], S34, 0xbebfbc70); /* 40 */ - HH ( a, b, c, d, in[13], S31, 0x289b7ec6); /* 41 */ - HH ( d, a, b, c, in[ 0], S32, 0xeaa127fa); /* 42 */ - HH ( c, d, a, b, in[ 3], S33, 0xd4ef3085); /* 43 */ - HH ( b, c, d, a, in[ 6], S34, 0x4881d05); /* 44 */ - HH ( a, b, c, d, in[ 9], S31, 0xd9d4d039); /* 45 */ - HH ( d, a, b, c, in[12], S32, 0xe6db99e5); /* 46 */ - HH ( c, d, a, b, in[15], S33, 0x1fa27cf8); /* 47 */ - HH ( b, c, d, a, in[ 2], S34, 0xc4ac5665); /* 48 */ - - /* Round 4 */ -#define S41 6 -#define S42 10 -#define S43 15 -#define S44 21 - II ( a, b, c, d, in[ 0], S41, 0xf4292244); /* 49 */ - II ( d, a, b, c, in[ 7], S42, 0x432aff97); /* 50 */ - II ( c, d, a, b, in[14], S43, 0xab9423a7); /* 51 */ - II ( b, c, d, a, in[ 5], S44, 0xfc93a039); /* 52 */ - II ( a, b, c, d, in[12], S41, 0x655b59c3); /* 53 */ - II ( d, a, b, c, in[ 3], S42, 0x8f0ccc92); /* 54 */ - II ( c, d, a, b, in[10], S43, 0xffeff47d); /* 55 */ - II ( b, c, d, a, in[ 1], S44, 0x85845dd1); /* 56 */ - II ( a, b, c, d, in[ 8], S41, 0x6fa87e4f); /* 57 */ - II ( d, a, b, c, in[15], S42, 0xfe2ce6e0); /* 58 */ - II ( c, d, a, b, in[ 6], S43, 0xa3014314); /* 59 */ - II ( b, c, d, a, in[13], S44, 0x4e0811a1); /* 60 */ - II ( a, b, c, d, in[ 4], S41, 0xf7537e82); /* 61 */ - II ( d, a, b, c, in[11], S42, 0xbd3af235); /* 62 */ - II ( c, d, a, b, in[ 2], S43, 0x2ad7d2bb); /* 63 */ - II ( b, c, d, a, in[ 9], S44, 0xeb86d391); /* 64 */ - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} - -/* - *********************************************************************** - ** End of md5.c ** - ******************************** (cut) ******************************** - */ diff --git a/usr.sbin/xntpd/lib/mfptoa.c b/usr.sbin/xntpd/lib/mfptoa.c deleted file mode 100644 index 7de3b6e13e1a..000000000000 --- a/usr.sbin/xntpd/lib/mfptoa.c +++ /dev/null @@ -1,22 +0,0 @@ -/* - * mfptoa - Return an asciized representation of a signed long fp number - */ -#include "ntp_fp.h" -#include "ntp_stdlib.h" - -char * -mfptoa(fpi, fpf, ndec) - u_long fpi; - u_long fpf; - int ndec; -{ - int isneg; - - if (M_ISNEG(fpi, fpf)) { - isneg = 1; - M_NEG(fpi, fpf); - } else - isneg = 0; - - return dolfptoa(fpi, fpf, isneg, ndec, 0); -} diff --git a/usr.sbin/xntpd/lib/mfptoms.c b/usr.sbin/xntpd/lib/mfptoms.c deleted file mode 100644 index 01a6f09c2e1b..000000000000 --- a/usr.sbin/xntpd/lib/mfptoms.c +++ /dev/null @@ -1,22 +0,0 @@ -/* - * mfptoms - Return an asciized signed long fp number in milliseconds - */ -#include "ntp_fp.h" -#include "ntp_stdlib.h" - -char * -mfptoms(fpi, fpf, ndec) - u_long fpi; - u_long fpf; - int ndec; -{ - int isneg; - - if (M_ISNEG(fpi, fpf)) { - isneg = 1; - M_NEG(fpi, fpf); - } else - isneg = 0; - - return dolfptoa(fpi, fpf, isneg, ndec, 1); -} diff --git a/usr.sbin/xntpd/lib/modetoa.c b/usr.sbin/xntpd/lib/modetoa.c deleted file mode 100644 index e8292b3fb548..000000000000 --- a/usr.sbin/xntpd/lib/modetoa.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * modetoa - return an asciized mode - */ -#include <stdio.h> - -#include "lib_strbuf.h" -#include "ntp_stdlib.h" - -char * -modetoa(mode) - int mode; -{ - char *bp; - static char *modestrings[] = { - "unspec", - "sym_active", - "sym_passive", - "client", - "server", - "broadcast", - "control", - "private", - "bclient", - }; - - if (mode < 0 || mode >= (sizeof modestrings)/sizeof(char *)) { - LIB_GETBUF(bp); - (void)sprintf(bp, "mode#%d", mode); - return bp; - } - - return modestrings[mode]; -} diff --git a/usr.sbin/xntpd/lib/mstolfp.c b/usr.sbin/xntpd/lib/mstolfp.c deleted file mode 100644 index e4c4d469f566..000000000000 --- a/usr.sbin/xntpd/lib/mstolfp.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * mstolfp - convert an ascii string in milliseconds to an l_fp number - */ -#include <stdio.h> -#include <ctype.h> - -#include "ntp_fp.h" -#include "ntp_stdlib.h" - -int -mstolfp(str, lfp) - const char *str; - l_fp *lfp; -{ - register const char *cp; - register char *bp; - register const char *cpdec; - char buf[100]; - - /* - * We understand numbers of the form: - * - * [spaces][-][digits][.][digits][spaces|\n|\0] - * - * This is one enormous hack. Since I didn't feel like - * rewriting the decoding routine for milliseconds, what - * is essentially done here is to make a copy of the string - * with the decimal moved over three places so the seconds - * decoding routine can be used. - */ - bp = buf; - cp = str; - while (isspace(*cp)) - cp++; - - if (*cp == '-') { - *bp++ = '-'; - cp++; - } - - if (*cp != '.' && !isdigit(*cp)) - return 0; - - - /* - * Search forward for the decimal point or the end of the string. - */ - cpdec = cp; - while (isdigit(*cpdec)) - cpdec++; - - /* - * Found something. If we have more than three digits copy the - * excess over, else insert a leading 0. - */ - if ((cpdec - cp) > 3) { - do { - *bp++ = (char)*cp++; - } while ((cpdec - cp) > 3); - } else { - *bp++ = '0'; - } - - /* - * Stick the decimal in. If we've got less than three digits in - * front of the millisecond decimal we insert the appropriate number - * of zeros. - */ - *bp++ = '.'; - if ((cpdec - cp) < 3) { - register int i = 3 - (cpdec - cp); - - do { - *bp++ = '0'; - } while (--i > 0); - } - - /* - * Copy the remainder up to the millisecond decimal. If cpdec - * is pointing at a decimal point, copy in the trailing number too. - */ - while (cp < cpdec) - *bp++ = (char)*cp++; - - if (*cp == '.') { - cp++; - while (isdigit(*cp)) - *bp++ = (char)*cp++; - } - *bp = '\0'; - - /* - * Check to make sure the string is properly terminated. If - * so, give the buffer to the decoding routine. - */ - if (*cp != '\0' && !isspace(*cp)) - return 0; - return atolfp(buf, lfp); -} diff --git a/usr.sbin/xntpd/lib/msutotsf.c b/usr.sbin/xntpd/lib/msutotsf.c deleted file mode 100644 index eb3babe9cd1a..000000000000 --- a/usr.sbin/xntpd/lib/msutotsf.c +++ /dev/null @@ -1,35 +0,0 @@ -/* - * msutotsf - tables for converting from a subsecond millisecond value - * to a time stamp fraction. - */ -#include <sys/types.h> - -#include "ntp_types.h" - -/* - * Index each of these tables with five bits of the (less than) 10 - * bit millisecond value. Note that the tables are rounded (not - * truncated). The error in the result will thus be +-1 low order - * bit in the time stamp fraction. - */ -u_long msutotsflo[32] = { - 0x00000000, 0x00418937, 0x0083126f, 0x00c49ba6, - 0x010624dd, 0x0147ae14, 0x0189374c, 0x01cac083, - 0x020c49ba, 0x024dd2f2, 0x028f5c29, 0x02d0e560, - 0x03126e98, 0x0353f7cf, 0x03958106, 0x03d70a3d, - 0x04189375, 0x045a1cac, 0x049ba5e3, 0x04dd2f1b, - 0x051eb852, 0x05604189, 0x05a1cac1, 0x05e353f8, - 0x0624dd2f, 0x06666666, 0x06a7ef9e, 0x06e978d5, - 0x072b020c, 0x076c8b44, 0x07ae147b, 0x07ef9db2 -}; - -u_long msutotsfhi[32] = { - 0x00000000, 0x083126e9, 0x10624dd3, 0x189374bc, - 0x20c49ba6, 0x28f5c28f, 0x3126e979, 0x39581062, - 0x4189374c, 0x49ba5e35, 0x51eb851f, 0x5a1cac08, - 0x624dd2f2, 0x6a7ef9db, 0x72b020c5, 0x7ae147ae, - 0x83126e98, 0x8b439581, 0x9374bc6a, 0x9ba5e354, - 0xa3d70a3d, 0xac083127, 0xb4395810, 0xbc6a7efa, - 0xc49ba5e3, 0xcccccccd, 0xd4fdf3b6, 0xdd2f1aa0, - 0xe5604189, 0xed916873, 0xf5c28f5c, 0xfdf3b646 -}; diff --git a/usr.sbin/xntpd/lib/msyslog.c b/usr.sbin/xntpd/lib/msyslog.c deleted file mode 100644 index d71b0755d549..000000000000 --- a/usr.sbin/xntpd/lib/msyslog.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * msyslog - either send a message to the terminal or print it on - * the standard output. - * - * Converted to use varargs, much better ... jks - */ -#include <stdio.h> -#include <errno.h> - -/* alternative, as Solaris 2.x defines __STDC__ as 0 in a largely standard - conforming environment - #if __STDC__ || (defined(SOLARIS) && defined(__STDC__)) -*/ -#ifdef __STDC__ -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -#include "ntp_types.h" -#include "ntp_string.h" -#include "ntp_syslog.h" -#include "ntp_stdlib.h" - -#undef syslog - -int syslogit = 1; -FILE *syslog_file = NULL; - -extern int errno; -extern char *progname; - -#if defined(__STDC__) -void msyslog(int level, char *fmt, ...) -#else -/*VARARGS*/ -void msyslog(va_alist) - va_dcl -#endif -{ -#ifndef __STDC__ - int level; - char *fmt; -#endif - va_list ap; - char buf[1025], nfmt[256], xerr[50]; - const char *err; - register int c, l; - register char *n, *f, *prog; -#ifndef SYS_44BSD - extern int sys_nerr; - extern char *sys_errlist[]; -#endif - int olderrno; - -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); - - level = va_arg(ap, int); - fmt = va_arg(ap, char *); -#endif - - olderrno = errno; - n = nfmt; - f = fmt; - while ((c = *f++) != '\0' && c != '\n' && n < &nfmt[252]) { - if (c != '%') { - *n++ = c; - continue; - } - if ((c = *f++) != 'm') { - *n++ = '%'; - *n++ = c; - continue; - } - if ((unsigned)olderrno > sys_nerr) - sprintf((char *)(err = xerr), "error %d", olderrno); - else - err = sys_errlist[olderrno]; - if (n + (l = strlen(err)) < &nfmt[254]) { - strcpy(n, err); - n += strlen(err); - } - } - if (!syslogit) - *n++ = '\n'; - *n = '\0'; - - vsprintf(buf, nfmt, ap); - if (syslogit) - syslog(level, buf); - else { - extern char * humanlogtime P((void)); - - FILE *out_file = syslog_file ? syslog_file - : level <= LOG_ERR ? stderr : stdout; - /* syslog() provides the timestamp, so if we're not using - syslog, we must provide it. */ - prog = strrchr(progname, '/'); - if (prog == NULL) - prog = progname; - else - prog++; - (void) fprintf(out_file, "%s ", humanlogtime ()); - (void) fprintf(out_file, "%s: %s", prog, buf); - fflush (out_file); - } - va_end(ap); -} diff --git a/usr.sbin/xntpd/lib/netof.c b/usr.sbin/xntpd/lib/netof.c deleted file mode 100644 index b8876c72203c..000000000000 --- a/usr.sbin/xntpd/lib/netof.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * netof - return the net address part of an ip address - * (zero out host part) - */ -#include <stdio.h> - -#include "ntp_fp.h" -#include "ntp_stdlib.h" - -u_int32_t -netof(num) - u_int32_t num; -{ - register u_int32_t netnum; - - netnum = num; - if(IN_CLASSC(netnum)) - netnum &= IN_CLASSC_NET; - else if (IN_CLASSB(netnum)) - netnum &= IN_CLASSB_NET; - else /* treat all other like class A */ - netnum &= IN_CLASSA_NET; - return netnum; -} diff --git a/usr.sbin/xntpd/lib/numtoa.c b/usr.sbin/xntpd/lib/numtoa.c deleted file mode 100644 index 957e3c1060e4..000000000000 --- a/usr.sbin/xntpd/lib/numtoa.c +++ /dev/null @@ -1,22 +0,0 @@ -/* - * numtoa - return asciized network numbers store in local array space - */ -#include <stdio.h> - -#include "ntp_fp.h" -#include "lib_strbuf.h" -#include "ntp_stdlib.h" - -char * -numtoa(num) - u_int32_t num; -{ - register u_int32_t netnum; - register char *buf; - - netnum = ntohl(num); - LIB_GETBUF(buf); - (void) sprintf(buf, "%lu.%lu.%lu.%lu", (netnum >> 24) & 0xff, - (netnum >> 16) & 0xff, (netnum >> 8) & 0xff, netnum & 0xff); - return buf; -} diff --git a/usr.sbin/xntpd/lib/numtohost.c b/usr.sbin/xntpd/lib/numtohost.c deleted file mode 100644 index 0d0ad6e28cdb..000000000000 --- a/usr.sbin/xntpd/lib/numtohost.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * numtohost - convert network number to host name. - */ -#include <netdb.h> - -#include "ntp_fp.h" -#include "ntp_stdlib.h" -#include "lib_strbuf.h" - -#define LOOPBACKNET 0x7f000000 -#define LOOPBACKHOST 0x7f000001 -#define LOOPBACKNETMASK 0xff000000 - -char * -numtohost(netnum) - u_int32_t netnum; -{ - char *bp; - struct hostent *hp; - - /* - * This is really gross, but saves lots of hanging looking for - * hostnames for the radio clocks. Don't bother looking up - * addresses on the loopback network except for the loopback - * host itself. - */ - if ((((ntohl(netnum) & LOOPBACKNETMASK) == LOOPBACKNET) - && (ntohl(netnum) != LOOPBACKHOST)) - || ((hp = gethostbyaddr((char *)&netnum, sizeof netnum, AF_INET)) - == 0)) - return numtoa(netnum); - - LIB_GETBUF(bp); - - bp[LIB_BUFLENGTH-1] = '\0'; - (void) strncpy(bp, hp->h_name, LIB_BUFLENGTH-1); - return bp; -} diff --git a/usr.sbin/xntpd/lib/octtoint.c b/usr.sbin/xntpd/lib/octtoint.c deleted file mode 100644 index 7598d723bd35..000000000000 --- a/usr.sbin/xntpd/lib/octtoint.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - * octtoint - convert an ascii string in octal to an unsigned - * long, with error checking - */ -#include <stdio.h> -#include <ctype.h> - -#include "ntp_stdlib.h" - -int -octtoint(str, ival) - const char *str; - u_long *ival; -{ - register u_long u; - register const char *cp; - - cp = str; - - if (*cp == '\0') - return 0; - - u = 0; - while (*cp != '\0') { - if (!isdigit(*cp) || *cp == '8' || *cp == '9') - return 0; - if (u >= 0x20000000) - return 0; /* overflow */ - u <<= 3; - u += *cp++ - '0'; /* ascii dependent */ - } - *ival = u; - return 1; -} diff --git a/usr.sbin/xntpd/lib/prettydate.c b/usr.sbin/xntpd/lib/prettydate.c deleted file mode 100644 index fd4a8b1f0464..000000000000 --- a/usr.sbin/xntpd/lib/prettydate.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * prettydate - convert a time stamp to something readable - */ -#include <stdio.h> - -#include "ntp_fp.h" -#include "ntp_unixtime.h" -#include "lib_strbuf.h" -#include "ntp_stdlib.h" - -#ifdef NTP_POSIX_SOURCE -#include <time.h> -#endif - -char * -prettydate(ts) - l_fp *ts; -{ - char *bp; - struct tm *tm; - time_t sec; - u_long msec; - static char *months[] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" - }; - static char *days[] = { - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" - }; - - LIB_GETBUF(bp); - - sec = ts->l_ui - JAN_1970; - msec = ts->l_uf / 4294967; /* fract / (2 ** 32 / 1000) */ - - tm = localtime(&sec); - - (void) sprintf(bp, "%08lx.%08lx %s, %s %2d %4d %2d:%02d:%02d.%03lu", - (u_long)ts->l_ui, (u_long)ts->l_uf, days[tm->tm_wday], - months[tm->tm_mon], tm->tm_mday, 1900 + tm->tm_year, - tm->tm_hour,tm->tm_min, tm->tm_sec, msec); - - return bp; -} diff --git a/usr.sbin/xntpd/lib/ranny.c b/usr.sbin/xntpd/lib/ranny.c deleted file mode 100644 index 3fe7b221c3b8..000000000000 --- a/usr.sbin/xntpd/lib/ranny.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Random number generator is: - * - * Copyright 1988 by Rayan S. Zachariassen, all rights reserved. - * This will be free software, but only when it is finished. - * - * Used in xntp by permission of the author. If copyright is - * annoying to you, read no further. Instead, look up the reference, - * write me an equivalent to this and send it back to me. - */ - -/* - * Random number generator; see Knuth Vol 2. 2nd ed. p.27 (section 3.2.2) - */ -#include "ntp_stdlib.h" - -extern time_t time P((time_t *loc)); - -/* - * 55 random numbers, not all even. Note we don't initialize ran_y - * directly since I have had thoughts of putting this in an EPROM - */ -static time_t ran_y[55]; - -static time_t init_ran_y[55] = { - 1860909544, 231033423, 437666411, 1349655137, 2014584962, - 504613712, 656256107, 1246027206, 573713775, 643466871, - 540235388, 1630565153, 443649364, 729302839, 1933991552, - 944681982, 949111118, 406212522, 1065063137, 1712954727, - 73280612, 787623973, 1874130997, 801658492, 73395958, - 739165367, 596047144, 490055249, 1131094323, 662727104, - 483614097, 844520219, 893760527, 921280508, 46691708, - 760861842, 1425894220, 702947816, 2006889048, 1999607995, - 1346414687, 399640789, 1482689501, 1790064052, 1128943628, - 1269197405, 587262386, 2078054746, 1675409928, 1652325524, - 1643525825, 1748690540, 292465849, 1370173174, 402865384 -}; - -static int ran_j; -static int ran_k; - - -/* - * ranp2 - return a random integer in the range 0 .. (1 << m) - 1 - */ -u_long -ranp2(m) - int m; -{ - time_t r; - - ran_y[ran_k] += ran_y[ran_j]; /* overflow does a mod */ - r = ran_y[ran_k]; - if (ran_k-- == 0) - ran_k = 54; - if (ran_j-- == 0) - ran_j = 54; - return (u_long)(r & ((1 << m ) - 1)); -} - -/* - * init_random - do initialization of random number routine - */ -void -init_random() -{ - register int i; - register time_t now; - - ran_j = 23; - ran_k = 54; - - /* - * Randomize the seed array some more. The time of day - * should be initialized by now. - */ - now = time((time_t *)0) | 01; - - for (i = 0; i < 55; ++i) - ran_y[i] = now * init_ran_y[i]; /* overflow does a mod */ -} diff --git a/usr.sbin/xntpd/lib/refnumtoa.c b/usr.sbin/xntpd/lib/refnumtoa.c deleted file mode 100644 index 8bb7d38091fa..000000000000 --- a/usr.sbin/xntpd/lib/refnumtoa.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * refnumtoa - return asciized refclock addresses stored in local array space - */ -#include <stdio.h> - -#include "ntp_fp.h" -#include "lib_strbuf.h" -#include "ntp_stdlib.h" - -char * -refnumtoa(num) - u_long num; -{ - register u_long netnum; - register char *buf; - register const char *rclock; - - netnum = ntohl(num); - - LIB_GETBUF(buf); - - rclock = clockname((int)((netnum >> 8) & 0xff)); - - if (rclock != NULL) - (void)sprintf(buf, "%s(%lu)", rclock, netnum & 0xff); - else - (void)sprintf(buf, "REFCLK(%lu,%lu)", - (netnum >> 8) & 0xff, netnum&0xff); - return buf; -} diff --git a/usr.sbin/xntpd/lib/syssignal.c b/usr.sbin/xntpd/lib/syssignal.c deleted file mode 100644 index f8abfddfe4fd..000000000000 --- a/usr.sbin/xntpd/lib/syssignal.c +++ /dev/null @@ -1,45 +0,0 @@ -#include <stdio.h> -#include <sys/types.h> -#include <signal.h> - -#include "ntp_stdlib.h" - -#if defined(NTP_POSIX_SOURCE) -#include <errno.h> - -extern int errno; - -void -signal_no_reset(sig, func) -int sig; -void (*func)(); -{ - int n; - struct sigaction vec; - - vec.sa_handler = func; - sigemptyset(&vec.sa_mask); - vec.sa_flags = 0; - - while (1) { - n = sigaction(sig, &vec, NULL); - if (n == -1 && errno == EINTR) continue; - break; - } - if (n == -1) { - perror("sigaction"); - exit(1); - } -} - -#else -RETSIGTYPE -signal_no_reset(sig, func) -int sig; -RETSIGTYPE (*func)(); -{ - signal(sig, func); - -} -#endif - diff --git a/usr.sbin/xntpd/lib/systime.c b/usr.sbin/xntpd/lib/systime.c deleted file mode 100644 index 53f0e674c6f3..000000000000 --- a/usr.sbin/xntpd/lib/systime.c +++ /dev/null @@ -1,376 +0,0 @@ -/* - * systime -- routines to fiddle a UNIX clock. - */ -#include <stdio.h> -#include <sys/types.h> -#include <sys/time.h> -#if defined(SYS_HPUX) || defined(sgi) || defined(SYS_BSDI) || defined(SYS_44BSD) -#include <sys/param.h> -#include <utmp.h> -#endif - -#ifdef SYS_LINUX -#include "sys/timex.h" -#endif - -#include "ntp_fp.h" -#include "ntp_syslog.h" -#include "ntp_unixtime.h" -#include "ntp_stdlib.h" - -#if defined(STEP_SLEW) -#define SLEWALWAYS -#endif - -extern int debug; - -/* - * These routines (init_systime, get_systime, step_systime, adj_systime) - * implement an interface between the (more or less) system independent - * bits of NTP and the peculiarities of dealing with the Unix system - * clock. These routines will run with good precision fairly independently - * of your kernel's value of tickadj. I couldn't tell the difference - * between tickadj==40 and tickadj==5 on a microvax, though I prefer - * to set tickadj == 500/hz when in doubt. At your option you - * may compile this so that your system's clock is always slewed to the - * correct time even for large corrections. Of course, all of this takes - * a lot of code which wouldn't be needed with a reasonable tickadj and - * a willingness to let the clock be stepped occasionally. Oh well. - */ - -/* - * Clock variables. We round calls to adjtime() to adj_precision - * microseconds, and limit the adjustment to tvu_maxslew microseconds - * (tsf_maxslew fractional sec) in one adjustment interval. As we are - * thus limited in the speed and precision with which we can adjust the - * clock, we compensate by keeping the known "error" in the system time - * in sys_clock_offset. This is added to timestamps returned by get_systime(). - * We also remember the clock precision we computed from the kernel in - * case someone asks us. - */ - long sys_clock; - - long adj_precision; /* adj precision in usec (tickadj) */ - long tvu_maxslew; /* maximum adjust doable in 1<<CLOCK_ADJ sec (usec) */ - - u_long tsf_maxslew; /* same as above, as long format */ - - l_fp sys_clock_offset; /* correction for current system time */ - -/* - * get_systime - return the system time in timestamp format - * As a side effect, update sys_clock. - */ -void -get_systime(ts) - l_fp *ts; -{ - struct timeval tv; - -#if !defined(SLEWALWAYS) - /* - * Quickly get the time of day and convert it - */ - (void) GETTIMEOFDAY(&tv, (struct timezone *)0); - TVTOTS(&tv, ts); - ts->l_uf += TS_ROUNDBIT; /* guaranteed not to overflow */ -#else - /* - * Get the time of day, convert to time stamp format - * and add in the current time offset. Then round - * appropriately. - */ - (void) GETTIMEOFDAY(&tv, (struct timezone *)0); - TVTOTS(&tv, ts); - L_ADD(ts, &sys_clock_offset); - if (ts->l_uf & TS_ROUNDBIT) - L_ADDUF(ts, TS_ROUNDBIT); -#endif /* !defined(SLEWALWAYS) */ - ts->l_ui += JAN_1970; - ts->l_uf &= TS_MASK; - - sys_clock = ts->l_ui; -} - -/* - * step_systime - do a step adjustment in the system time (at least from - * NTP's point of view. - */ -int -step_systime(ts) - l_fp *ts; -{ -#ifdef SLEWALWAYS -#ifdef STEP_SLEW - register u_long tmp_ui; - register u_long tmp_uf; - int isneg; - int n; - - /* - * Take the absolute value of the offset - */ - tmp_ui = ts->l_ui; - tmp_uf = ts->l_uf; - if (M_ISNEG(tmp_ui, tmp_uf)) { - M_NEG(tmp_ui, tmp_uf); - isneg = 1; - } else - isneg = 0; - - if (tmp_ui >= 3) { /* Step it and slew we might win */ - n = step_systime_real(ts); - if (!n) return n; - if (isneg) - ts->l_ui = ~0; - else - ts->l_ui = ~0; - } -#endif - /* - * Just add adjustment into the current offset. The update - * routine will take care of bringing the system clock into - * line. - */ - L_ADD(&sys_clock_offset, ts); - return 1; -#else /* SLEWALWAYS */ - return step_systime_real(ts); -#endif /* SLEWALWAYS */ -} - -int max_no_complete = 20; - -/* - * adj_systime - called once every 1<<CLOCK_ADJ seconds to make system time - * adjustments. - */ -int -adj_systime(ts) - l_fp *ts; -{ - register u_long offset_i, offset_f; - register long temp; - register u_long residual; - register int isneg = 0; - struct timeval adjtv, oadjtv; - l_fp oadjts; - long adj = ts->l_f; - int rval; - - adjtv.tv_sec = adjtv.tv_usec = 0; - - /* - * Move the current offset into the registers - */ - offset_i = sys_clock_offset.l_ui; - offset_f = sys_clock_offset.l_uf; - - /* - * Add the new adjustment into the system offset. Adjust the - * system clock to minimize this. - */ - M_ADDF(offset_i, offset_f, adj); - if (M_ISNEG(offset_i, offset_f)) { - isneg = 1; - M_NEG(offset_i, offset_f); - } -#ifdef DEBUG - if (debug > 4) - syslog(LOG_DEBUG, "adj_systime(%s): offset = %s%s\n", - mfptoa((adj<0?-1:0), adj, 9), isneg?"-":"", - umfptoa(offset_i, offset_f, 9)); -#endif - - adjtv.tv_sec = 0; - if (offset_i > 0 || offset_f >= tsf_maxslew) { - /* - * Slew is bigger than we can complete in - * the adjustment interval. Make a maximum - * sized slew and reduce sys_clock_offset by this - * much. - */ - M_SUBUF(offset_i, offset_f, tsf_maxslew); - if (!isneg) { - adjtv.tv_usec = tvu_maxslew; - } else { - adjtv.tv_usec = -tvu_maxslew; - M_NEG(offset_i, offset_f); - } - -#ifdef DEBUG - if (debug > 4) - printf("systime: maximum slew: %s%s, remainder = %s\n", - isneg?"-":"", umfptoa(0, tsf_maxslew, 9), - mfptoa(offset_i, offset_f, 9)); -#endif - } else { - /* - * We can do this slew in the time period. Do our - * best approximation (rounded), save residual for - * next adjustment. - * - * Note that offset_i is guaranteed to be 0 here. - */ - TSFTOTVU(offset_f, temp); -#ifndef ADJTIME_IS_ACCURATE - /* - * Round value to be an even multiple of adj_precision - */ - residual = temp % adj_precision; - temp -= residual; - if (residual << 1 >= adj_precision) - temp += adj_precision; -#endif /* ADJTIME_IS_ACCURATE */ - TVUTOTSF(temp, residual); - M_SUBUF(offset_i, offset_f, residual); - if (isneg) { - adjtv.tv_usec = -temp; - M_NEG(offset_i, offset_f); - } else { - adjtv.tv_usec = temp; - } -#ifdef DEBUG - if (debug > 4) - printf( - "systime: adjtv = %s, adjts = %s, sys_clock_offset = %s\n", - tvtoa(&adjtv), umfptoa(0, residual, 9), - mfptoa(offset_i, offset_f, 9)); -#endif - } - - if (adjtime(&adjtv, &oadjtv) < 0) { - syslog(LOG_ERR, "Can't do time adjustment: %m"); - rval = 0; - } else { - sys_clock_offset.l_ui = offset_i; - sys_clock_offset.l_uf = offset_f; - rval = 1; - -#ifdef DEBUGRS6000 - syslog(LOG_ERR, "adj_systime(%s): offset = %s%s\n", - mfptoa((adj<0?-1:0), adj, 9), isneg?"-":"", - umfptoa(offset_i, offset_f, 9)); - syslog(LOG_ERR, "%d %d %d %d\n", (int) adjtv.tv_sec, - (int) adjtv.tv_usec, (int) oadjtv.tv_sec, (int) - oadjtv.tv_usec); -#endif /* DEBUGRS6000 */ - - if (oadjtv.tv_sec != 0 || oadjtv.tv_usec != 0) { - sTVTOTS(&oadjtv, &oadjts); - L_ADD(&sys_clock_offset, &oadjts); - if (max_no_complete > 0) { - syslog(LOG_WARNING, - "Previous time adjustment didn't complete"); -#ifdef DEBUG - if (debug > 4) - syslog(LOG_DEBUG, - "Previous adjtime() incomplete, residual = %s\n", - tvtoa(&oadjtv)); -#endif - if (--max_no_complete == 0) - syslog(LOG_WARNING, - "*** No more 'Prev time adj didn't complete'"); - } - } - } - return(rval); -} - - -/* - * This is used by ntpdate even when xntpd does not use it! WLJ - */ -int -step_systime_real(ts) - l_fp *ts; -{ - struct timeval timetv, adjtv; - int isneg = 0; -#if defined(SYS_HPUX) - struct utmp ut; - time_t oldtime; -#endif - - /* - * We can afford to be sloppy here since if this is called - * the time is really screwed and everything is being reset. - */ - L_ADD(&sys_clock_offset, ts); - - if (L_ISNEG(&sys_clock_offset)) { - isneg = 1; - L_NEG(&sys_clock_offset); - } - TSTOTV(&sys_clock_offset, &adjtv); - - (void) GETTIMEOFDAY(&timetv, (struct timezone *)0); -#if defined(SYS_HPUX) - oldtime = timetv.tv_sec; -#endif -#ifdef DEBUG - if (debug > 3) - syslog(LOG_DEBUG, "step: %s, sys_clock_offset = %s, adjtv = %s, timetv = %s\n", - lfptoa(ts, 9), lfptoa(&sys_clock_offset, 9), tvtoa(&adjtv), - utvtoa(&timetv)); -#endif - if (isneg) { - timetv.tv_sec -= adjtv.tv_sec; - timetv.tv_usec -= adjtv.tv_usec; - if (timetv.tv_usec < 0) { - timetv.tv_sec--; - timetv.tv_usec += 1000000; - } - } else { - timetv.tv_sec += adjtv.tv_sec; - timetv.tv_usec += adjtv.tv_usec; - if (timetv.tv_usec >= 1000000) { - timetv.tv_sec++; - timetv.tv_usec -= 1000000; - } - } - if (SETTIMEOFDAY(&timetv, (struct timezone *)0) != 0) { - syslog(LOG_ERR, "Can't set time of day: %m"); - return 0; - } -#ifdef DEBUG - if (debug > 3) - syslog(LOG_DEBUG, "step: new timetv = %s\n", utvtoa(&timetv)); -#endif - sys_clock_offset.l_ui = sys_clock_offset.l_uf = 0; -#if defined(SYS_HPUX) -#if (SYS_HPUX < 10) - /* - * CHECKME: is this correct when called by ntpdate????? - */ - _clear_adjtime(); -#endif - /* - * Write old and new time entries in utmp and wtmp if step adjustment - * is greater than one second. - */ - if (oldtime != timetv.tv_sec) { - memset((char *)&ut, 0, sizeof(ut)); - ut.ut_type = OLD_TIME; - ut.ut_time = oldtime; - (void)strcpy(ut.ut_line, OTIME_MSG); - pututline(&ut); - setutent(); - ut.ut_type = NEW_TIME; - ut.ut_time = timetv.tv_sec; - (void)strcpy(ut.ut_line, NTIME_MSG); - pututline(&ut); - utmpname(WTMP_FILE); - ut.ut_type = OLD_TIME; - ut.ut_time = oldtime; - (void)strcpy(ut.ut_line, OTIME_MSG); - pututline(&ut); - ut.ut_type = NEW_TIME; - ut.ut_time = timetv.tv_sec; - (void)strcpy(ut.ut_line, NTIME_MSG); - pututline(&ut); - endutent(); - } -#endif - return 1; -} diff --git a/usr.sbin/xntpd/lib/tsftomsu.c b/usr.sbin/xntpd/lib/tsftomsu.c deleted file mode 100644 index 9904b4f5de17..000000000000 --- a/usr.sbin/xntpd/lib/tsftomsu.c +++ /dev/null @@ -1,37 +0,0 @@ -/* - * tsftomsu - convert from a time stamp fraction to milliseconds - */ -#include "ntp_fp.h" -#include "ntp_stdlib.h" - -int -tsftomsu(tsf, round) - u_long tsf; - int round; -{ - register long val_ui, val_uf; - register long tmp_ui, tmp_uf; - register int i; - - /* - * Essentially, multiply by 10 three times in l_fp form. - * The integral part is the milliseconds. - */ - val_ui = 0; - val_uf = tsf; - for (i = 3; i > 0; i--) { - M_LSHIFT(val_ui, val_uf); - tmp_ui = val_ui; - tmp_uf = val_uf; - M_LSHIFT(val_ui, val_uf); - M_LSHIFT(val_ui, val_uf); - M_ADD(val_ui, val_uf, tmp_ui, tmp_uf); - } - - /* - * Round the value if need be, then return it. - */ - if (round && (val_uf & 0x80000000)) - val_ui++; - return (int)val_ui; -} diff --git a/usr.sbin/xntpd/lib/tstotod.c b/usr.sbin/xntpd/lib/tstotod.c deleted file mode 100644 index a78aea1c2ed9..000000000000 --- a/usr.sbin/xntpd/lib/tstotod.c +++ /dev/null @@ -1,21 +0,0 @@ -#ifdef ELIMINATE -/* tstotod.c,v 3.1 1993/07/06 01:08:48 jbj Exp - * tstotod - compute calendar time given an NTP timestamp - */ -#include <stdio.h> - -#include "ntp_fp.h" -#include "ntp_calendar.h" -#include "ntp_stdlib.h" - -void -tstotod(ts, tod) - l_fp *ts; - struct calendar *tod; -{ - register U_LONG cyclesecs; - - cyclesecs = ts.l_ui - MAR_1900; /* bump forward to March 1900 */ - -} -#endif /* ELIMINATE */ diff --git a/usr.sbin/xntpd/lib/tstotv.c b/usr.sbin/xntpd/lib/tstotv.c deleted file mode 100644 index be4bdd44155d..000000000000 --- a/usr.sbin/xntpd/lib/tstotv.c +++ /dev/null @@ -1,135 +0,0 @@ -/* - * tstotv - tables for converting from NTP time stamps to struct timeval - */ - -#include "ntp_types.h" - -/* - * Tables to convert from a time stamp fraction to usecs. Note that - * the units of these tables are actually (usec<<3). We carry three - * guard bits so that the result can be properly truncated (or rounded) - * to be correct to the least significant bit. - * - * These tables are rounded. - */ - -long tstoushi[256] = { - 0x000000, 0x007a12, 0x00f424, 0x016e36, - 0x01e848, 0x02625a, 0x02dc6c, 0x03567e, - 0x03d090, 0x044aa2, 0x04c4b4, 0x053ec6, - 0x05b8d8, 0x0632ea, 0x06acfc, 0x07270e, - 0x07a120, 0x081b32, 0x089544, 0x090f56, - 0x098968, 0x0a037a, 0x0a7d8c, 0x0af79e, - 0x0b71b0, 0x0bebc2, 0x0c65d4, 0x0cdfe6, - 0x0d59f8, 0x0dd40a, 0x0e4e1c, 0x0ec82e, - 0x0f4240, 0x0fbc52, 0x103664, 0x10b076, - 0x112a88, 0x11a49a, 0x121eac, 0x1298be, - 0x1312d0, 0x138ce2, 0x1406f4, 0x148106, - 0x14fb18, 0x15752a, 0x15ef3c, 0x16694e, - 0x16e360, 0x175d72, 0x17d784, 0x185196, - 0x18cba8, 0x1945ba, 0x19bfcc, 0x1a39de, - 0x1ab3f0, 0x1b2e02, 0x1ba814, 0x1c2226, - 0x1c9c38, 0x1d164a, 0x1d905c, 0x1e0a6e, - 0x1e8480, 0x1efe92, 0x1f78a4, 0x1ff2b6, - 0x206cc8, 0x20e6da, 0x2160ec, 0x21dafe, - 0x225510, 0x22cf22, 0x234934, 0x23c346, - 0x243d58, 0x24b76a, 0x25317c, 0x25ab8e, - 0x2625a0, 0x269fb2, 0x2719c4, 0x2793d6, - 0x280de8, 0x2887fa, 0x29020c, 0x297c1e, - 0x29f630, 0x2a7042, 0x2aea54, 0x2b6466, - 0x2bde78, 0x2c588a, 0x2cd29c, 0x2d4cae, - 0x2dc6c0, 0x2e40d2, 0x2ebae4, 0x2f34f6, - 0x2faf08, 0x30291a, 0x30a32c, 0x311d3e, - 0x319750, 0x321162, 0x328b74, 0x330586, - 0x337f98, 0x33f9aa, 0x3473bc, 0x34edce, - 0x3567e0, 0x35e1f2, 0x365c04, 0x36d616, - 0x375028, 0x37ca3a, 0x38444c, 0x38be5e, - 0x393870, 0x39b282, 0x3a2c94, 0x3aa6a6, - 0x3b20b8, 0x3b9aca, 0x3c14dc, 0x3c8eee, - 0x3d0900, 0x3d8312, 0x3dfd24, 0x3e7736, - 0x3ef148, 0x3f6b5a, 0x3fe56c, 0x405f7e, - 0x40d990, 0x4153a2, 0x41cdb4, 0x4247c6, - 0x42c1d8, 0x433bea, 0x43b5fc, 0x44300e, - 0x44aa20, 0x452432, 0x459e44, 0x461856, - 0x469268, 0x470c7a, 0x47868c, 0x48009e, - 0x487ab0, 0x48f4c2, 0x496ed4, 0x49e8e6, - 0x4a62f8, 0x4add0a, 0x4b571c, 0x4bd12e, - 0x4c4b40, 0x4cc552, 0x4d3f64, 0x4db976, - 0x4e3388, 0x4ead9a, 0x4f27ac, 0x4fa1be, - 0x501bd0, 0x5095e2, 0x510ff4, 0x518a06, - 0x520418, 0x527e2a, 0x52f83c, 0x53724e, - 0x53ec60, 0x546672, 0x54e084, 0x555a96, - 0x55d4a8, 0x564eba, 0x56c8cc, 0x5742de, - 0x57bcf0, 0x583702, 0x58b114, 0x592b26, - 0x59a538, 0x5a1f4a, 0x5a995c, 0x5b136e, - 0x5b8d80, 0x5c0792, 0x5c81a4, 0x5cfbb6, - 0x5d75c8, 0x5defda, 0x5e69ec, 0x5ee3fe, - 0x5f5e10, 0x5fd822, 0x605234, 0x60cc46, - 0x614658, 0x61c06a, 0x623a7c, 0x62b48e, - 0x632ea0, 0x63a8b2, 0x6422c4, 0x649cd6, - 0x6516e8, 0x6590fa, 0x660b0c, 0x66851e, - 0x66ff30, 0x677942, 0x67f354, 0x686d66, - 0x68e778, 0x69618a, 0x69db9c, 0x6a55ae, - 0x6acfc0, 0x6b49d2, 0x6bc3e4, 0x6c3df6, - 0x6cb808, 0x6d321a, 0x6dac2c, 0x6e263e, - 0x6ea050, 0x6f1a62, 0x6f9474, 0x700e86, - 0x708898, 0x7102aa, 0x717cbc, 0x71f6ce, - 0x7270e0, 0x72eaf2, 0x736504, 0x73df16, - 0x745928, 0x74d33a, 0x754d4c, 0x75c75e, - 0x764170, 0x76bb82, 0x773594, 0x77afa6, - 0x7829b8, 0x78a3ca, 0x791ddc, 0x7997ee -}; - -long tstousmid[256] = { - 0x0000, 0x007a, 0x00f4, 0x016e, 0x01e8, 0x0262, 0x02dc, 0x0356, - 0x03d1, 0x044b, 0x04c5, 0x053f, 0x05b9, 0x0633, 0x06ad, 0x0727, - 0x07a1, 0x081b, 0x0895, 0x090f, 0x0989, 0x0a03, 0x0a7e, 0x0af8, - 0x0b72, 0x0bec, 0x0c66, 0x0ce0, 0x0d5a, 0x0dd4, 0x0e4e, 0x0ec8, - 0x0f42, 0x0fbc, 0x1036, 0x10b0, 0x112b, 0x11a5, 0x121f, 0x1299, - 0x1313, 0x138d, 0x1407, 0x1481, 0x14fb, 0x1575, 0x15ef, 0x1669, - 0x16e3, 0x175d, 0x17d8, 0x1852, 0x18cc, 0x1946, 0x19c0, 0x1a3a, - 0x1ab4, 0x1b2e, 0x1ba8, 0x1c22, 0x1c9c, 0x1d16, 0x1d90, 0x1e0a, - 0x1e84, 0x1eff, 0x1f79, 0x1ff3, 0x206d, 0x20e7, 0x2161, 0x21db, - 0x2255, 0x22cf, 0x2349, 0x23c3, 0x243d, 0x24b7, 0x2531, 0x25ac, - 0x2626, 0x26a0, 0x271a, 0x2794, 0x280e, 0x2888, 0x2902, 0x297c, - 0x29f6, 0x2a70, 0x2aea, 0x2b64, 0x2bde, 0x2c59, 0x2cd3, 0x2d4d, - 0x2dc7, 0x2e41, 0x2ebb, 0x2f35, 0x2faf, 0x3029, 0x30a3, 0x311d, - 0x3197, 0x3211, 0x328b, 0x3306, 0x3380, 0x33fa, 0x3474, 0x34ee, - 0x3568, 0x35e2, 0x365c, 0x36d6, 0x3750, 0x37ca, 0x3844, 0x38be, - 0x3938, 0x39b3, 0x3a2d, 0x3aa7, 0x3b21, 0x3b9b, 0x3c15, 0x3c8f, - 0x3d09, 0x3d83, 0x3dfd, 0x3e77, 0x3ef1, 0x3f6b, 0x3fe5, 0x405f, - 0x40da, 0x4154, 0x41ce, 0x4248, 0x42c2, 0x433c, 0x43b6, 0x4430, - 0x44aa, 0x4524, 0x459e, 0x4618, 0x4692, 0x470c, 0x4787, 0x4801, - 0x487b, 0x48f5, 0x496f, 0x49e9, 0x4a63, 0x4add, 0x4b57, 0x4bd1, - 0x4c4b, 0x4cc5, 0x4d3f, 0x4db9, 0x4e34, 0x4eae, 0x4f28, 0x4fa2, - 0x501c, 0x5096, 0x5110, 0x518a, 0x5204, 0x527e, 0x52f8, 0x5372, - 0x53ec, 0x5466, 0x54e1, 0x555b, 0x55d5, 0x564f, 0x56c9, 0x5743, - 0x57bd, 0x5837, 0x58b1, 0x592b, 0x59a5, 0x5a1f, 0x5a99, 0x5b13, - 0x5b8d, 0x5c08, 0x5c82, 0x5cfc, 0x5d76, 0x5df0, 0x5e6a, 0x5ee4, - 0x5f5e, 0x5fd8, 0x6052, 0x60cc, 0x6146, 0x61c0, 0x623a, 0x62b5, - 0x632f, 0x63a9, 0x6423, 0x649d, 0x6517, 0x6591, 0x660b, 0x6685, - 0x66ff, 0x6779, 0x67f3, 0x686d, 0x68e7, 0x6962, 0x69dc, 0x6a56, - 0x6ad0, 0x6b4a, 0x6bc4, 0x6c3e, 0x6cb8, 0x6d32, 0x6dac, 0x6e26, - 0x6ea0, 0x6f1a, 0x6f94, 0x700f, 0x7089, 0x7103, 0x717d, 0x71f7, - 0x7271, 0x72eb, 0x7365, 0x73df, 0x7459, 0x74d3, 0x754d, 0x75c7, - 0x7641, 0x76bc, 0x7736, 0x77b0, 0x782a, 0x78a4, 0x791e, 0x7998 -}; - -long tstouslo[128] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, - 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, - 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, - 0x1f, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, - 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, - 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x33, 0x34, - 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, - 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, - 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b, - 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, - 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, - 0x5c, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, - 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, - 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x71, - 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79 -}; diff --git a/usr.sbin/xntpd/lib/tvtoa.c b/usr.sbin/xntpd/lib/tvtoa.c deleted file mode 100644 index dd9ee7eec5ac..000000000000 --- a/usr.sbin/xntpd/lib/tvtoa.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * tvtoa - return an asciized representation of a struct timeval - */ -#include <stdio.h> -#include <sys/time.h> - -#include "lib_strbuf.h" -#include "ntp_stdlib.h" - -char * -tvtoa(tv) - struct timeval *tv; -{ - register char *buf; - register u_long sec; - register u_long usec; - register int isneg; - - if (tv->tv_sec < 0 || tv->tv_usec < 0) { - sec = -tv->tv_sec; - usec = -tv->tv_usec; - isneg = 1; - } else { - sec = tv->tv_sec; - usec = tv->tv_usec; - isneg = 0; - } - - LIB_GETBUF(buf); - - (void) sprintf(buf, "%s%lu.%06lu", (isneg?"-":""), sec, usec); - return buf; -} diff --git a/usr.sbin/xntpd/lib/tvtots.c b/usr.sbin/xntpd/lib/tvtots.c deleted file mode 100644 index 0bd2b6911472..000000000000 --- a/usr.sbin/xntpd/lib/tvtots.c +++ /dev/null @@ -1,159 +0,0 @@ -/* - * tvtots - tables for converting from Unix struct timeval's to - * NTP time stamp format. - */ -#include <sys/types.h> - -#include "ntp_types.h" - -/* - * Tables to calculate time stamp fractions from usecs. The entries - * in these tables are offset into using each of the two low order - * bytes plus the next 4 bits in a usec value (from a struct timeval). - * These are summed to produce the time stamp fraction. - * - * Note that these tables are rounded (not truncated) to the nearest - * low order bit in the fraction. The timestamp computed should be - * +- 1.5 low order bits. - */ - -u_long ustotslo[256] = { - 0x00000000, 0x000010c7, 0x0000218e, 0x00003255, - 0x0000431c, 0x000053e3, 0x000064aa, 0x00007571, - 0x00008638, 0x000096ff, 0x0000a7c6, 0x0000b88d, - 0x0000c954, 0x0000da1b, 0x0000eae2, 0x0000fba9, - 0x00010c6f, 0x00011d36, 0x00012dfd, 0x00013ec4, - 0x00014f8b, 0x00016052, 0x00017119, 0x000181e0, - 0x000192a7, 0x0001a36e, 0x0001b435, 0x0001c4fc, - 0x0001d5c3, 0x0001e68a, 0x0001f751, 0x00020818, - 0x000218df, 0x000229a6, 0x00023a6d, 0x00024b34, - 0x00025bfb, 0x00026cc2, 0x00027d89, 0x00028e50, - 0x00029f17, 0x0002afde, 0x0002c0a5, 0x0002d16c, - 0x0002e233, 0x0002f2fa, 0x000303c0, 0x00031487, - 0x0003254e, 0x00033615, 0x000346dc, 0x000357a3, - 0x0003686a, 0x00037931, 0x000389f8, 0x00039abf, - 0x0003ab86, 0x0003bc4d, 0x0003cd14, 0x0003dddb, - 0x0003eea2, 0x0003ff69, 0x00041030, 0x000420f7, - 0x000431be, 0x00044285, 0x0004534c, 0x00046413, - 0x000474da, 0x000485a1, 0x00049668, 0x0004a72f, - 0x0004b7f6, 0x0004c8bd, 0x0004d984, 0x0004ea4b, - 0x0004fb12, 0x00050bd8, 0x00051c9f, 0x00052d66, - 0x00053e2d, 0x00054ef4, 0x00055fbb, 0x00057082, - 0x00058149, 0x00059210, 0x0005a2d7, 0x0005b39e, - 0x0005c465, 0x0005d52c, 0x0005e5f3, 0x0005f6ba, - 0x00060781, 0x00061848, 0x0006290f, 0x000639d6, - 0x00064a9d, 0x00065b64, 0x00066c2b, 0x00067cf2, - 0x00068db9, 0x00069e80, 0x0006af47, 0x0006c00e, - 0x0006d0d5, 0x0006e19c, 0x0006f263, 0x00070329, - 0x000713f0, 0x000724b7, 0x0007357e, 0x00074645, - 0x0007570c, 0x000767d3, 0x0007789a, 0x00078961, - 0x00079a28, 0x0007aaef, 0x0007bbb6, 0x0007cc7d, - 0x0007dd44, 0x0007ee0b, 0x0007fed2, 0x00080f99, - 0x00082060, 0x00083127, 0x000841ee, 0x000852b5, - 0x0008637c, 0x00087443, 0x0008850a, 0x000895d1, - 0x0008a698, 0x0008b75f, 0x0008c826, 0x0008d8ed, - 0x0008e9b4, 0x0008fa7b, 0x00090b41, 0x00091c08, - 0x00092ccf, 0x00093d96, 0x00094e5d, 0x00095f24, - 0x00096feb, 0x000980b2, 0x00099179, 0x0009a240, - 0x0009b307, 0x0009c3ce, 0x0009d495, 0x0009e55c, - 0x0009f623, 0x000a06ea, 0x000a17b1, 0x000a2878, - 0x000a393f, 0x000a4a06, 0x000a5acd, 0x000a6b94, - 0x000a7c5b, 0x000a8d22, 0x000a9de9, 0x000aaeb0, - 0x000abf77, 0x000ad03e, 0x000ae105, 0x000af1cc, - 0x000b0292, 0x000b1359, 0x000b2420, 0x000b34e7, - 0x000b45ae, 0x000b5675, 0x000b673c, 0x000b7803, - 0x000b88ca, 0x000b9991, 0x000baa58, 0x000bbb1f, - 0x000bcbe6, 0x000bdcad, 0x000bed74, 0x000bfe3b, - 0x000c0f02, 0x000c1fc9, 0x000c3090, 0x000c4157, - 0x000c521e, 0x000c62e5, 0x000c73ac, 0x000c8473, - 0x000c953a, 0x000ca601, 0x000cb6c8, 0x000cc78f, - 0x000cd856, 0x000ce91d, 0x000cf9e4, 0x000d0aaa, - 0x000d1b71, 0x000d2c38, 0x000d3cff, 0x000d4dc6, - 0x000d5e8d, 0x000d6f54, 0x000d801b, 0x000d90e2, - 0x000da1a9, 0x000db270, 0x000dc337, 0x000dd3fe, - 0x000de4c5, 0x000df58c, 0x000e0653, 0x000e171a, - 0x000e27e1, 0x000e38a8, 0x000e496f, 0x000e5a36, - 0x000e6afd, 0x000e7bc4, 0x000e8c8b, 0x000e9d52, - 0x000eae19, 0x000ebee0, 0x000ecfa7, 0x000ee06e, - 0x000ef135, 0x000f01fb, 0x000f12c2, 0x000f2389, - 0x000f3450, 0x000f4517, 0x000f55de, 0x000f66a5, - 0x000f776c, 0x000f8833, 0x000f98fa, 0x000fa9c1, - 0x000fba88, 0x000fcb4f, 0x000fdc16, 0x000fecdd, - 0x000ffda4, 0x00100e6b, 0x00101f32, 0x00102ff9, - 0x001040c0, 0x00105187, 0x0010624e, 0x00107315, - 0x001083dc, 0x001094a3, 0x0010a56a, 0x0010b631, -}; - -u_long ustotsmid[256] = { - 0x00000000, 0x0010c6f8, 0x00218def, 0x003254e7, - 0x00431bde, 0x0053e2d6, 0x0064a9ce, 0x007570c5, - 0x008637bd, 0x0096feb4, 0x00a7c5ac, 0x00b88ca4, - 0x00c9539b, 0x00da1a93, 0x00eae18a, 0x00fba882, - 0x010c6f7a, 0x011d3671, 0x012dfd69, 0x013ec460, - 0x014f8b58, 0x01605250, 0x01711947, 0x0181e03f, - 0x0192a736, 0x01a36e2e, 0x01b43526, 0x01c4fc1d, - 0x01d5c315, 0x01e68a0c, 0x01f75104, 0x020817fc, - 0x0218def3, 0x0229a5eb, 0x023a6ce3, 0x024b33da, - 0x025bfad2, 0x026cc1c9, 0x027d88c1, 0x028e4fb9, - 0x029f16b0, 0x02afdda8, 0x02c0a49f, 0x02d16b97, - 0x02e2328f, 0x02f2f986, 0x0303c07e, 0x03148775, - 0x03254e6d, 0x03361565, 0x0346dc5c, 0x0357a354, - 0x03686a4b, 0x03793143, 0x0389f83b, 0x039abf32, - 0x03ab862a, 0x03bc4d21, 0x03cd1419, 0x03dddb11, - 0x03eea208, 0x03ff6900, 0x04102ff7, 0x0420f6ef, - 0x0431bde7, 0x044284de, 0x04534bd6, 0x046412cd, - 0x0474d9c5, 0x0485a0bd, 0x049667b4, 0x04a72eac, - 0x04b7f5a3, 0x04c8bc9b, 0x04d98393, 0x04ea4a8a, - 0x04fb1182, 0x050bd879, 0x051c9f71, 0x052d6669, - 0x053e2d60, 0x054ef458, 0x055fbb4f, 0x05708247, - 0x0581493f, 0x05921036, 0x05a2d72e, 0x05b39e25, - 0x05c4651d, 0x05d52c15, 0x05e5f30c, 0x05f6ba04, - 0x060780fb, 0x061847f3, 0x06290eeb, 0x0639d5e2, - 0x064a9cda, 0x065b63d2, 0x066c2ac9, 0x067cf1c1, - 0x068db8b8, 0x069e7fb0, 0x06af46a8, 0x06c00d9f, - 0x06d0d497, 0x06e19b8e, 0x06f26286, 0x0703297e, - 0x0713f075, 0x0724b76d, 0x07357e64, 0x0746455c, - 0x07570c54, 0x0767d34b, 0x07789a43, 0x0789613a, - 0x079a2832, 0x07aaef2a, 0x07bbb621, 0x07cc7d19, - 0x07dd4410, 0x07ee0b08, 0x07fed200, 0x080f98f7, - 0x08205fef, 0x083126e6, 0x0841edde, 0x0852b4d6, - 0x08637bcd, 0x087442c5, 0x088509bc, 0x0895d0b4, - 0x08a697ac, 0x08b75ea3, 0x08c8259b, 0x08d8ec92, - 0x08e9b38a, 0x08fa7a82, 0x090b4179, 0x091c0871, - 0x092ccf68, 0x093d9660, 0x094e5d58, 0x095f244f, - 0x096feb47, 0x0980b23e, 0x09917936, 0x09a2402e, - 0x09b30725, 0x09c3ce1d, 0x09d49514, 0x09e55c0c, - 0x09f62304, 0x0a06e9fb, 0x0a17b0f3, 0x0a2877ea, - 0x0a393ee2, 0x0a4a05da, 0x0a5accd1, 0x0a6b93c9, - 0x0a7c5ac1, 0x0a8d21b8, 0x0a9de8b0, 0x0aaeafa7, - 0x0abf769f, 0x0ad03d97, 0x0ae1048e, 0x0af1cb86, - 0x0b02927d, 0x0b135975, 0x0b24206d, 0x0b34e764, - 0x0b45ae5c, 0x0b567553, 0x0b673c4b, 0x0b780343, - 0x0b88ca3a, 0x0b999132, 0x0baa5829, 0x0bbb1f21, - 0x0bcbe619, 0x0bdcad10, 0x0bed7408, 0x0bfe3aff, - 0x0c0f01f7, 0x0c1fc8ef, 0x0c308fe6, 0x0c4156de, - 0x0c521dd5, 0x0c62e4cd, 0x0c73abc5, 0x0c8472bc, - 0x0c9539b4, 0x0ca600ab, 0x0cb6c7a3, 0x0cc78e9b, - 0x0cd85592, 0x0ce91c8a, 0x0cf9e381, 0x0d0aaa79, - 0x0d1b7171, 0x0d2c3868, 0x0d3cff60, 0x0d4dc657, - 0x0d5e8d4f, 0x0d6f5447, 0x0d801b3e, 0x0d90e236, - 0x0da1a92d, 0x0db27025, 0x0dc3371d, 0x0dd3fe14, - 0x0de4c50c, 0x0df58c03, 0x0e0652fb, 0x0e1719f3, - 0x0e27e0ea, 0x0e38a7e2, 0x0e496ed9, 0x0e5a35d1, - 0x0e6afcc9, 0x0e7bc3c0, 0x0e8c8ab8, 0x0e9d51b0, - 0x0eae18a7, 0x0ebedf9f, 0x0ecfa696, 0x0ee06d8e, - 0x0ef13486, 0x0f01fb7d, 0x0f12c275, 0x0f23896c, - 0x0f345064, 0x0f45175c, 0x0f55de53, 0x0f66a54b, - 0x0f776c42, 0x0f88333a, 0x0f98fa32, 0x0fa9c129, - 0x0fba8821, 0x0fcb4f18, 0x0fdc1610, 0x0fecdd08, - 0x0ffda3ff, 0x100e6af7, 0x101f31ee, 0x102ff8e6, - 0x1040bfde, 0x105186d5, 0x10624dcd, 0x107314c4, - 0x1083dbbc, 0x1094a2b4, 0x10a569ab, 0x10b630a3, -}; - -u_long ustotshi[16] = { - 0x00000000, 0x10c6f79a, 0x218def35, 0x3254e6cf, - 0x431bde6a, 0x53e2d604, 0x64a9cd9f, 0x7570c539, - 0x8637bcd3, 0x96feb46e, 0xa7c5ac08, 0xb88ca3a3, - 0xc9539b3d, 0xda1a92d7, 0xeae18a72, 0xfba8820c, -}; diff --git a/usr.sbin/xntpd/lib/uglydate.c b/usr.sbin/xntpd/lib/uglydate.c deleted file mode 100644 index 25a8e56fa911..000000000000 --- a/usr.sbin/xntpd/lib/uglydate.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * uglydate - convert a time stamp to something barely readable - * The string returned is 37 characters long. - */ -#include <stdio.h> - -#include "ntp_fp.h" -#include "ntp_unixtime.h" -#include "lib_strbuf.h" -#include "ntp_stdlib.h" -#ifdef NTP_POSIX_SOURCE -#include <time.h> -#endif - -char * -uglydate(ts) - l_fp *ts; -{ - char *bp; - char *timep; - struct tm *tm; - time_t sec; - long msec; - int year; - - timep = ulfptoa(ts, 6); /* returns max 17 characters */ - LIB_GETBUF(bp); - sec = ts->l_ui - JAN_1970; - msec = ts->l_uf / 4294967; /* fract / (2**32/1000) */ - tm = gmtime(&sec); - if (ts->l_ui == 0) { - /* - * Probably not a real good thing to do. Oh, well. - */ - year = 0; - tm->tm_yday = 0; - tm->tm_hour = 0; - tm->tm_min = 0; - tm->tm_sec = 0; - } else { - year = tm->tm_year; - while (year >= 100) - year -= 100; - } - (void) sprintf(bp, "%17s %02d:%03d:%02d:%02d:%02d.%03ld", - timep, year, tm->tm_yday, tm->tm_hour, tm->tm_min, - tm->tm_sec, msec); - return bp; -} diff --git a/usr.sbin/xntpd/lib/uinttoa.c b/usr.sbin/xntpd/lib/uinttoa.c deleted file mode 100644 index 7c406dd5902e..000000000000 --- a/usr.sbin/xntpd/lib/uinttoa.c +++ /dev/null @@ -1,19 +0,0 @@ -/* - * uinttoa - return an asciized unsigned integer - */ -#include <stdio.h> - -#include "lib_strbuf.h" -#include "ntp_stdlib.h" - -char * -uinttoa(uval) - u_long uval; -{ - register char *buf; - - LIB_GETBUF(buf); - - (void) sprintf(buf, "%lu", (u_long)uval); - return buf; -} diff --git a/usr.sbin/xntpd/lib/utvtoa.c b/usr.sbin/xntpd/lib/utvtoa.c deleted file mode 100644 index 5a192e198a4c..000000000000 --- a/usr.sbin/xntpd/lib/utvtoa.c +++ /dev/null @@ -1,21 +0,0 @@ -/* - * utvtoa - return an asciized representation of an unsigned struct timeval - */ -#include <stdio.h> -#include <sys/time.h> - -#include "lib_strbuf.h" -#include "ntp_stdlib.h" - -char * -utvtoa(tv) - struct timeval *tv; -{ - register char *buf; - - LIB_GETBUF(buf); - - (void) sprintf(buf, "%lu.%06lu", (u_long)tv->tv_sec, - (u_long)tv->tv_usec); - return buf; -} diff --git a/usr.sbin/xntpd/ntpdate/Makefile b/usr.sbin/xntpd/ntpdate/Makefile deleted file mode 100644 index f56183526909..000000000000 --- a/usr.sbin/xntpd/ntpdate/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# -# $FreeBSD$ -# - -CFLAGS+= -I${.CURDIR}/../include - -DPADD= ${LIBNTP} -LDADD= ${LIBNTP} - -PROG= ntpdate -MAN8= ${.CURDIR}/../doc/ntpdate.8 -CLEANFILES+= .version version.c - -SRCS= ntpdate.c version.c - -version.c: ${.CURDIR}/../VERSION - sh -e ${.CURDIR}/../scripts/mkversion ntpdate - -.include <bsd.prog.mk> diff --git a/usr.sbin/xntpd/ntpdate/README b/usr.sbin/xntpd/ntpdate/README deleted file mode 100644 index fd2dbe2e2c49..000000000000 --- a/usr.sbin/xntpd/ntpdate/README +++ /dev/null @@ -1,7 +0,0 @@ -README file for directory ./ntpdate of the NTP Version 3 distribution - -This directory contains the sources for the ntpdate utility program. See -the README and RELNOTES files in the parent directory for directions on -how to make and install this program. The current version number of this -program is in the version.c file. - diff --git a/usr.sbin/xntpd/ntpdate/ntpdate.c b/usr.sbin/xntpd/ntpdate/ntpdate.c deleted file mode 100644 index 1d2c7d5019af..000000000000 --- a/usr.sbin/xntpd/ntpdate/ntpdate.c +++ /dev/null @@ -1,1588 +0,0 @@ -/* - * ntpdate - set the time of day by polling one or more NTP servers - * - * $FreeBSD$ - */ -#include <stdio.h> -#include <signal.h> -#include <ctype.h> -#include <errno.h> -#include <netdb.h> -#include <sys/types.h> -#include <sys/signal.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/resource.h> - -#ifdef __STDC__ -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -#if defined(SYS_HPUX) -#include <utmp.h> -#endif - -#ifdef SYS_LINUX -#include <sys/timex.h> -#endif - -#ifndef SYSLOG_FILE -#define SYSLOG_FILE /* we want to go through the syslog/printf/file code */ -#endif - -#include "ntp_select.h" -#include "ntp_fp.h" -#include "ntp.h" -#include "ntp_io.h" -#include "ntp_unixtime.h" -#include "ntpdate.h" -#include "ntp_string.h" -#include "ntp_stdlib.h" -#include "ntp_syslog.h" - -/* - * Scheduling priority we run at - */ -#define NTPDATE_PRIO (-12) - -/* - * Compatibility stuff for Version 2 - */ -#define NTP_MAXSKW 0x28f /* 0.01 sec in fp format */ -#define NTP_MINDIST 0x51f /* 0.02 sec in fp format */ -#define PEER_MAXDISP (64*FP_SECOND) /* maximum dispersion (fp 64) */ -#define NTP_INFIN 15 /* max stratum, infinity a la Bellman-Ford */ -#define NTP_MAXWGT (8*FP_SECOND) /* maximum select weight 8 seconds */ -#define NTP_MAXLIST 5 /* maximum select list size */ -#define PEER_SHIFT 8 /* 8 suitable for crystal time base */ - -/* - * Debugging flag - */ -int debug = 0; - -/* - * File descriptor masks etc. for call to select - */ -int fd; -fd_set fdmask; - -/* - * Initializing flag. All async routines watch this and only do their - * thing when it is clear. - */ -int initializing = 1; - -/* - * Alarm flag. Set when an alarm occurs - */ -int alarm_flag = 0; - -/* - * Simple query flag. - */ -int simple_query = 0; - -/* - * Program name. - */ -char *progname; - -/* - * Systemwide parameters and flags - */ -int sys_samples = DEFSAMPLES; /* number of samples/server */ -u_long sys_timeout = DEFTIMEOUT; /* timeout time, in TIMER_HZ units */ -struct server **sys_servers; /* the server list */ -int sys_numservers = 0; /* number of servers to poll */ -int sys_maxservers = 0; /* max number of servers to deal with */ -int sys_authenticate = 0; /* true when authenticating */ -u_long sys_authkey = 0; /* set to authentication key in use */ -u_long sys_authdelay = 0; /* authentication delay */ -int sys_version = NTP_VERSION; /* version to poll with */ - -/* - * The current internal time - */ -u_long current_time = 0; - -/* - * Counter for keeping track of completed servers - */ -int complete_servers = 0; - -/* - * File of encryption keys - */ -#ifndef KEYFILE -#define KEYFILE "/etc/ntp.keys" -#endif /* KEYFILE */ - -char *key_file = KEYFILE; - -/* - * Miscellaneous flags - */ -extern int syslogit; -int verbose = 0; -int always_step = 0; - -extern int errno; - -static void transmit P((struct server *)); -static void receive P((struct recvbuf *)); -static void server_data P((struct server *, s_fp, l_fp *, u_fp)); -static void clock_filter P((struct server *)); -static struct server *clock_select P((void)); -static int clock_adjust P((void)); -static void addserver P((char *)); -static struct server *findserver P((struct sockaddr_in *)); -static void timer P((void)); -static void init_alarm P((void)); -static RETSIGTYPE alarming P((int)); -static void init_io P((void)); -static struct recvbuf *getrecvbufs P((void)); -static void freerecvbuf P((struct recvbuf *)); -static void sendpkt P((struct sockaddr_in *, struct pkt *, int)); -static void input_handler P((void)); - -static int l_adj_systime P((l_fp *)); -static int l_step_systime P((l_fp *)); - -static int getnetnum P((char *, u_long *)); -static void printserver P((struct server *, FILE *)); - -/* - * Main program. Initialize us and loop waiting for I/O and/or - * timer expiries. - */ -int -main(argc, argv) - int argc; - char *argv[]; -{ - int was_alarmed; - struct recvbuf *rbuflist; - struct recvbuf *rbuf; - l_fp tmp; - int errflg; - int c; - extern char *ntp_optarg; - extern int ntp_optind; - extern char *Version; - - errflg = 0; - progname = argv[0]; - syslogit = 0; - - /* - * Decode argument list - */ - while ((c = ntp_getopt(argc, argv, "a:bde:k:o:p:qst:v")) != EOF) - switch (c) { - case 'a': - c = atoi(ntp_optarg); - sys_authenticate = 1; - sys_authkey = c; - break; - case 'b': - always_step++; - break; - case 'd': - ++debug; - break; - case 'e': - if (!atolfp(ntp_optarg, &tmp) - || tmp.l_ui != 0) { - (void) fprintf(stderr, - "%s: encryption delay %s is unlikely\n", - progname, ntp_optarg); - errflg++; - } else { - sys_authdelay = tmp.l_uf; - } - break; - case 'k': - key_file = ntp_optarg; - break; - case 'o': - sys_version = atoi(ntp_optarg); - break; - case 'p': - c = atoi(ntp_optarg); - if (c <= 0 || c > NTP_SHIFT) { - (void) fprintf(stderr, - "%s: number of samples (%d) is invalid\n", - progname, c); - errflg++; - } else { - sys_samples = c; - } - break; - case 'q': - simple_query = 1; - break; - case 's': - syslogit = 1; - break; - case 't': - if (!atolfp(ntp_optarg, &tmp)) { - (void) fprintf(stderr, - "%s: timeout %s is undecodeable\n", - progname, ntp_optarg); - errflg++; - } else { - sys_timeout = ((LFPTOFP(&tmp) * TIMER_HZ) - + 0x8000) >> 16; - if (sys_timeout == 0) - sys_timeout = 1; - } - break; - case 'v': - verbose = 1; - break; - case '?': - ++errflg; - break; - default: - break; - } - - sys_maxservers = argc - ntp_optind; - if (errflg || sys_maxservers == 0) { - (void) fprintf(stderr, -"usage: %s [-bdqsv] [-o version] [-a key#] [-e authdelay] [-k keyfile] [-p samples] [-t timeout] server ...\n", - progname); - exit(2); - } - - sys_servers = (struct server **) - emalloc(sys_maxservers * sizeof(struct server *)); - - if (debug || simple_query) { -#ifdef NTP_POSIX_SOURCE - static char buf[BUFSIZ]; - setvbuf(stdout, buf, _IOLBF, BUFSIZ); -#else - setlinebuf(stdout); -#endif - } - - /* - * Logging. Open the syslog if we have to - */ - if (syslogit) { -#ifndef LOG_DAEMON - openlog("ntpdate", LOG_PID); -#else - -#ifndef LOG_NTP -#define LOG_NTP LOG_DAEMON -#endif - openlog("ntpdate", LOG_PID | LOG_NDELAY, LOG_NTP); - if (debug) - setlogmask(LOG_UPTO(LOG_DEBUG)); - else - setlogmask(LOG_UPTO(LOG_INFO)); -#endif /* LOG_DAEMON */ - } - - if (debug || verbose) - syslog(LOG_NOTICE, "%s", Version); - - /* - * Add servers we are going to be polling - */ - for ( ; ntp_optind < argc; ntp_optind++) - addserver(argv[ntp_optind]); - - if (sys_numservers == 0) { - syslog(LOG_ERR, "no servers can be used, exiting"); - exit(1); - } - - /* - * Initialize the time of day routines and the I/O subsystem - */ - if (sys_authenticate) { - init_auth(); - if (!authreadkeys(key_file)) { - syslog(LOG_ERR, "no key file, exitting"); - exit(1); - } - if (!authhavekey(sys_authkey)) { - char buf[10]; - - (void) sprintf(buf, "%lu", (unsigned long)sys_authkey); - syslog(LOG_ERR, "authentication key %s unknown", buf); - exit(1); - } - } - init_io(); - init_alarm(); - - /* - * Set the priority. - */ -#if defined(HAVE_ATT_NICE) - nice (NTPDATE_PRIO); -#endif -#if defined(HAVE_BSD_NICE) - (void) setpriority(PRIO_PROCESS, 0, NTPDATE_PRIO); -#endif - - initializing = 0; - - was_alarmed = 0; - rbuflist = (struct recvbuf *)0; - while (complete_servers < sys_numservers) { - fd_set rdfdes; - int nfound; - - if (alarm_flag) { /* alarmed? */ - was_alarmed = 1; - alarm_flag = 0; - } - rbuflist = getrecvbufs(); /* get received buffers */ - - if (!was_alarmed && rbuflist == (struct recvbuf *)0) { - /* - * Nothing to do. Wait for something. - */ - rdfdes = fdmask; - nfound = select(fd+1, &rdfdes, (fd_set *)0, - (fd_set *)0, (struct timeval *)0); - if (nfound > 0) - input_handler(); - - else if (nfound == -1 && errno != EINTR) { - syslog(LOG_ERR, "select() error: %m"); - } - if (alarm_flag) { /* alarmed? */ - was_alarmed = 1; - alarm_flag = 0; - } - rbuflist = getrecvbufs(); /* get received buffers */ - - } - - /* - * Out here, signals are unblocked. Call receive - * procedure for each incoming packet. - */ - while (rbuflist != (struct recvbuf *)0) { - rbuf = rbuflist; - rbuflist = rbuf->next; - receive(rbuf); - freerecvbuf(rbuf); - } - - /* - * Call timer to process any timeouts - */ - if (was_alarmed) { - timer(); - was_alarmed = 0; - } - - /* - * Go around again - */ - } - - /* - * When we get here we've completed the polling of all servers. - * Adjust the clock, then exit. - */ - exit(clock_adjust()); -} - - -/* - * transmit - transmit a packet to the given server, or mark it completed. - * This is called by the timeout routine and by the receive - * procedure. - */ -static void -transmit(server) - register struct server *server; -{ - struct pkt xpkt; - - if (debug) - printf("transmit(%s)\n", ntoa(&server->srcadr)); - - if (server->filter_nextpt < server->xmtcnt) { - l_fp ts; - /* - * Last message to this server timed out. Shift - * zeros into the filter. - */ - L_CLR(&ts); - server_data(server, 0, &ts, 0); - } - - if ((int)server->filter_nextpt >= sys_samples) { - /* - * Got all the data we need. Mark this guy - * completed and return. - */ - server->event_time = 0; - complete_servers++; - return; - } - - /* - * If we're here, send another message to the server. Fill in - * the packet and let 'er rip. - */ - xpkt.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOTINSYNC, - sys_version, MODE_CLIENT); - xpkt.stratum = STRATUM_TO_PKT(STRATUM_UNSPEC); - xpkt.ppoll = NTP_MINPOLL; - xpkt.precision = NTPDATE_PRECISION; - xpkt.rootdelay = htonl(NTPDATE_DISTANCE); - xpkt.rootdispersion = htonl(NTPDATE_DISP); - xpkt.refid = htonl(NTPDATE_REFID); - L_CLR(&xpkt.reftime); - L_CLR(&xpkt.org); - L_CLR(&xpkt.rec); - - /* - * Determine whether to authenticate or not. If so, - * fill in the extended part of the packet and do it. - * If not, just timestamp it and send it away. - */ - if (sys_authenticate) { - int len; - - xpkt.keyid = htonl(sys_authkey); - auth1crypt(sys_authkey, (U_LONG *)&xpkt, LEN_PKT_NOMAC); - get_systime(&server->xmt); - L_ADDUF(&server->xmt, sys_authdelay); - HTONL_FP(&server->xmt, &xpkt.xmt); - len = auth2crypt(sys_authkey, (U_LONG *)&xpkt, LEN_PKT_NOMAC); - sendpkt(&(server->srcadr), &xpkt, LEN_PKT_NOMAC + len); - - if (debug > 1) - printf("transmit auth to %s\n", - ntoa(&(server->srcadr))); - } else { - get_systime(&(server->xmt)); - HTONL_FP(&server->xmt, &xpkt.xmt); - sendpkt(&(server->srcadr), &xpkt, LEN_PKT_NOMAC); - - if (debug > 1) - printf("transmit to %s\n", ntoa(&(server->srcadr))); - } - - /* - * Update the server timeout and transmit count - */ - server->event_time = current_time + sys_timeout; - server->xmtcnt++; -} - - -/* - * receive - receive and process an incoming frame - */ -static void -receive(rbufp) - struct recvbuf *rbufp; -{ - register struct pkt *rpkt; - register struct server *server; - register s_fp di; - l_fp t10, t23; - l_fp org; - l_fp rec; - l_fp ci; - int has_mac; - int is_authentic; - - if (debug) - printf("receive(%s)\n", ntoa(&rbufp->srcadr)); - /* - * Check to see if the packet basically looks like something - * intended for us. - */ - if (rbufp->recv_length == LEN_PKT_NOMAC) - has_mac = 0; - else if (rbufp->recv_length >= LEN_PKT_NOMAC) - has_mac = 1; - else { - if (debug) - printf("receive: packet length %d\n", - rbufp->recv_length); - return; /* funny length packet */ - } - - rpkt = &(rbufp->recv_pkt); - if (PKT_VERSION(rpkt->li_vn_mode) < NTP_OLDVERSION || - PKT_VERSION(rpkt->li_vn_mode) > NTP_VERSION) { - return; - } - - if ((PKT_MODE(rpkt->li_vn_mode) != MODE_SERVER - && PKT_MODE(rpkt->li_vn_mode) != MODE_PASSIVE) - || rpkt->stratum > NTP_MAXSTRATUM) { - if (debug) - printf("receive: mode %d stratum %d\n", - PKT_MODE(rpkt->li_vn_mode), rpkt->stratum); - return; - } - - /* - * So far, so good. See if this is from a server we know. - */ - server = findserver(&(rbufp->srcadr)); - if (server == NULL) { - if (debug) - printf("receive: server not found\n"); - return; - } - - /* - * Decode the org timestamp and make sure we're getting a response - * to our last request. - */ - NTOHL_FP(&rpkt->org, &org); - if (!L_ISEQU(&org, &server->xmt)) { - if (debug) - printf("receive: pkt.org and peer.xmt differ\n"); - return; - } - - /* - * Check out the authenticity if we're doing that. - */ - if (!sys_authenticate) - is_authentic = 1; - else { - is_authentic = 0; - - if (debug > 3) - printf("receive: rpkt keyid=%ld sys_authkey=%ld decrypt=%ld\n", - (long int)ntohl(rpkt->keyid), (long int)sys_authkey, - (long int)authdecrypt(sys_authkey, (U_LONG *)rpkt, - LEN_PKT_NOMAC)); - - if (has_mac && ntohl(rpkt->keyid) == sys_authkey && - authdecrypt(sys_authkey, (U_LONG *)rpkt, LEN_PKT_NOMAC)) - is_authentic = 1; - if (debug) - printf("receive: authentication %s\n", - is_authentic ? "passed" : "failed"); - } - server->trust <<= 1; - if (!is_authentic) - server->trust |= 1; - - /* - * Looks good. Record info from the packet. - */ - server->leap = PKT_LEAP(rpkt->li_vn_mode); - server->stratum = PKT_TO_STRATUM(rpkt->stratum); - server->precision = rpkt->precision; - server->rootdelay = ntohl(rpkt->rootdelay); - server->rootdispersion = ntohl(rpkt->rootdispersion); - server->refid = rpkt->refid; - NTOHL_FP(&rpkt->reftime, &server->reftime); - NTOHL_FP(&rpkt->rec, &rec); - NTOHL_FP(&rpkt->xmt, &server->org); - - /* - * Make sure the server is at least somewhat sane. If not, try - * again. - */ - if (L_ISZERO(&rec) || !L_ISHIS(&server->org, &rec)) { - transmit(server); - return; - } - - /* - * Calculate the round trip delay (di) and the clock offset (ci). - * We use the equations (reordered from those in the spec): - * - * d = (t2 - t3) - (t1 - t0) - * c = ((t2 - t3) + (t1 - t0)) / 2 - */ - t10 = server->org; /* pkt.xmt == t1 */ - L_SUB(&t10, &rbufp->recv_time); /* recv_time == t0*/ - - t23 = rec; /* pkt.rec == t2 */ - L_SUB(&t23, &org); /* pkt->org == t3 */ - - /* now have (t2 - t3) and (t0 - t1). Calculate (ci) and (di) */ - ci = t10; - L_ADD(&ci, &t23); - L_RSHIFT(&ci); - - /* - * Calculate di in t23 in full precision, then truncate - * to an s_fp. - */ - L_SUB(&t23, &t10); - di = LFPTOFP(&t23); - - if (debug > 3) - printf("offset: %s, delay %s\n", lfptoa(&ci, 6), fptoa(di, 5)); - - di += (FP_SECOND >> (-(int)NTPDATE_PRECISION)) - + (FP_SECOND >> (-(int)server->precision)) + NTP_MAXSKW; - - if (di <= 0) { /* value still too raunchy to use? */ - L_CLR(&ci); - di = 0; - } else { - di = max(di, NTP_MINDIST); - } - - /* - * Shift this data in, then transmit again. - */ - server_data(server, (u_fp) di, &ci, 0); - transmit(server); -} - - -/* - * server_data - add a sample to the server's filter registers - */ -static void -server_data(server, d, c, e) - register struct server *server; - s_fp d; - l_fp *c; - u_fp e; -{ - register int i; - - i = server->filter_nextpt; - if (i < NTP_SHIFT) { - server->filter_delay[i] = d; - server->filter_offset[i] = *c; - server->filter_soffset[i] = LFPTOFP(c); - server->filter_error[i] = e; - server->filter_nextpt = i + 1; - } -} - - -/* - * clock_filter - determine a server's delay, dispersion and offset - */ -static void -clock_filter(server) - register struct server *server; -{ - register int i, j; - int ord[NTP_SHIFT]; - - /* - * Sort indices into increasing delay order - */ - for (i = 0; i < sys_samples; i++) - ord[i] = i; - - for (i = 0; i < (sys_samples-1); i++) { - for (j = i+1; j < sys_samples; j++) { - if (server->filter_delay[ord[j]] == 0) - continue; - if (server->filter_delay[ord[i]] == 0 - || (server->filter_delay[ord[i]] - > server->filter_delay[ord[j]])) { - register int tmp; - - tmp = ord[i]; - ord[i] = ord[j]; - ord[j] = tmp; - } - } - } - - /* - * Now compute the dispersion, and assign values to delay and - * offset. If there are no samples in the register, delay and - * offset go to zero and dispersion is set to the maximum. - */ - if (server->filter_delay[ord[0]] == 0) { - server->delay = 0; - L_CLR(&server->offset); - server->soffset = 0; - server->dispersion = PEER_MAXDISP; - } else { - register s_fp d; - - server->delay = server->filter_delay[ord[0]]; - server->offset = server->filter_offset[ord[0]]; - server->soffset = LFPTOFP(&server->offset); - server->dispersion = 0; - for (i = 1; i < sys_samples; i++) { - if (server->filter_delay[ord[i]] == 0) - d = PEER_MAXDISP; - else { - d = server->filter_soffset[ord[i]] - - server->filter_soffset[ord[0]]; - if (d < 0) - d = -d; - if (d > PEER_MAXDISP) - d = PEER_MAXDISP; - } - /* - * XXX This *knows* PEER_FILTER is 1/2 - */ - server->dispersion += (u_fp)(d) >> i; - } - } - /* - * We're done - */ -} - - -/* - * clock_select - select the pick-of-the-litter clock from the samples - * we've got. - */ -static struct server * -clock_select() -{ - register struct server *server; - register int i; - register int nlist; - register s_fp d; - register int j; - register int n; - s_fp local_threshold; - struct server *server_list[NTP_MAXCLOCK]; - u_fp server_badness[NTP_MAXCLOCK]; - struct server *sys_server; - - /* - * This first chunk of code is supposed to go through all - * servers we know about to find the NTP_MAXLIST servers which - * are most likely to succeed. We run through the list - * doing the sanity checks and trying to insert anyone who - * looks okay. We are at all times aware that we should - * only keep samples from the top two strata and we only need - * NTP_MAXLIST of them. - */ - nlist = 0; /* none yet */ - for (n = 0; n < sys_numservers; n++) { - server = sys_servers[n]; - if (server->delay == 0) - continue; /* no data */ - if (server->stratum > NTP_INFIN) - continue; /* stratum no good */ - if (server->delay > NTP_MAXWGT) { - continue; /* too far away */ - } - if (server->leap == LEAP_NOTINSYNC) - continue; /* he's in trouble */ - if (!L_ISHIS(&server->org, &server->reftime)) { - continue; /* very broken host */ - } - if ((server->org.l_ui - server->reftime.l_ui) - >= NTP_MAXAGE) { - continue; /* too long without sync */ - } - if (server->trust != 0) { - continue; - } - - /* - * This one seems sane. Find where he belongs - * on the list. - */ - d = server->dispersion + server->dispersion; - for (i = 0; i < nlist; i++) - if (server->stratum <= server_list[i]->stratum) - break; - for ( ; i < nlist; i++) { - if (server->stratum < server_list[i]->stratum) - break; - if (d < server_badness[i]) - break; - } - - /* - * If i points past the end of the list, this - * guy is a loser, else stick him in. - */ - if (i >= NTP_MAXLIST) - continue; - for (j = nlist; j > i; j--) - if (j < NTP_MAXLIST) { - server_list[j] = server_list[j-1]; - server_badness[j] - = server_badness[j-1]; - } - - server_list[i] = server; - server_badness[i] = d; - if (nlist < NTP_MAXLIST) - nlist++; - } - - /* - * Got the five-or-less best. Cut the list where the number of - * strata exceeds two. - */ - j = 0; - for (i = 1; i < nlist; i++) - if (server_list[i]->stratum > server_list[i-1]->stratum) - if (++j == 2) { - nlist = i; - break; - } - - /* - * Whew! What we should have by now is 0 to 5 candidates for - * the job of syncing us. If we have none, we're out of luck. - * If we have one, he's a winner. If we have more, do falseticker - * detection. - */ - - if (nlist == 0) - sys_server = 0; - else if (nlist == 1) { - sys_server = server_list[0]; - } else { - /* - * Re-sort by stratum, bdelay estimate quality and - * server.delay. - */ - for (i = 0; i < nlist-1; i++) - for (j = i+1; j < nlist; j++) { - if (server_list[i]->stratum - < server_list[j]->stratum) - break; /* already sorted by stratum */ - if (server_list[i]->delay - < server_list[j]->delay) - continue; - server = server_list[i]; - server_list[i] = server_list[j]; - server_list[j] = server; - } - - /* - * Calculate the fixed part of the dispersion limit - */ - local_threshold = (FP_SECOND >> (-(int)NTPDATE_PRECISION)) - + NTP_MAXSKW; - - /* - * Now drop samples until we're down to one. - */ - while (nlist > 1) { - for (n = 0; n < nlist; n++) { - server_badness[n] = 0; - for (j = 0; j < nlist; j++) { - if (j == n) /* with self? */ - continue; - d = server_list[j]->soffset - - server_list[n]->soffset; - if (d < 0) /* absolute value */ - d = -d; - /* - * XXX This code *knows* that - * NTP_SELECT is 3/4 - */ - for (i = 0; i < j; i++) - d = (d>>1) + (d>>2); - server_badness[n] += d; - } - } - - /* - * We now have an array of nlist badness - * coefficients. Find the badest. Find - * the minimum precision while we're at - * it. - */ - i = 0; - n = server_list[0]->precision;; - for (j = 1; j < nlist; j++) { - if (server_badness[j] >= server_badness[i]) - i = j; - if (n > server_list[j]->precision) - n = server_list[j]->precision; - } - - /* - * i is the index of the server with the worst - * dispersion. If his dispersion is less than - * the threshold, stop now, else delete him and - * continue around again. - */ - if (server_badness[i] < (local_threshold - + (FP_SECOND >> (-n)))) - break; - for (j = i + 1; j < nlist; j++) - server_list[j-1] = server_list[j]; - nlist--; - } - - /* - * What remains is a list of less than 5 servers. Take - * the best. - */ - sys_server = server_list[0]; - } - - /* - * That's it. Return our server. - */ - return sys_server; -} - - -/* - * clock_adjust - process what we've received, and adjust the time - * if we got anything decent. - */ -static int -clock_adjust() -{ - register int i; - register struct server *server; - s_fp absoffset; - int dostep; - - for (i = 0; i < sys_numservers; i++) - clock_filter(sys_servers[i]); - server = clock_select(); - - if (debug || simple_query) { - for (i = 0; i < sys_numservers; i++) - printserver(sys_servers[i], stdout); - } - - if (server == 0) { - syslog(LOG_ERR, - "no server suitable for synchronization found"); - return(1); - } - - dostep = 1; - if (!always_step) { - absoffset = server->soffset; - if (absoffset < 0) - absoffset = -absoffset; - if (absoffset < NTPDATE_THRESHOLD) - dostep = 0; - } - - if (dostep) { - if (simple_query || l_step_systime(&server->offset)) { - syslog(LOG_NOTICE, "step time server %s offset %s", - ntoa(&server->srcadr), - lfptoa(&server->offset, 6)); - } - } else { - if (simple_query || l_adj_systime(&server->offset)) { - syslog(LOG_NOTICE, "adjust time server %s offset %s", - ntoa(&server->srcadr), - lfptoa(&server->offset, 6)); - } - } - return(0); -} - - -/* XXX ELIMINATE: merge BIG slew into adj_systime in lib/systime.c */ -/* - * addserver - determine a server's address and allocate a new structure - * for it. - */ -static void -addserver(serv) - char *serv; -{ - register struct server *server; - u_long netnum; - static int toomany = 0; - - if (sys_numservers >= sys_maxservers) { - if (!toomany) { - /* - * This is actually a `can't happen' now. Leave - * the error message in anyway, though - */ - toomany = 1; - syslog(LOG_ERR, - "too many servers (> %d) specified, remainder not used", - sys_maxservers); - } - return; - } - - if (!getnetnum(serv, &netnum)) { - syslog(LOG_ERR, "can't find host %s\n", serv); - return; - } - - server = (struct server *)emalloc(sizeof(struct server)); - memset((char *)server, 0, sizeof(struct server)); - - server->srcadr.sin_family = AF_INET; - server->srcadr.sin_addr.s_addr = netnum; - server->srcadr.sin_port = htons(NTP_PORT); - - sys_servers[sys_numservers++] = server; - server->event_time = sys_numservers; -} - - -/* - * findserver - find a server in the list given its address - */ -static struct server * -findserver(addr) - struct sockaddr_in *addr; -{ - register int i; - register u_long netnum; - - if (htons(addr->sin_port) != NTP_PORT) - return 0; - netnum = addr->sin_addr.s_addr; - - for (i = 0; i < sys_numservers; i++) { - if (netnum == sys_servers[i]->srcadr.sin_addr.s_addr) - return sys_servers[i]; - } - return 0; -} - - -/* - * timer - process a timer interrupt - */ -static void -timer() -{ - register int i; - - /* - * Bump the current idea of the time - */ - current_time++; - - /* - * Search through the server list looking for guys - * who's event timers have expired. Give these to - * the transmit routine. - */ - for (i = 0; i < sys_numservers; i++) { - if (sys_servers[i]->event_time != 0 - && sys_servers[i]->event_time <= current_time) - transmit(sys_servers[i]); - } -} - - - -/* - * init_alarm - set up the timer interrupt - */ -static void -init_alarm() -{ - struct itimerval itimer; - - alarm_flag = 0; - - /* - * Set up the alarm interrupt. The first comes 1/(2*TIMER_HZ) - * seconds from now and they continue on every 1/TIMER_HZ seconds. - */ - (void) signal_no_reset(SIGALRM, alarming); - itimer.it_interval.tv_sec = itimer.it_value.tv_sec = 0; - itimer.it_interval.tv_usec = 1000000/TIMER_HZ; - itimer.it_value.tv_usec = 1000000/(TIMER_HZ<<1); - setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0); -} - - -/* - * alarming - record the occurance of an alarm interrupt - */ -static RETSIGTYPE -alarming(sig) -int sig; -{ - alarm_flag++; -} - - -/* - * We do asynchronous input using the SIGIO facility. A number of - * recvbuf buffers are preallocated for input. In the signal - * handler we poll to see if the socket is ready and read the - * packets from it into the recvbuf's along with a time stamp and - * an indication of the source host and the interface it was received - * through. This allows us to get as accurate receive time stamps - * as possible independent of other processing going on. - * - * We allocate a number of recvbufs equal to the number of servers - * plus 2. This should be plenty. - */ - -/* - * recvbuf lists - */ -struct recvbuf *freelist; /* free buffers */ -struct recvbuf *fulllist; /* buffers with data */ - -int full_recvbufs; /* number of full ones */ -int free_recvbufs; - - -/* - * init_io - initialize I/O data and open socket - */ -static void -init_io() -{ - register int i; - register struct recvbuf *rb; - - /* - * Init buffer free list and stat counters - */ - rb = (struct recvbuf *) - emalloc((sys_numservers + 2) * sizeof(struct recvbuf)); - freelist = 0; - for (i = sys_numservers + 2; i > 0; i--) { - rb->next = freelist; - freelist = rb; - rb++; - } - - fulllist = 0; - full_recvbufs = 0; - free_recvbufs = sys_numservers + 2; - - /* - * Open the socket - */ - - /* create a datagram (UDP) socket */ - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - syslog(LOG_ERR, "socket() failed: %m"); - exit(1); - /*NOTREACHED*/ - } - - /* - * bind the socket to the NTP port - */ - if (!debug && !simple_query) { - struct sockaddr_in addr; - - memset((char *)&addr, 0, sizeof addr); - addr.sin_family = AF_INET; - addr.sin_port = htons(NTP_PORT); - addr.sin_addr.s_addr = htonl(INADDR_ANY); - if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - if (errno == EADDRINUSE) - syslog(LOG_ERR, - "the NTP socket is in use, exiting"); - else - syslog(LOG_ERR, "bind() fails: %m"); - exit(1); - } - } - - FD_ZERO(&fdmask); - FD_SET(fd, &fdmask); - - /* - * set non-blocking, - */ -#if defined(O_NONBLOCK) - if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) { - syslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m"); - exit(1); - /*NOTREACHED*/ - } -#else /* O_NONBLOCK */ -#if defined(FNDELAY) - if (fcntl(fd, F_SETFL, FNDELAY) < 0) { - syslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m"); - exit(1); - /*NOTREACHED*/ - } -#else /* FNDELAY */ -Need non blocking I/O -#endif /* FNDELAY */ -#endif /* O_NONBLOCK */ -} - - -/* XXX ELIMINATE getrecvbufs (almost) identical to ntpdate.c, ntptrace.c, ntp_io.c */ -/* - * getrecvbufs - get receive buffers which have data in them - * - * ***N.B. must be called with SIGIO blocked*** - */ -static struct recvbuf * -getrecvbufs() -{ - struct recvbuf *rb; - - if (full_recvbufs == 0) { - return (struct recvbuf *)0; /* nothing has arrived */ - } - - /* - * Get the fulllist chain and mark it empty - */ - rb = fulllist; - fulllist = 0; - full_recvbufs = 0; - - /* - * Return the chain - */ - return rb; -} - - -/* XXX ELIMINATE freerecvbuf (almost) identical to ntpdate.c, ntptrace.c, ntp_io.c */ -/* - * freerecvbuf - make a single recvbuf available for reuse - */ -static void -freerecvbuf(rb) - struct recvbuf *rb; -{ - - rb->next = freelist; - freelist = rb; - free_recvbufs++; -} - - -/* - * sendpkt - send a packet to the specified destination - */ -static void -sendpkt(dest, pkt, len) - struct sockaddr_in *dest; - struct pkt *pkt; - int len; -{ - int cc; - - cc = sendto(fd, (char *)pkt, len, 0, (struct sockaddr *)dest, - sizeof(struct sockaddr_in)); - if (cc == -1) { - if (errno != EWOULDBLOCK && errno != ENOBUFS) - syslog(LOG_ERR, "sendto(%s): %m", ntoa(dest)); - } -} - - -/* - * input_handler - receive packets asynchronously - */ -static void -input_handler() -{ - register int n; - register struct recvbuf *rb; - struct timeval tvzero; - int fromlen; - l_fp ts; - fd_set fds; - - /* - * Do a poll to see if we have data - */ - for (;;) { - fds = fdmask; - tvzero.tv_sec = tvzero.tv_usec = 0; - n = select(fd+1, &fds, (fd_set *)0, (fd_set *)0, &tvzero); - - /* - * If nothing to do, just return. If an error occurred, - * complain and return. If we've got some, freeze a - * timestamp. - */ - if (n == 0) - return; - else if (n == -1) { - syslog(LOG_ERR, "select() error: %m"); - return; - } - get_systime(&ts); - - /* - * Get a buffer and read the frame. If we - * haven't got a buffer, or this is received - * on the wild card socket, just dump the packet. - */ - if (initializing || free_recvbufs == 0) { - char buf[100]; - - (void) read(fd, buf, sizeof buf); - continue; - } - - rb = freelist; - freelist = rb->next; - free_recvbufs--; - - fromlen = sizeof(struct sockaddr_in); - rb->recv_length = recvfrom(fd, (char *)&rb->recv_pkt, - sizeof(rb->recv_pkt), 0, - (struct sockaddr *)&rb->srcadr, &fromlen); - if (rb->recv_length == -1) { - rb->next = freelist; - freelist = rb; - free_recvbufs++; - continue; - } - - /* - * Got one. Mark how and when it got here, - * put it on the full list. - */ - rb->recv_time = ts; - rb->next = fulllist; - fulllist = rb; - full_recvbufs++; - } -} - - -/* - * adj_systime - do a big long slew of the system time - */ -static int -l_adj_systime(ts) - l_fp *ts; -{ - struct timeval adjtv, oadjtv; - int isneg = 0; - l_fp offset; - l_fp overshoot; - - /* - * Take the absolute value of the offset - */ - offset = *ts; - if (L_ISNEG(&offset)) { - isneg = 1; - L_NEG(&offset); - } - -#ifndef STEP_SLEW - /* - * Calculate the overshoot. XXX N.B. This code *knows* - * ADJ_OVERSHOOT is 1/2. - */ - overshoot = offset; - L_RSHIFTU(&overshoot); - if (overshoot.l_ui != 0 || (overshoot.l_uf > ADJ_MAXOVERSHOOT)) { - overshoot.l_ui = 0; - overshoot.l_uf = ADJ_MAXOVERSHOOT; - } - L_ADD(&offset, &overshoot); -#endif - TSTOTV(&offset, &adjtv); - - if (isneg) { - adjtv.tv_sec = -adjtv.tv_sec; - adjtv.tv_usec = -adjtv.tv_usec; - } - - if (adjtv.tv_usec != 0 && !debug) { - if (adjtime(&adjtv, &oadjtv) < 0) { - syslog(LOG_ERR, "Can't adjust the time of day: %m"); - return 0; - } - } - return 1; -} - - -/* - * This fuction is not the same as lib/systime step_systime!!! - */ -static int -l_step_systime(ts) - l_fp *ts; -{ -#ifdef SLEWALWAYS -#ifdef STEP_SLEW - l_fp ftmp; - int isneg; - int n; - - if (debug) return 1; - /* - * Take the absolute value of the offset - */ - ftmp = ts; - if (L_ISNEG(&ftmp)) { - L_NEG(&tmp); - isneg = 1; - } else - isneg = 0; - - if (tmp_ui >= 3) { /* Step it and slew - we might win */ - n = step_systime_real(ts); - if (!n) - return n; - if (isneg) - ts->l_ui = ~0; - else - ts->l_ui = ~0; - } - /* - * Just add adjustment into the current offset. The update - * routine will take care of bringing the system clock into - * line. - */ -#endif - if (debug) - return 1; -#ifdef FORCE_NTPDATE_STEP - return step_systime_real(ts); -#else - l_adj_systime(ts); - return 1; -#endif -#else /* SLEWALWAYS */ - if (debug) - return 1; - return step_systime_real(ts); -#endif /* SLEWALWAYS */ -} - -/* - * getnetnum - given a host name, return its net number - */ -static int -getnetnum(host, num) - char *host; - u_long *num; -{ - struct hostent *hp; - - if (decodenetnum(host, num)) { - return 1; - } else if ((hp = gethostbyname(host)) != 0) { - memmove((char *)num, hp->h_addr, sizeof(U_LONG)); - return (1); - } - return (0); -} - -/* XXX ELIMINATE printserver similar in ntptrace.c, ntpdate.c */ -/* - * printserver - print detail information for a server - */ -static void -printserver(pp, fp) - register struct server *pp; - FILE *fp; -{ - register int i; - char junk[5]; - char *str; - - if (!debug) { - (void) fprintf(fp, "server %s, stratum %d, offset %s, delay %s\n", - ntoa(&pp->srcadr), pp->stratum, - lfptoa(&pp->offset, 6), fptoa(pp->delay, 5)); - return; - } - - (void) fprintf(fp, "server %s, port %d\n", - ntoa(&pp->srcadr), ntohs(pp->srcadr.sin_port)); - - (void) fprintf(fp, "stratum %d, precision %d, leap %c%c, trust %03o\n", - pp->stratum, pp->precision, - pp->leap & 0x2 ? '1' : '0', - pp->leap & 0x1 ? '1' : '0', - pp->trust); - - if (pp->stratum == 1) { - junk[4] = 0; - memmove(junk, (char *)&pp->refid, 4); - str = junk; - } else { - str = numtoa(pp->refid); - } - (void) fprintf(fp, - "refid [%s], delay %s, dispersion %s\n", - str, fptoa(pp->delay, 5), - ufptoa(pp->dispersion, 5)); - - (void) fprintf(fp, "transmitted %d, in filter %d\n", - pp->xmtcnt, pp->filter_nextpt); - - (void) fprintf(fp, "reference time: %s\n", - prettydate(&pp->reftime)); - (void) fprintf(fp, "originate timestamp: %s\n", - prettydate(&pp->org)); - (void) fprintf(fp, "transmit timestamp: %s\n", - prettydate(&pp->xmt)); - - (void) fprintf(fp, "filter delay: "); - for (i = 0; i < NTP_SHIFT; i++) { - (void) fprintf(fp, " %-8.8s", fptoa(pp->filter_delay[i], 5)); - if (i == (NTP_SHIFT>>1)-1) - (void) fprintf(fp, "\n "); - } - (void) fprintf(fp, "\n"); - - (void) fprintf(fp, "filter offset:"); - for (i = 0; i < PEER_SHIFT; i++) { - (void) fprintf(fp, " %-8.8s", lfptoa(&pp->filter_offset[i], 6)); - if (i == (PEER_SHIFT>>1)-1) - (void) fprintf(fp, "\n "); - } - (void) fprintf(fp, "\n"); - - (void) fprintf(fp, "delay %s, dispersion %s\n", - fptoa(pp->delay, 5), ufptoa(pp->dispersion, 5)); - - (void) fprintf(fp, "offset %s\n\n", - lfptoa(&pp->offset, 6)); -} - -#if defined(NEED_VSPRINTF) -/* - * This nugget for pre-tahoe 4.3bsd systems - */ -#if !defined(__STDC__) || !__STDC__ -#define const -#endif - -int -vsprintf(str, fmt, ap) - char *str; - const char *fmt; - va_list ap; -{ - FILE f; - int len; - - f._flag = _IOWRT+_IOSTRG; - f._ptr = str; - f._cnt = 32767; - len = _doprnt(fmt, ap, &f); - *f._ptr = 0; - return (len); -} -#endif - diff --git a/usr.sbin/xntpd/ntpdate/ntpdate.h b/usr.sbin/xntpd/ntpdate/ntpdate.h deleted file mode 100644 index cfbe90a92334..000000000000 --- a/usr.sbin/xntpd/ntpdate/ntpdate.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * ntpdate.h - declarations for the ntpdate program - */ - -#include "ntp_malloc.h" - -/* - * The server structure is a much simplified version of the - * peer structure, for ntpdate's use. Since we always send - * in client mode and expect to receive in server mode, this - * leaves only a very limited number of things we need to - * remember about the server. - */ -struct server { - struct sockaddr_in srcadr; /* address of remote host */ - u_char leap; /* leap indicator */ - u_char stratum; /* stratum of remote server */ - s_char precision; /* server's clock precision */ - u_char trust; /* trustability of the filtered data */ - u_fp rootdelay; /* distance from primary clock */ - u_fp rootdispersion; /* peer clock dispersion */ - U_LONG refid; /* peer reference ID */ - l_fp reftime; /* time of peer's last update */ - u_long event_time; /* time for next timeout */ - u_short xmtcnt; /* number of packets transmitted */ - u_short filter_nextpt; /* index into filter shift register */ - s_fp filter_delay[NTP_SHIFT]; /* delay part of shift register */ - l_fp filter_offset[NTP_SHIFT]; /* offset part of shift register */ - s_fp filter_soffset[NTP_SHIFT]; /* offset in s_fp format, for disp */ - u_fp filter_error[NTP_SHIFT]; /* error part of shift register */ - l_fp org; /* peer's originate time stamp */ - l_fp xmt; /* transmit time stamp */ - u_fp delay; /* filter estimated delay */ - u_fp dispersion; /* filter estimated dispersion */ - l_fp offset; /* filter estimated clock offset */ - s_fp soffset; /* fp version of above */ -}; - - -/* - * ntpdate runs everything on a simple, short timeout. It sends a - * packet and sets the timeout (by default, to a small value suitable - * for a LAN). If it receives a response it sends another request. - * If it times out it shifts zeroes into the filter and sends another - * request. - * - * The timer routine is run often (once every 1/5 second currently) - * so that time outs are done with reasonable precision. - */ -#define TIMER_HZ (5) /* 5 per second */ - -/* - * ntpdate will make a long adjustment using adjtime() if the times - * are close, or step the time if the times are farther apart. The - * following defines what is "close". - */ -#ifdef linux -#define NTPDATE_THRESHOLD (FP_SECOND / 8) /* 1/8 second */ -#else -#define NTPDATE_THRESHOLD (FP_SECOND >> 1) /* 1/2 second */ -#endif - -/* - * When doing adjustments, ntpdate actually overadjusts (currently - * by 50%, though this may change). While this will make it take longer - * to reach a steady state condition, it will typically result in - * the clock keeping more accurate time, on average. The amount of - * overshoot is limited. - */ -#ifdef NOTNOW -#define ADJ_OVERSHOOT 1/2 /* this is hard coded */ -#endif /* NOTNOW */ -#define ADJ_MAXOVERSHOOT 0x10000000 /* 50 ms as a ts fraction */ - -/* - * Since ntpdate isn't aware of some of the things that normally get - * put in an NTP packet, we fix some values. - */ -#define NTPDATE_PRECISION (-6) /* use this precision */ -#define NTPDATE_DISTANCE FP_SECOND /* distance is 1 sec */ -#define NTPDATE_DISP FP_SECOND /* so is the dispersion */ -#define NTPDATE_REFID (0) /* reference ID to use */ - - -/* - * Some defaults - */ -#define DEFTIMEOUT 5 /* 5 timer increments */ -#define DEFSAMPLES 4 /* get 4 samples per server */ diff --git a/usr.sbin/xntpd/ntpq/Makefile b/usr.sbin/xntpd/ntpq/Makefile deleted file mode 100644 index 669b40804bfe..000000000000 --- a/usr.sbin/xntpd/ntpq/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# -# $FreeBSD$ -# - -CFLAGS+= -I${.CURDIR}/../include - -DPADD= ${LIBNTP} -LDADD= ${LIBNTP} - -PROG= ntpq -MAN8= ${.CURDIR}/../doc/ntpq.8 -CLEANFILES+= .version version.c -BINDIR= /usr/bin - -SRCS= ntpq.c ntpq_ops.c version.c - -version.c: ${.CURDIR}/../VERSION - sh -e ${.CURDIR}/../scripts/mkversion ntpq - -.include <bsd.prog.mk> diff --git a/usr.sbin/xntpd/ntpq/README b/usr.sbin/xntpd/ntpq/README deleted file mode 100644 index 117c66ce978b..000000000000 --- a/usr.sbin/xntpd/ntpq/README +++ /dev/null @@ -1,6 +0,0 @@ -README file for directory ./ntpq of the NTP Version 3 distribution - -This directory contains the sources for the ntpq utility program. See -the README and RELNOTES files in the parent directory for directions on -how to make and install this program. The current version number of this -program is in the version.c file. diff --git a/usr.sbin/xntpd/ntpq/ntpq.c b/usr.sbin/xntpd/ntpq/ntpq.c deleted file mode 100644 index 186408aa1303..000000000000 --- a/usr.sbin/xntpd/ntpq/ntpq.c +++ /dev/null @@ -1,3093 +0,0 @@ -/* - * ntpq - query an NTP server using mode 6 commands - * - * $FreeBSD$ - */ -#include <stdio.h> -#include <ctype.h> -#include <signal.h> -#include <setjmp.h> -#include <sys/types.h> -#include <sys/time.h> -#include <netdb.h> - -#include "ntp_select.h" -#include "ntpq.h" -#include "ntp_unixtime.h" -#include "ntp_calendar.h" -#include "ntp_io.h" -#include "ntp_stdlib.h" - -/* - * Because we potentially understand a lot of commands we will run - * interactive if connected to a terminal. - */ -int interactive = 0; /* set to 1 when we should prompt */ -char *prompt = "ntpq> "; /* prompt to ask him about */ - - -/* - * Keyid used for authenticated requests. Obtained on the fly. - */ -u_long info_auth_keyid = -1; - -/* - * Type of key md5 or des - */ -#define KEY_TYPE_DES 3 -#define KEY_TYPE_MD5 4 - -int info_auth_keytype = KEY_TYPE_DES; /* DES */ - -/* - * Flag which indicates we should always send authenticated requests - */ -int always_auth = 0; - -/* - * Flag which indicates raw mode output. - */ -int rawmode = 0; - -/* - * Packet version number we use - */ -u_char pktversion = NTP_VERSION; - -/* - * Don't jump if no set jmp. - */ -int jump = 0; - -/* - * Format values - */ -#define PADDING 0 -#define TS 1 /* time stamp */ -#define FL 2 /* l_fp type value */ -#define FU 3 /* u_fp type value */ -#define FS 4 /* s_fp type value */ -#define UI 5 /* unsigned integer value */ -#define IN 6 /* signed integer value */ -#define HA 7 /* host address */ -#define NA 8 /* network address */ -#define ST 9 /* string value */ -#define RF 10 /* refid (sometimes string, sometimes not) */ -#define LP 11 /* leap (print in binary) */ -#define OC 12 /* integer, print in octal */ -#define MD 13 /* mode */ -#define AR 14 /* array of times */ -#define TST 15 /* test flags */ -#define EOV 255 /* end of table */ - - -/* - * System variable values. The array can be indexed by - * the variable index to find the textual name. - */ -struct ctl_var sys_var[] = { - { 0, PADDING, "" }, /* 0 */ - { CS_LEAP, LP, "leap" }, /* 1 */ - { CS_STRATUM, UI, "stratum" }, /* 2 */ - { CS_PRECISION, IN, "precision" }, /* 3 */ - { CS_ROOTDELAY, FS, "rootdelay" }, /* 4 */ - { CS_ROOTDISPERSION, FU, "rootdispersion" }, /* 5 */ - { CS_REFID, RF, "refid" }, /* 6 */ - { CS_REFTIME, TS, "reftime" }, /* 7 */ - { CS_POLL, UI, "poll" }, /* 8 */ - { CS_PEERID, UI, "peer" }, /* 9 */ - { CS_OFFSET, FL, "phase" }, /* 10 */ - { CS_DRIFT, FS, "freq" }, /* 11 */ - { CS_COMPLIANCE, FU, "error" }, /* 12 */ - { CS_CLOCK, TS, "clock" }, /* 13 */ - { CS_LEAPIND, LP, "leapindicator" }, /* 14 */ - { CS_LEAPWARNING, LP, "leapwarning" }, /* 15 */ - { CS_PROCESSOR, ST, "processor" }, /* 16 */ - { CS_SYSTEM, ST, "system" }, /* 17 */ - { CS_KEYID, UI, "keyid" }, /* 18 */ - { CS_REFSKEW, FL, "refskew" }, /* 19 */ - { 0, EOV, "" } -}; - - -/* - * Peer variable list - */ -struct ctl_var peer_var[] = { - { 0, PADDING, "" }, /* 0 */ - { CP_CONFIG, UI, "config" }, /* 1 */ - { CP_AUTHENABLE, UI, "authenable" }, /* 2 */ - { CP_AUTHENTIC, UI, "authentic" }, /* 3 */ - { CP_SRCADR, HA, "srcadr" }, /* 4 */ - { CP_SRCPORT, UI, "srcport" }, /* 5 */ - { CP_DSTADR, NA, "dstadr" }, /* 6 */ - { CP_DSTPORT, UI, "dstport" }, /* 7 */ - { CP_LEAP, LP, "leap" }, /* 8 */ - { CP_HMODE, MD, "hmode" }, /* 9 */ - { CP_STRATUM, UI, "stratum" }, /* 10 */ - { CP_PPOLL, UI, "ppoll" }, /* 11 */ - { CP_HPOLL, UI, "hpoll" }, /* 12 */ - { CP_PRECISION, IN, "precision" }, /* 13 */ - { CP_ROOTDELAY, FS, "rootdelay" }, /* 14 */ - { CP_ROOTDISPERSION, FU, "rootdispersion" }, /* 15 */ - { CP_REFID, RF, "refid" }, /* 16 */ - { CP_REFTIME, TS, "reftime" }, /* 17 */ - { CP_ORG, TS, "org" }, /* 18 */ - { CP_REC, TS, "rec" }, /* 19 */ - { CP_XMT, TS, "xmt" }, /* 20 */ - { CP_REACH, OC, "reach" }, /* 21 */ - { CP_VALID, UI, "valid" }, /* 22 */ - { CP_TIMER, UI, "timer" }, /* 23 */ - { CP_DELAY, AR, "delay" }, /* 24 */ - { CP_OFFSET, AR, "offset" }, /* 25 */ - { CP_DISPERSION, FU, "dispersion" }, /* 26 */ - { CP_KEYID, UI, "keyid" }, /* 27 */ - { CP_FILTDELAY, AR, "filtdelay" }, /* 28 */ - { CP_FILTOFFSET, AR, "filtoffset" }, /* 29 */ - { CP_PMODE, ST, "pmode" }, /* 30 */ - { CP_RECEIVED, UI, "received" }, /* 31 */ - { CP_SENT, UI, "sent" }, /* 32 */ - { CP_FILTERROR, AR, "filterror" }, /* 33 */ - { CP_FLASH, TST, "flash"}, /* 34 */ - { CP_DISP, AR, "disp" }, /* 35 */ - /* - * These are duplicate entries so that we can - * process deviant version of the xntp protocal. - */ - { CP_SRCADR, HA, "peeraddr" }, /* 4 */ - { CP_SRCPORT, UI, "peerport" }, /* 5 */ - { CP_PPOLL, UI, "peerpoll" }, /* 11 */ - { CP_HPOLL, UI, "hostpoll" }, /* 12 */ - { 0, EOV, "" } -}; - - -/* - * Clock variable list - */ -struct ctl_var clock_var[] = { - { 0, PADDING, "" }, /* 0 */ - { CC_TYPE, UI, "type" }, /* 1 */ - { CC_TIMECODE, ST, "timecode" }, /* 2 */ - { CC_POLL, UI, "poll" }, /* 3 */ - { CC_NOREPLY, UI, "noreply" }, /* 4 */ - { CC_BADFORMAT, UI, "badformat" }, /* 5 */ - { CC_BADDATA, UI, "baddata" }, /* 6 */ - { CC_FUDGETIME1, FL, "fudgetime1" }, /* 7 */ - { CC_FUDGETIME2, FL, "fudgetime2" }, /* 8 */ - { CC_FUDGEVAL1, UI, "stratum" }, /* 9 */ - { CC_FUDGEVAL2, RF, "refid" }, /* 10 */ - { CC_FLAGS, UI, "flags" }, /* 11 */ - { CC_DEVICE, ST, "device" }, /* 12 */ - { 0, EOV, "" } -}; - - -/* - * Structure for turning various constants into a readable string. - */ -struct codestring { - int code; - char *string; -}; - -/* - * flasher bits - */ -static char *tstflagnames[] = { - "DUPLICATE PKT", - "BOGUS PKT", - "PROTO UNSYNC", - "PEER BOUNDS", - "BAD AUTH", - "PEER CLOCK UNSYNC", - "BAD STRATUM", - "ROOT BOUNDS" -}; - -/* - * Leap values - */ -struct codestring leap_codes[] = { - { 0, "leap_none" }, - { 1, "leap_add_sec" }, - { 2, "leap_del_sec" }, - { 3, "sync_alarm" }, - { -1, "leap" } -}; - - -/* - * Clock source - */ -struct codestring sync_codes[] = { - { CTL_SST_TS_UNSPEC, "sync_unspec" }, - { CTL_SST_TS_ATOM, "sync_atomic" }, - { CTL_SST_TS_LF, "sync_lf_clock" }, - { CTL_SST_TS_HF, "sync_hf_clock" }, - { CTL_SST_TS_UHF, "sync_uhf_clock" }, - { CTL_SST_TS_LOCAL, "sync_local_proto" }, - { CTL_SST_TS_NTP, "sync_ntp" }, - { CTL_SST_TS_UDPTIME, "sync_udp/time" }, - { CTL_SST_TS_WRSTWTCH, "sync_wristwatch" }, - { CTL_SST_TS_TELEPHONE, "sync_telephone" }, - { -1, "sync" } -}; - - -/* - * Peer selection - */ -struct codestring select_codes[] = { - { CTL_PST_SEL_REJECT, "sel_reject" }, - { CTL_PST_SEL_SANE, "sel_sane" }, - { CTL_PST_SEL_CORRECT, "sel_correct" }, - { CTL_PST_SEL_SELCAND, "sel_candidate" }, - { CTL_PST_SEL_SYNCCAND, "sel_sync" }, - { CTL_PST_SEL_DISTSYSPEER, "sel_sys.peer, hi_dist" }, - { CTL_PST_SEL_SYSPEER, "sel_sys.peer" }, - { -1, "sel" } -}; - - -/* - * Clock status - */ -struct codestring clock_codes[] = { - { CTL_CLK_OKAY, "clk_okay" }, - { CTL_CLK_NOREPLY, "clk_noreply" }, - { CTL_CLK_BADFORMAT, "clk_badformat" }, - { CTL_CLK_FAULT, "clk_fault" }, - { CTL_CLK_PROPAGATION, "clk_propagation" }, - { CTL_CLK_BADDATE, "clk_baddate" }, - { CTL_CLK_BADTIME, "clk_badtime" }, - { -1, "clk" } -}; - - -/* - * System Events - */ -struct codestring sys_codes[] = { - { EVNT_UNSPEC, "event_unspec" }, - { EVNT_SYSRESTART, "event_restart" }, - { EVNT_SYSFAULT, "event_fault" }, - { EVNT_SYNCCHG, "event_sync_chg" }, - { EVNT_PEERSTCHG, "event_peer/strat_chg" }, - { EVNT_CLOCKRESET, "event_clock_reset" }, - { EVNT_BADDATETIM, "event_bad_date" }, - { EVNT_CLOCKEXCPT, "event_clock_excptn" }, - { -1, "event" } -}; - -/* - * Peer Events - */ -struct codestring peer_codes[] = { - { EVNT_UNSPEC, "event_unspec" }, - { EVNT_PEERIPERR & ~PEER_EVENT, "event_ip_err" }, - { EVNT_PEERAUTH & ~PEER_EVENT, "event_authen" }, - { EVNT_UNREACH & ~PEER_EVENT, "event_unreach" }, - { EVNT_REACH & ~PEER_EVENT, "event_reach" }, -#if 0 - { EVNT_PEERSTRAT & ~PEER_EVENT, "event_stratum_chg" }, -#endif - { -1, "event" } -}; - - -/* - * Built in command handler declarations - */ -static int openhost P((char *)); -static int sendpkt P((char *, int)); -static int getresponse P((int, int, u_short *, int *, char **, int)); -static int sendrequest P((int, int, int, int, char *)); -static void getcmds P((void)); -static RETSIGTYPE abortcmd P((int)); -static void docmd P((char *)); -static void tokenize P((char *, char **, int *)); -static int findcmd P((char *, struct xcmd *, struct xcmd *, struct xcmd **)); -static int getarg P((char *, int, arg_v *)); -static int rtdatetolfp P((char *, l_fp *)); -static int decodearr P((char *, int *, l_fp *)); -static char * getcode P((int, struct codestring *)); -static void help P((struct parse *, FILE *)); -#if defined(sgi) || defined(SYS_BSDI) || defined(__STDC__) -static int helpsort P((const void *, const void *)); -#else -static int helpsort P((char **, char **)); -#endif /* sgi */ -static void printusage P((struct xcmd *, FILE *)); -static void timeout P((struct parse *, FILE *)); -static void delay P((struct parse *, FILE *)); -static void host P((struct parse *, FILE *)); -static void ntp_poll P((struct parse *, FILE *)); -static void keyid P((struct parse *, FILE *)); -static void keytype P((struct parse *, FILE *)); -static void passwd P((struct parse *, FILE *)); -static void hostnames P((struct parse *, FILE *)); -static void setdebug P((struct parse *, FILE *)); -static void quit P((struct parse *, FILE *)); -static void version P((struct parse *, FILE *)); -static void raw P((struct parse *, FILE *)); -static void cooked P((struct parse *, FILE *)); -static void authenticate P((struct parse *, FILE *)); -static void ntpversion P((struct parse *, FILE *)); -static void warning P((char *, char *, char *)); -static void error P((char *, char *, char *)); -static u_long getkeyid P((char *)); -static void atoascii P((int, char *, char *)); -static void makeascii P((int, char *, FILE *)); -static char * getevents P((int)); -static char * statustoa P((int, int)); -static void rawprint P((int, int, char *, int, FILE *)); -static void startoutput P((void)); -static void output P((FILE *, char *, char *)); -static void endoutput P((FILE *)); -static void outputarr P((FILE *, char *, int, l_fp *)); -static void cookedprint P((int, int, char *, int, FILE *)); -#if defined(sgi) || defined(SYS_BSDI) || defined(__STDC__) -static int assoccmp P((const void *, const void *)); -#else -static int assoccmp P((struct association *, struct association *)); -#endif /* sgi || bsdi */ - - -/* - * Built-in commands we understand - */ -struct xcmd builtins[] = { - { "?", help, { OPT|STR, NO, NO, NO }, - { "command", "", "", "" }, - "tell the use and syntax of commands" }, - { "help", help, { OPT|STR, NO, NO, NO }, - { "command", "", "", "" }, - "tell the use and syntax of commands" }, - { "timeout", timeout, { OPT|UINT, NO, NO, NO }, - { "msec", "", "", "" }, - "set the primary receive time out" }, - { "delay", delay, { OPT|INT, NO, NO, NO }, - { "msec", "", "", "" }, - "set the delay added to encryption time stamps" }, - { "host", host, { OPT|STR, NO, NO, NO }, - { "hostname", "", "", "" }, - "specify the host whose NTP server we talk to" }, - { "poll", ntp_poll, { OPT|UINT, OPT|STR, NO, NO }, - { "n", "verbose", "", "" }, - "poll an NTP server in client mode `n' times" }, - { "passwd", passwd, { NO, NO, NO, NO }, - { "", "", "", "" }, - "specify a password to use for authenticated requests"}, - { "hostnames", hostnames, { OPT|STR, NO, NO, NO }, - { "yes|no", "", "", "" }, - "specify whether hostnames or net numbers are printed"}, - { "debug", setdebug, { OPT|STR, NO, NO, NO }, - { "no|more|less", "", "", "" }, - "set/change debugging level" }, - { "quit", quit, { NO, NO, NO, NO }, - { "", "", "", "" }, - "exit ntpq" }, - { "keyid", keyid, { OPT|UINT, NO, NO, NO }, - { "key#", "", "", "" }, - "set keyid to use for authenticated requests" }, - { "version", version, { NO, NO, NO, NO }, - { "", "", "", "" }, - "print version number" }, - { "raw", raw, { NO, NO, NO, NO }, - { "", "", "", "" }, - "do raw mode variable output" }, - { "cooked", cooked, { NO, NO, NO, NO }, - { "", "", "", "" }, - "do cooked mode variable output" }, - { "authenticate", authenticate, { OPT|STR, NO, NO, NO }, - { "yes|no", "", "", "" }, - "always authenticate requests to this server" }, - { "ntpversion", ntpversion, { OPT|UINT, NO, NO, NO }, - { "version number", "", "", "" }, - "set the NTP version number to use for requests" }, - { "keytype", keytype, { STR, NO, NO, NO }, - { "key type (md5|des)", "", "", "" }, - "set key type to use for authenticated requests (des|md5)" }, - { 0, 0, { NO, NO, NO, NO }, - { "", "", "", "" }, "" } -}; - - -/* - * Default values we use. - */ -#define DEFTIMEOUT (5) /* 5 second time out */ -#define DEFSTIMEOUT (2) /* 2 second time out after first */ -#define DEFDELAY 0x51EB852 /* 20 milliseconds, l_fp fraction */ -#define DEFHOST "localhost" /* default host name */ -#define LENHOSTNAME 256 /* host name is 256 characters long */ -#define MAXCMDS 100 /* maximum commands on cmd line */ -#define MAXHOSTS 100 /* maximum hosts on cmd line */ -#define MAXLINE 512 /* maximum line length */ -#define MAXTOKENS (1+MAXARGS+2) /* maximum number of usable tokens */ -#define MAXVARLEN 256 /* maximum length of a variable name */ -#define MAXVALLEN 256 /* maximum length of a variable value */ -#define MAXOUTLINE 72 /* maximum length of an output line */ - -/* - * Some variables used and manipulated locally - */ -struct timeval tvout = { DEFTIMEOUT, 0 }; /* time out for reads */ -struct timeval tvsout = { DEFSTIMEOUT, 0 }; /* secondary time out */ -l_fp delay_time; /* delay time */ -char currenthost[LENHOSTNAME]; /* current host name */ -struct sockaddr_in hostaddr = { 0 }; /* host address */ -int showhostnames = 1; /* show host names by default */ - -int sockfd; /* fd socket is openned on */ -int havehost = 0; /* set to 1 when host open */ -struct servent *server_entry = NULL; /* server entry for ntp */ - -/* - * Sequence number used for requests. It is incremented before - * it is used. - */ -u_short sequence; - -/* - * Holds data returned from queries. Declare buffer long to be sure of - * alignment. - */ -#define MAXFRAGS 24 /* maximum number of fragments */ -#define DATASIZE (MAXFRAGS*480) /* maximum amount of data */ -long pktdata[DATASIZE/sizeof(long)]; - -/* - * Holds association data for use with the &n operator. - */ -struct association assoc_cache[MAXASSOC]; -int numassoc = 0; /* number of cached associations */ - -/* - * For commands typed on the command line (with the -c option) - */ -int numcmds = 0; -char *ccmds[MAXCMDS]; -#define ADDCMD(cp) if (numcmds < MAXCMDS) ccmds[numcmds++] = (cp) - -/* - * When multiple hosts are specified. - */ -int numhosts = 0; -char *chosts[MAXHOSTS]; -#define ADDHOST(cp) if (numhosts < MAXHOSTS) chosts[numhosts++] = (cp) - -/* - * Error codes for internal use - */ -#define ERR_UNSPEC 256 -#define ERR_INCOMPLETE 257 -#define ERR_TIMEOUT 258 -#define ERR_TOOMUCH 259 - -/* - * Macro definitions we use - */ -#define ISSPACE(c) ((c) == ' ' || (c) == '\t') -#define ISEOL(c) ((c) == '\n' || (c) == '\r' || (c) == '\0') -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -/* - * Jump buffer for longjumping back to the command level - */ -jmp_buf interrupt_buf; - -/* - * Points at file being currently printed into - */ -FILE *current_output; - -/* - * Command table imported from ntpdc_ops.c - */ -extern struct xcmd opcmds[]; - -char *progname; -int debug; - -/* - * main - parse arguments and handle options - */ -int -main(argc, argv) -int argc; -char *argv[]; -{ - int c; - int errflg = 0; - extern int ntp_optind; - extern char *ntp_optarg; - - delay_time.l_ui = 0; - delay_time.l_uf = DEFDELAY; - - progname = argv[0]; - while ((c = ntp_getopt(argc, argv, "c:dinp")) != EOF) - switch (c) { - case 'c': - ADDCMD(ntp_optarg); - break; - case 'd': - ++debug; - break; - case 'i': - interactive = 1; - break; - case 'n': - showhostnames = 0; - break; - case 'p': - ADDCMD("peers"); - break; - default: - errflg++; - break; - } - if (errflg) { - (void) fprintf(stderr, - "usage: %s [-dinp] [-c cmd] host ...\n", - progname); - exit(2); - } - if (ntp_optind == argc) { - ADDHOST(DEFHOST); - } else { - for (; ntp_optind < argc; ntp_optind++) - ADDHOST(argv[ntp_optind]); - } - - if (numcmds == 0 && interactive == 0 - && isatty(fileno(stdin)) && isatty(fileno(stderr))) { - interactive = 1; - } - - if (interactive) - (void) signal_no_reset(SIGINT, abortcmd); - - if (numcmds == 0) { - (void) openhost(chosts[0]); - getcmds(); - } else { - int ihost; - int icmd; - - for (ihost = 0; ihost < numhosts; ihost++) { - if (openhost(chosts[ihost])) - for (icmd = 0; icmd < numcmds; icmd++) - docmd(ccmds[icmd]); - } - } - exit(0); -} - - -/* - * openhost - open a socket to a host - */ -static int -openhost(hname) - char *hname; -{ - u_long netnum; - char temphost[LENHOSTNAME]; - - if (server_entry == NULL) { - server_entry = getservbyname("ntp", "udp"); - if (server_entry == NULL) { - (void) fprintf(stderr, "%s: ntp/udp: unknown service\n", - progname); - exit(1); - } - if (debug > 2) - printf("Got ntp/udp service entry\n"); - } - - if (!getnetnum(hname, &netnum, temphost)) - return 0; - - if (debug > 2) - printf("Opening host %s\n", temphost); - - if (havehost == 1) { - if (debug > 2) - printf("Closing old host %s\n", currenthost); - (void) close(sockfd); - havehost = 0; - } - (void) strcpy(currenthost, temphost); - - hostaddr.sin_family = AF_INET; - hostaddr.sin_port = server_entry->s_port; - hostaddr.sin_addr.s_addr = netnum; - - sockfd = socket(AF_INET, SOCK_DGRAM, 0); - if (sockfd == -1) - error("socket", "", ""); - -#if defined(SYS_HPUX) && (SYS_HPUX < 8) -#ifdef SO_RCVBUF - { int rbufsize = DATASIZE + 2048; /* 2K for slop */ - if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, - &rbufsize, sizeof(int)) == -1) - error("setsockopt", "", ""); - } -#endif -#endif - - if (connect(sockfd, (struct sockaddr *)&hostaddr, - sizeof(hostaddr)) == -1) - error("connect", "", ""); - - havehost = 1; - return 1; -} - - -/* XXX ELIMINATE sendpkt similar in ntpq.c, ntpdc.c, ntp_io.c, ntptrace.c */ -/* - * sendpkt - send a packet to the remote host - */ -static int -sendpkt(xdata, xdatalen) - char *xdata; - int xdatalen; -{ - if (debug >= 3) - printf("Sending %d octets\n", xdatalen); - - if (write(sockfd, xdata, xdatalen) == -1) { - warning("write to %s failed", currenthost, ""); - return -1; - } - - if (debug >= 4) { - int first = 8; - printf("Packet data:\n"); - while (xdatalen-- > 0) { - if (first-- == 0) { - printf("\n"); - first = 7; - } - printf(" %02x", *xdata++ & 0xff); - } - printf("\n"); - } - return 0; -} - - - -/* - * getresponse - get a (series of) response packet(s) and return the data - */ -static int -getresponse(opcode, associd, rstatus, rsize, rdata, timeo) - int opcode; - int associd; - u_short *rstatus; - int *rsize; - char **rdata; - int timeo; -{ - struct ntp_control rpkt; - struct timeval tvo; - u_short offsets[MAXFRAGS+1]; - u_short counts[MAXFRAGS+1]; - u_short offset; - u_short count; - int numfrags; - int seenlastfrag; - fd_set fds; - int n; - - /* - * This is pretty tricky. We may get between 1 and MAXFRAG packets - * back in response to the request. We peel the data out of - * each packet and collect it in one long block. When the last - * packet in the sequence is received we'll know how much data we - * should have had. Note we use one long time out, should reconsider. - */ - *rsize = 0; - if (rstatus) - *rstatus = 0; - *rdata = (char *)pktdata; - - numfrags = 0; - seenlastfrag = 0; - - FD_ZERO(&fds); - -again: - if (numfrags == 0) - tvo = tvout; - else - tvo = tvsout; - - FD_SET(sockfd, &fds); - n = select(sockfd+1, &fds, (fd_set *)0, (fd_set *)0, &tvo); - - if (debug >= 1) - printf("select() returns %d\n", n); - - if (n == -1) { - warning("select fails", "", ""); - return -1; - } - if (n == 0) { - /* - * Timed out. Return what we have - */ - if (numfrags == 0) { - if (timeo) - (void) fprintf(stderr, - "%s: timed out, nothing received\n", - currenthost); - return ERR_TIMEOUT; - } else { - if (timeo) - (void) fprintf(stderr, - "%s: timed out with incomplete data\n", - currenthost); - if (debug) { - printf("Received fragments:\n"); - for (n = 0; n < numfrags; n++) - printf("%4d %d\n", offsets[n], - counts[n]); - if (seenlastfrag) - printf("last fragment received\n"); - else - printf("last fragment not received\n"); - } - return ERR_INCOMPLETE; - } - } - - n = read(sockfd, (char *)&rpkt, sizeof(rpkt)); - if (n == -1) { - warning("read", "", ""); - return -1; - } - - if (debug >= 4) { - int len = n, first = 8; - char *data = (char *)&rpkt; - - printf("Packet data:\n"); - while (len-- > 0) { - if (first-- == 0) { - printf("\n"); - first = 7; - } - printf(" %02x", *data++ & 0xff); - } - printf("\n"); - } - - /* - * Check for format errors. Bug proofing. - */ - if (n < CTL_HEADER_LEN) { - if (debug) - printf("Short (%d byte) packet received\n", n); - goto again; - } - if (PKT_VERSION(rpkt.li_vn_mode) > NTP_VERSION - || PKT_VERSION(rpkt.li_vn_mode) <= NTP_OLDVERSION) { - if (debug) - printf("Packet received with version %d\n", - PKT_VERSION(rpkt.li_vn_mode)); - goto again; - } - if (PKT_MODE(rpkt.li_vn_mode) != MODE_CONTROL) { - if (debug) - printf("Packet received with mode %d\n", - PKT_MODE(rpkt.li_vn_mode)); - goto again; - } - if (!CTL_ISRESPONSE(rpkt.r_m_e_op)) { - if (debug) - printf("Received request packet, wanted response\n"); - goto again; - } - - /* - * Check opcode and sequence number for a match. - * Could be old data getting to us. - */ - if (ntohs(rpkt.sequence) != sequence) { - if (debug) - printf( - "Received sequnce number %d, wanted %d\n", - ntohs(rpkt.sequence), sequence); - goto again; - } - if (CTL_OP(rpkt.r_m_e_op) != opcode) { - if (debug) - printf( - "Received opcode %d, wanted %d (sequence number okay)\n", - CTL_OP(rpkt.r_m_e_op), opcode); - goto again; - } - - /* - * Check the error code. If non-zero, return it. - */ - if (CTL_ISERROR(rpkt.r_m_e_op)) { - int errcode; - - errcode = (ntohs(rpkt.status) >> 8) & 0xff; - if (debug && CTL_ISMORE(rpkt.r_m_e_op)) { - printf("Error code %d received on not-final packet\n", - errcode); - } - if (errcode == CERR_UNSPEC) - return ERR_UNSPEC; - return errcode; - } - - /* - * Check the association ID to make sure it matches what - * we sent. - */ - if (ntohs(rpkt.associd) != associd) { - if (debug) - printf("Association ID %d doesn't match expected %d\n", - ntohs(rpkt.associd), associd); - /* - * Hack for silly fuzzballs which, at the time of writing, - * return an assID of sys.peer when queried for system variables. - */ -#ifdef notdef - goto again; -#endif - } - - /* - * Collect offset and count. Make sure they make sense. - */ - offset = ntohs(rpkt.offset); - count = ntohs(rpkt.count); - - if (debug >= 3) { - int shouldbesize; - u_long key; - u_long *lpkt; - int maclen; - - /* - * Usually we ignore authentication, but for debugging purposes - * we watch it here. - */ - shouldbesize = CTL_HEADER_LEN + count; - - /* round to 8 octet boundary */ - shouldbesize = (shouldbesize + 7) & ~7; - - if (n & 0x3) { - printf("Packet not padded, size = %d\n", n); - } if ((maclen = n - shouldbesize) >= MIN_MAC_LEN) { - printf( -"Packet shows signs of authentication (total %d, data %d, mac %d)\n", - n, shouldbesize, maclen); - lpkt = (u_long *)&rpkt; - printf("%08lx %08lx %08lx %08lx %08lx %08lx\n", - (u_long)ntohl(lpkt[(n - maclen)/sizeof(u_long) - 3]), - (u_long)ntohl(lpkt[(n - maclen)/sizeof(u_long) - 2]), - (u_long)ntohl(lpkt[(n - maclen)/sizeof(u_long) - 1]), - (u_long)ntohl(lpkt[(n - maclen)/sizeof(u_long)]), - (u_long)ntohl(lpkt[(n - maclen)/sizeof(u_long) + 1]), - (u_long)ntohl(lpkt[(n - maclen)/sizeof(u_long) + 2])); - key = ntohl(lpkt[(n - maclen) / sizeof(u_long)]); - printf("Authenticated with keyid %lu\n", key); - if (key != 0 && key != info_auth_keyid) { - printf("We don't know that key\n"); - } else { - if (authdecrypt(key, (U_LONG *)&rpkt, - (n - maclen))) { - printf("Auth okay!\n"); - } else { - printf("Auth failed!\n"); - } - } - } - } - - if (debug >= 2) - printf("Got packet, size = %d\n", n); - if (count > (u_short)(n-CTL_HEADER_LEN)) { - if (debug) - printf( - "Received count of %d octets, data in packet is %d\n", - count, n-CTL_HEADER_LEN); - goto again; - } - if (count == 0 && CTL_ISMORE(rpkt.r_m_e_op)) { - if (debug) - printf("Received count of 0 in non-final fragment\n"); - goto again; - } - if (offset + count > sizeof(pktdata)) { - if (debug) - printf("Offset %d, count %d, too big for buffer\n", - offset, count); - return ERR_TOOMUCH; - } - if (seenlastfrag && !CTL_ISMORE(rpkt.r_m_e_op)) { - if (debug) - printf("Received second last fragment packet\n"); - goto again; - } - - /* - * So far, so good. Record this fragment, making sure it doesn't - * overlap anything. - */ - if (debug >= 2) - printf("Packet okay\n");; - - if (numfrags == MAXFRAGS) { - if (debug) - printf("Number of fragments exceeds maximum\n"); - return ERR_TOOMUCH; - } - - for (n = 0; n < numfrags; n++) { - if (offset == offsets[n]) - goto again; /* duplicate */ - if (offset < offsets[n]) - break; - } - - if ((u_short)(n > 0 && offsets[n-1] + counts[n-1]) > offset) - goto overlap; - if (n < numfrags && (u_short)(offset + count) > offsets[n]) - goto overlap; - - { - register int i; - - for (i = numfrags; i > n; i--) { - offsets[i] = offsets[i-1]; - counts[i] = counts[i-1]; - } - } - offsets[n] = offset; - counts[n] = count; - numfrags++; - - /* - * Got that stuffed in right. Figure out if this was the last. - * Record status info out of the last packet. - */ - if (!CTL_ISMORE(rpkt.r_m_e_op)) { - seenlastfrag = 1; - if (rstatus != 0) - *rstatus = ntohs(rpkt.status); - } - - /* - * Copy the data into the data buffer. - */ - memmove((char *)pktdata + offset, (char *)rpkt.data, count); - - /* - * If we've seen the last fragment, look for holes in the sequence. - * If there aren't any, we're done. - */ - if (seenlastfrag && offsets[0] == 0) { - for (n = 1; n < numfrags; n++) { - if (offsets[n-1] + counts[n-1] != offsets[n]) - break; - } - if (n == numfrags) { - *rsize = offsets[numfrags-1] + counts[numfrags-1]; - return 0; - } - } - goto again; - -overlap: - /* - * Print debugging message about overlapping fragments - */ - if (debug) - printf("Overlapping fragments returned in response\n"); - goto again; -} - - -/* - * sendrequest - format and send a request packet - */ -static int -sendrequest(opcode, associd, auth, qsize, qdata) - int opcode; - int associd; - int auth; - int qsize; - char *qdata; -{ - struct ntp_control qpkt; - int pktsize; - - /* - * Check to make sure the data will fit in one packet - */ - if (qsize > CTL_MAX_DATA_LEN) { - (void) fprintf(stderr, - "***Internal error! qsize (%d) too large\n", - qsize); - return 1; - } - - /* - * Fill in the packet - */ - qpkt.li_vn_mode = PKT_LI_VN_MODE(0, pktversion, MODE_CONTROL); - qpkt.r_m_e_op = (u_char)opcode & CTL_OP_MASK; - qpkt.sequence = htons(sequence); - qpkt.status = 0; - qpkt.associd = htons((u_short)associd); - qpkt.offset = 0; - qpkt.count = htons((u_short)qsize); - - /* - * If we have data, copy it in and pad it out to a 64 - * bit boundary. - */ - if (qsize > 0) { - memmove((char *)qpkt.data, qdata, qsize); - pktsize = qsize + CTL_HEADER_LEN; - while (pktsize & (sizeof(u_long) - 1)) { - qpkt.data[qsize++] = 0; - pktsize++; - } - } else { - pktsize = CTL_HEADER_LEN; - } - - /* - * If it isn't authenticated we can just send it. Otherwise - * we're going to have to think about it a little. - */ - if (!auth && !always_auth) { - return sendpkt((char *)&qpkt, pktsize); - } else { - char *pass; - - /* - * Pad out packet to a multiple of 8 octets to be sure - * receiver can handle it. - */ - while (pktsize & 7) { - qpkt.data[qsize++] = 0; - pktsize++; - } - - /* - * Get the keyid and the password if we don't have one. - */ - if (info_auth_keyid == -1) { - info_auth_keyid = getkeyid("Keyid: "); - if (info_auth_keyid == -1) { - (void) fprintf(stderr, - "Keyid must be defined, request not sent\n"); - return 1; - } - } - if (!auth_havekey(info_auth_keyid)) { - pass = getpass("Password: "); - if (*pass != '\0') - authusekey(info_auth_keyid, - info_auth_keytype, pass); - } - if (auth_havekey(info_auth_keyid)) { - int maclen; - - /* - * Stick the keyid in the packet where - * cp currently points. Cp should be aligned - * properly. Then do the encryptions. - */ - *(u_long *)(&qpkt.data[qsize]) = htonl(info_auth_keyid); - maclen = authencrypt(info_auth_keyid, (U_LONG *)&qpkt, - pktsize); - return sendpkt((char *)&qpkt, pktsize + maclen); - } else { - (void) fprintf(stderr, - "No password, request not sent\n"); - return 1; - } - } - /*NOTREACHED*/ -} - - -/* - * doquery - send a request and process the response - */ -int -doquery(opcode, associd, auth, qsize, qdata, rstatus, rsize, rdata) - int opcode; - int associd; - int auth; - int qsize; - char *qdata; - u_short *rstatus; - int *rsize; - char **rdata; -{ - int res; - int done; - - /* - * Check to make sure host is open - */ - if (!havehost) { - (void) fprintf(stderr, "***No host open, use `host' command\n"); - return -1; - } - - done = 0; - sequence++; - -again: - /* - * send a request - */ - res = sendrequest(opcode, associd, auth, qsize, qdata); - if (res != 0) - return res; - - /* - * Get the response. If we got a standard error, print a message - */ - res = getresponse(opcode, associd, rstatus, rsize, rdata, done); - - if (res > 0) { - if (!done && (res == ERR_TIMEOUT || res == ERR_INCOMPLETE)) { - if (res == ERR_INCOMPLETE) { - /* - * better bump the sequence so we don't - * get confused about differing fragments. - */ - sequence++; - } - done = 1; - goto again; - } - switch(res) { - case CERR_BADFMT: - (void) fprintf(stderr, - "***Server reports a bad format request packet\n"); - break; - case CERR_PERMISSION: - (void) fprintf(stderr, - "***Server disallowed request (authentication?)\n"); - break; - case CERR_BADOP: - (void) fprintf(stderr, - "***Server reports a bad opcode in request\n"); - break; - case CERR_BADASSOC: - (void) fprintf(stderr, - "***Association ID %d unknown to server\n",associd); - break; - case CERR_UNKNOWNVAR: - (void) fprintf(stderr, - "***A request variable was unknown to the server\n"); - break; - case CERR_BADVALUE: - (void) fprintf(stderr, - "***Server indicates a request variable was bad\n"); - break; - case ERR_UNSPEC: - (void) fprintf(stderr, - "***Server returned an unspecified error\n"); - break; - case ERR_TIMEOUT: - (void) fprintf(stderr, "***Request timed out\n"); - break; - case ERR_INCOMPLETE: - (void) fprintf(stderr, - "***Response from server was incomplete\n"); - break; - case ERR_TOOMUCH: - (void) fprintf(stderr, - "***Buffer size exceeded for returned data\n"); - break; - default: - (void) fprintf(stderr, - "***Server returns unknown error code %d\n", res); - break; - } - } - return res; -} - - -/* - * getcmds - read commands from the standard input and execute them - */ -static void -getcmds() -{ - char line[MAXLINE]; - - for (;;) { - if (interactive) { - (void) fputs(prompt, stderr); - (void) fflush(stderr); - } - - if (fgets(line, sizeof line, stdin) == NULL) - return; - - docmd(line); - } -} - - -/* - * abortcmd - catch interrupts and abort the current command - */ -static RETSIGTYPE -abortcmd(sig) -int sig; -{ - if (current_output == stdout) - (void) fflush(stdout); - putc('\n', stderr); - (void) fflush(stderr); - if (jump) longjmp(interrupt_buf, 1); -} - - -/* - * docmd - decode the command line and execute a command - */ -static void -docmd(cmdline) - char *cmdline; -{ - char *tokens[1+MAXARGS+2]; - struct parse pcmd; - int ntok; - static int i; - struct xcmd *xcmd; - - /* - * Tokenize the command line. If nothing on it, return. - */ - tokenize(cmdline, tokens, &ntok); - if (ntok == 0) - return; - - /* - * Find the appropriate command description. - */ - i = findcmd(tokens[0], builtins, opcmds, &xcmd); - if (i == 0) { - (void) fprintf(stderr, "***Command `%s' unknown\n", - tokens[0]); - return; - } else if (i >= 2) { - (void) fprintf(stderr, "***Command `%s' ambiguous\n", - tokens[0]); - return; - } - - /* - * Save the keyword, then walk through the arguments, interpreting - * as we go. - */ - pcmd.keyword = tokens[0]; - pcmd.nargs = 0; - for (i = 0; i < MAXARGS && xcmd->arg[i] != NO; i++) { - if ((i+1) >= ntok) { - if (!(xcmd->arg[i] & OPT)) { - printusage(xcmd, stderr); - return; - } - break; - } - if ((xcmd->arg[i] & OPT) && (*tokens[i+1] == '>')) - break; - if (!getarg(tokens[i+1], (int)xcmd->arg[i], &pcmd.argval[i])) - return; - pcmd.nargs++; - } - - i++; - if (i < ntok && *tokens[i] == '>') { - char *fname; - - if (*(tokens[i]+1) != '\0') - fname = tokens[i]+1; - else if ((i+1) < ntok) - fname = tokens[i+1]; - else { - (void) fprintf(stderr, "***No file for redirect\n"); - return; - } - - current_output = fopen(fname, "w"); - if (current_output == NULL) { - (void) fprintf(stderr, "***Error opening %s: ", fname); - perror(""); - return; - } - i = 1; /* flag we need a close */ - } else { - current_output = stdout; - i = 0; /* flag no close */ - } - - if (interactive && setjmp(interrupt_buf)) { - return; - } else { - jump++; - (xcmd->handler)(&pcmd, current_output); - if (i) (void) fclose(current_output); - } -} - - -/* - * tokenize - turn a command line into tokens - */ -static void -tokenize(line, tokens, ntok) - char *line; - char **tokens; - int *ntok; -{ - register char *cp; - register char *sp; - static char tspace[MAXLINE]; - - sp = tspace; - cp = line; - for (*ntok = 0; *ntok < MAXTOKENS; (*ntok)++) { - tokens[*ntok] = sp; - while (ISSPACE(*cp)) - cp++; - if (ISEOL(*cp)) - break; - do { - *sp++ = *cp++; - } while (!ISSPACE(*cp) && !ISEOL(*cp)); - - *sp++ = '\0'; - } -} - - - -/* - * findcmd - find a command in a command description table - */ -static int -findcmd(str, clist1, clist2, cmd) - register char *str; - struct xcmd *clist1; - struct xcmd *clist2; - struct xcmd **cmd; -{ - register struct xcmd *cl; - register int clen; - int nmatch; - struct xcmd *nearmatch = NULL; - struct xcmd *clist; - - clen = strlen(str); - nmatch = 0; - if (clist1 != 0) - clist = clist1; - else if (clist2 != 0) - clist = clist2; - else - return 0; - -again: - for (cl = clist; cl->keyword != 0; cl++) { - /* do a first character check, for efficiency */ - if (*str != *(cl->keyword)) - continue; - if (strncmp(str, cl->keyword, clen) == 0) { - /* - * Could be extact match, could be approximate. - * Is exact if the length of the keyword is the - * same as the str. - */ - if (*((cl->keyword) + clen) == '\0') { - *cmd = cl; - return 1; - } - nmatch++; - nearmatch = cl; - } - } - - /* - * See if there is more to do. If so, go again. Sorry about the - * goto, too much looking at BSD sources... - */ - if (clist == clist1 && clist2 != 0) { - clist = clist2; - goto again; - } - - /* - * If we got extactly 1 near match, use it, else return number - * of matches. - */ - if (nmatch == 1) { - *cmd = nearmatch; - return 1; - } - return nmatch; -} - - -/* - * getarg - interpret an argument token - */ -static int -getarg(str, code, argp) - char *str; - int code; - arg_v *argp; -{ - int isneg; - char *cp, *np; - static char *digits = "0123456789"; - - switch (code & ~OPT) { - case STR: - argp->string = str; - break; - case ADD: - if (!getnetnum(str, &(argp->netnum), (char *)0)) { - return 0; - } - break; - case INT: - case UINT: - isneg = 0; - np = str; - if (*np == '&') { - np++; - isneg = atoi(np); - if (isneg <= 0) { - (void) fprintf(stderr, - "***Association value `%s' invalid/undecodable\n", str); - return 0; - } - if (isneg > numassoc) { - (void) fprintf(stderr, - "***Association for `%s' unknown (max &%d)\n", - str, numassoc); - return 0; - } - argp->uval = assoc_cache[isneg-1].assid; - break; - } - - if (*np == '-') { - np++; - isneg = 1; - } - - argp->uval = 0; - do { - cp = strchr(digits, *np); - if (cp == NULL) { - (void) fprintf(stderr, - "***Illegal integer value %s\n", str); - return 0; - } - argp->uval *= 10; - argp->uval += (cp - digits); - } while (*(++np) != '\0'); - - if (isneg) { - if ((code & ~OPT) == UINT) { - (void) fprintf(stderr, - "***Value %s should be unsigned\n", str); - return 0; - } - argp->ival = -argp->ival; - } - break; - } - - return 1; -} - - -/* - * getnetnum - given a host name, return its net number - * and (optional) full name - */ -int -getnetnum(host, num, fullhost) - char *host; - u_long *num; - char *fullhost; -{ - struct hostent *hp; - - if (decodenetnum(host, num)) { - if (fullhost != 0) { - (void) sprintf(fullhost, "%lu.%lu.%lu.%lu", - (u_long)((htonl(*num) >> 24) & 0xff), - (u_long)((htonl(*num) >> 16) & 0xff), - (u_long)((htonl(*num) >> 8) & 0xff), - (u_long)(htonl(*num) & 0xff)); - } - return 1; - } else if ((hp = gethostbyname(host)) != 0) { - memmove((char *)num, hp->h_addr, sizeof(u_long)); - if (fullhost != 0) - (void) strcpy(fullhost, hp->h_name); - return 1; - } else { - (void) fprintf(stderr, "***Can't find host %s\n", host); - return 0; - } - /*NOTREACHED*/ -} - -/* - * nntohost - convert network number to host name. This routine enforces - * the showhostnames setting. - */ -char * -nntohost(netnum) - u_long netnum; -{ - if (!showhostnames) - return numtoa(netnum); - if ((ntohl(netnum) & REFCLOCK_MASK) == REFCLOCK_ADDR) - return refnumtoa(netnum); - return numtohost(netnum); -} - - -/* - * rtdatetolfp - decode an RT-11 date into an l_fp - */ -static int -rtdatetolfp(str, lfp) - char *str; - l_fp *lfp; -{ - register char *cp; - register int i; - struct calendar cal; - char buf[4]; - static char *months[12] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" - }; - - cal.yearday = 0; - - /* - * An RT-11 date looks like: - * - * d[d]-Mth-y[y] hh:mm:ss - */ - cp = str; - if (!isdigit(*cp)) { - if (*cp == '-') { - /* - * Catch special case - */ - L_CLR(lfp); - return 1; - } - return 0; - } - - cal.monthday = *cp++ - '0'; /* ascii dependent */ - if (isdigit(*cp)) { - cal.monthday = (cal.monthday << 3) + (cal.monthday << 1); - cal.monthday += *cp++ - '0'; - } - - if (*cp++ != '-') - return 0; - - for (i = 0; i < 3; i++) - buf[i] = *cp++; - buf[3] = '\0'; - - for (i = 0; i < 12; i++) - if (STREQ(buf, months[i])) - break; - if (i == 12) - return 0; - cal.month = i + 1; - - if (*cp++ != '-') - return 0; - - if (!isdigit(*cp)) - return 0; - cal.year = *cp++ - '0'; - if (isdigit(*cp)) { - cal.year = (cal.year << 3) + (cal.year << 1); - cal.year += *cp++ - '0'; - } - - /* - * Catch special case. If cal.year == 0 this is a zero timestamp. - */ - if (cal.year == 0) { - L_CLR(lfp); - return 1; - } - - if (*cp++ != ' ' || !isdigit(*cp)) - return 0; - cal.hour = *cp++ - '0'; - if (isdigit(*cp)) { - cal.hour = (cal.hour << 3) + (cal.hour << 1); - cal.hour += *cp++ - '0'; - } - - if (*cp++ != ':' || !isdigit(*cp)) - return 0; - cal.minute = *cp++ - '0'; - if (isdigit(*cp)) { - cal.minute = (cal.minute << 3) + (cal.minute << 1); - cal.minute += *cp++ - '0'; - } - - if (*cp++ != ':' || !isdigit(*cp)) - return 0; - cal.second = *cp++ - '0'; - if (isdigit(*cp)) { - cal.second = (cal.second << 3) + (cal.second << 1); - cal.second += *cp++ - '0'; - } - - cal.year += 1900; - lfp->l_ui = caltontp(&cal); - lfp->l_uf = 0; - return 1; -} - - -/* - * decodets - decode a timestamp into an l_fp format number, with - * consideration of fuzzball formats. - */ -int -decodets(str, lfp) - char *str; - l_fp *lfp; -{ - /* - * If it starts with a 0x, decode as hex. - */ - if (*str == '0' && (*(str+1) == 'x' || *(str+1) == 'X')) - return hextolfp(str+2, lfp); - - /* - * If it starts with a '"', try it as an RT-11 date. - */ - if (*str == '"') { - register char *cp = str+1; - register char *bp; - char buf[30]; - - bp = buf; - while (*cp != '"' && *cp != '\0' && bp < &buf[29]) - *bp++ = *cp++; - *bp = '\0'; - return rtdatetolfp(buf, lfp); - } - - /* - * Might still be hex. Check out the first character. Talk - * about heuristics! - */ - if ((*str >= 'A' && *str <= 'F') || (*str >= 'a' && *str <= 'f')) - return hextolfp(str, lfp); - - /* - * Try it as a decimal. If this fails, try as an unquoted - * RT-11 date. This code should go away eventually. - */ - if (atolfp(str, lfp)) - return 1; - return rtdatetolfp(str, lfp); -} - - -/* - * decodetime - decode a time value. It should be in milliseconds - */ -int -decodetime(str, lfp) - char *str; - l_fp *lfp; -{ - return mstolfp(str, lfp); -} - - -/* - * decodeint - decode an integer - */ -int -decodeint(str, val) - char *str; - long *val; -{ - if (*str == '0') { - if (*(str+1) == 'x' || *(str+1) == 'X') - return hextoint(str+2, (u_long *)&val); - return octtoint(str, (u_long *)&val); - } - return atoint(str, val); -} - - -/* - * decodeuint - decode an unsigned integer - */ -int -decodeuint(str, val) - char *str; - u_long *val; -{ - if (*str == '0') { - if (*(str+1) == 'x' || *(str+1) == 'X') - return hextoint(str+2, val); - return octtoint(str, val); - } - return atouint(str, val); -} - - -/* - * decodearr - decode an array of time values - */ -static int -decodearr(str, narr, lfparr) - char *str; - int *narr; - l_fp *lfparr; -{ - register char *cp, *bp; - register l_fp *lfp; - char buf[60]; - - lfp = lfparr; - cp = str; - *narr = 0; - - while (*narr < 8) { - while (isspace(*cp)) - cp++; - if (*cp == '\0') - break; - - bp = buf; - while (!isspace(*cp) && *cp != '\0') - *bp++ = *cp++; - *bp++ = '\0'; - - if (!decodetime(buf, lfp)) - return 0; - (*narr)++; - lfp++; - } - return 1; -} - - - - -/* - * getcode - return string corresponding to code - */ -static char * -getcode(code, codetab) - int code; - struct codestring *codetab; -{ - static char buf[30]; - - while (codetab->code != -1) { - if (codetab->code == code) - return codetab->string; - codetab++; - } - (void) sprintf(buf, "%s_%d", codetab->string, code); - return buf; -} - - -/* - * Finally, the built in command handlers - */ - -/* - * help - tell about commands, or details of a particular command - */ -static void -help(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - int i; - int n; - struct xcmd *xcp; - char *cmd; - char *cmdsort[100]; - int length[100]; - int maxlength; - int numperline; - static char *spaces = " "; /* 20 spaces */ - - if (pcmd->nargs == 0) { - n = 0; - for (xcp = builtins; xcp->keyword != 0; xcp++) { - if (*(xcp->keyword) != '?') - cmdsort[n++] = xcp->keyword; - } - for (xcp = opcmds; xcp->keyword != 0; xcp++) - cmdsort[n++] = xcp->keyword; - -#if defined(sgi) || defined(SYS_BSDI) || defined(__STDC__) - qsort((void *)cmdsort, n, sizeof(char *), helpsort); -#else - qsort((char *)cmdsort, n, sizeof(char *), helpsort); -#endif /* sgi || bsdi */ - - maxlength = 0; - for (i = 0; i < n; i++) { - length[i] = strlen(cmdsort[i]); - if (length[i] > maxlength) - maxlength = length[i]; - } - maxlength++; - numperline = 76 / maxlength; - - (void) fprintf(fp, "Commands available:\n"); - for (i = 0; i < n; i++) { - if ((i % numperline) == (numperline-1) - || i == (n-1)) - (void) fprintf(fp, "%s\n", cmdsort[i]); - else - (void) fprintf(fp, "%s%s", cmdsort[i], - spaces+20-maxlength+length[i]); - } - } else { - cmd = pcmd->argval[0].string; - n = findcmd(cmd, builtins, opcmds, &xcp); - if (n == 0) { - (void) fprintf(stderr, - "Command `%s' is unknown\n", cmd); - return; - } else if (n >= 2) { - (void) fprintf(stderr, - "Command `%s' is ambiguous\n", cmd); - return; - } - (void) fprintf(fp, "function: %s\n", xcp->comment); - printusage(xcp, fp); - } -} - - -/* - * helpsort - do hostname qsort comparisons - */ -static int -#if defined(sgi) || defined(SYS_BSDI) || defined(__STDC__) -helpsort(t1, t2) - const void *t1; - const void *t2; -{ - const char **name1 = (const char **)t1; - const char **name2 = (const char **)t2; -#else -helpsort(name1, name2) - char **name1; - char **name2; -{ -#endif /* sgi || bsdi */ - return strcmp(*name1, *name2); -} - - -/* - * printusage - print usage information for a command - */ -static void -printusage(xcp, fp) - struct xcmd *xcp; - FILE *fp; -{ - register int i; - - (void) fprintf(fp, "usage: %s", xcp->keyword); - for (i = 0; i < MAXARGS && xcp->arg[i] != NO; i++) { - if (xcp->arg[i] & OPT) - (void) fprintf(fp, " [ %s ]", xcp->desc[i]); - else - (void) fprintf(fp, " %s", xcp->desc[i]); - } - (void) fprintf(fp, "\n"); -} - - -/* - * timeout - set time out time - */ -static void -timeout(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - int val; - - if (pcmd->nargs == 0) { - val = tvout.tv_sec * 1000 + tvout.tv_usec / 1000; - (void) fprintf(fp, "primary timeout %d ms\n", val); - } else { - tvout.tv_sec = pcmd->argval[0].uval / 1000; - tvout.tv_usec = (pcmd->argval[0].uval - (tvout.tv_sec * 1000)) - * 1000; - } -} - - -/* - * delay - set delay for auth requests - */ -static void -delay(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - int isneg; - u_long val; - - if (pcmd->nargs == 0) { - val = delay_time.l_ui * 1000 + delay_time.l_uf / 4294967; - (void) fprintf(fp, "delay %lu ms\n", val); - } else { - if (pcmd->argval[0].ival < 0) { - isneg = 1; - val = (u_long)(-pcmd->argval[0].ival); - } else { - isneg = 0; - val = (u_long)pcmd->argval[0].ival; - } - - delay_time.l_ui = val / 1000; - val %= 1000; - delay_time.l_uf = val * 4294967; /* 2**32/1000 */ - - if (isneg) - L_NEG(&delay_time); - } -} - - -/* - * host - set the host we are dealing with. - */ -static void -host(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (pcmd->nargs == 0) { - if (havehost) - (void) fprintf(fp, "current host is %s\n", currenthost); - else - (void) fprintf(fp, "no current host\n"); - } else if (openhost(pcmd->argval[0].string)) { - (void) fprintf(fp, "current host set to %s\n", currenthost); - numassoc = 0; - } else { - if (havehost) - (void) fprintf(fp, - "current host remains %s\n", currenthost); - else - (void) fprintf(fp, "still no current host\n"); - } -} - - -/* - * poll - do one (or more) polls of the host via NTP - */ -/*ARGSUSED*/ -static void -ntp_poll(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - (void) fprintf(fp, "poll not implemented yet\n"); -} - - -/* - * keyid - get a keyid to use for authenticating requests - */ -static void -keyid(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (pcmd->nargs == 0) { - if (info_auth_keyid == -1) - (void) fprintf(fp, "no keyid defined\n"); - else - (void) fprintf(fp, "keyid is %lu\n", info_auth_keyid); - } else { - info_auth_keyid = pcmd->argval[0].uval; - } -} - -/* - * keytype - get type of key to use for authenticating requests - */ -static void -keytype(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (pcmd->nargs == 0) - fprintf(fp, "keytype is %s", - (info_auth_keytype == KEY_TYPE_MD5) ? "md5" : "des"); - else - switch (*(pcmd->argval[0].string)) { - case 'm': - case 'M': - info_auth_keytype = KEY_TYPE_MD5; - break; - - case 'd': - case 'D': - info_auth_keytype = KEY_TYPE_DES; - break; - - default: - fprintf(fp, "keytype must be 'md5' or 'des'\n"); - } -} - - - -/* - * passwd - get an authentication key - */ -/*ARGSUSED*/ -static void -passwd(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - char *pass; - - if (info_auth_keyid == -1) { - info_auth_keyid = getkeyid("Keyid: "); - if (info_auth_keyid == -1) { - (void)fprintf(fp, "Keyid must be defined\n"); - return; - } - } - pass = getpass("Password: "); - if (*pass == '\0') - (void) fprintf(fp, "Password unchanged\n"); - else - authusekey(info_auth_keyid, info_auth_keytype, pass); -} - - -/* - * hostnames - set the showhostnames flag - */ -static void -hostnames(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (pcmd->nargs == 0) { - if (showhostnames) - (void) fprintf(fp, "hostnames being shown\n"); - else - (void) fprintf(fp, "hostnames not being shown\n"); - } else { - if (STREQ(pcmd->argval[0].string, "yes")) - showhostnames = 1; - else if (STREQ(pcmd->argval[0].string, "no")) - showhostnames = 0; - else - (void)fprintf(stderr, "What?\n"); - } -} - - - -/* - * setdebug - set/change debugging level - */ -static void -setdebug(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (pcmd->nargs == 0) { - (void) fprintf(fp, "debug level is %d\n", debug); - return; - } else if (STREQ(pcmd->argval[0].string, "no")) { - debug = 0; - } else if (STREQ(pcmd->argval[0].string, "more")) { - debug++; - } else if (STREQ(pcmd->argval[0].string, "less")) { - debug--; - } else { - (void) fprintf(fp, "What?\n"); - return; - } - (void) fprintf(fp, "debug level set to %d\n", debug); -} - - -/* - * quit - stop this nonsense - */ -/*ARGSUSED*/ -static void -quit(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (havehost) - (void) close(sockfd); /* cleanliness next to godliness */ - exit(0); -} - - -/* - * version - print the current version number - */ -/*ARGSUSED*/ -static void -version(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - extern char *Version; - - (void) fprintf(fp, "%s\n", Version); -} - - -/* - * raw - set raw mode output - */ -/*ARGSUSED*/ -static void -raw(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - rawmode = 1; - (void) fprintf(fp, "Output set to raw\n"); -} - - -/* - * cooked - set cooked mode output - */ -/*ARGSUSED*/ -static void -cooked(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - rawmode = 0; - (void) fprintf(fp, "Output set to cooked\n"); - return; -} - - -/* - * authenticate - always authenticate requests to this host - */ -static void -authenticate(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (pcmd->nargs == 0) { - if (always_auth) { - (void) fprintf(fp, - "authenticated requests being sent\n"); - } else - (void) fprintf(fp, - "unauthenticated requests being sent\n"); - } else { - if (STREQ(pcmd->argval[0].string, "yes")) { - always_auth = 1; - } else if (STREQ(pcmd->argval[0].string, "no")) { - always_auth = 0; - } else - (void)fprintf(stderr, "What?\n"); - } -} - - -/* - * ntpversion - choose the NTP version to use - */ -static void -ntpversion(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (pcmd->nargs == 0) { - (void) fprintf(fp, - "NTP version being claimed is %d\n", pktversion); - } else { - if (pcmd->argval[0].uval <= NTP_OLDVERSION - || pcmd->argval[0].uval > NTP_VERSION) { - (void) fprintf(stderr, "versions %d to %d, please\n", - NTP_OLDVERSION+1, NTP_VERSION); - } else { - pktversion = pcmd->argval[0].uval; - } - } -} - - -/* - * warning - print a warning message - */ -static void -warning(fmt, st1, st2) - char *fmt; - char *st1; - char *st2; -{ - (void) fprintf(stderr, "%s: ", progname); - (void) fprintf(stderr, fmt, st1, st2); - (void) fprintf(stderr, ": "); - perror(""); -} - - -/* - * error - print a message and exit - */ -static void -error(fmt, st1, st2) - char *fmt; - char *st1; - char *st2; -{ - warning(fmt, st1, st2); - exit(1); -} - -/* - * getkeyid - prompt the user for a keyid to use - */ -static u_long -getkeyid(prompt) -char *prompt; -{ - register char *p; - register c; - FILE *fi; - char pbuf[20]; - - if ((fi = fdopen(open("/dev/tty", 2), "r")) == NULL) - fi = stdin; - else - setbuf(fi, (char *)NULL); - fprintf(stderr, "%s", prompt); fflush(stderr); - for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) { - if (p < &pbuf[18]) - *p++ = c; - } - *p = '\0'; - if (fi != stdin) - fclose(fi); - if (strcmp(pbuf, "0") == 0) - return 0; - - return (u_long) atoi(pbuf); -} - - -/* - * atoascii - printable-ize possibly ascii data using the character - * transformations cat -v uses. - */ -static void -atoascii(length, data, outdata) - int length; - char *data; - char *outdata; -{ - register u_char *cp; - register u_char *ocp; - register u_char c; - - if (!data) - { - *outdata = '\0'; - return; - } - - ocp = (u_char *)outdata; - for (cp = (u_char *)data; cp < (u_char *)data + length; cp++) { - c = *cp; - if (c == '\0') - break; - if (c == '\0') - break; - if (c > 0177) { - *ocp++ = 'M'; - *ocp++ = '-'; - c &= 0177; - } - - if (c < ' ') { - *ocp++ = '^'; - *ocp++ = c + '@'; - } else if (c == 0177) { - *ocp++ = '^'; - *ocp++ = '?'; - } else { - *ocp++ = c; - } - if (ocp >= ((u_char *)outdata + length - 4)) - break; - } - *ocp++ = '\0'; -} - - - -/* - * makeascii - print possibly ascii data using the character - * transformations that cat -v uses. - */ -static void -makeascii(length, data, fp) - int length; - char *data; - FILE *fp; -{ - register u_char *cp; - register int c; - - for (cp = (u_char *)data; cp < (u_char *)data + length; cp++) { - c = (int)*cp; - if (c > 0177) { - putc('M', fp); - putc('-', fp); - c &= 0177; - } - - if (c < ' ') { - putc('^', fp); - putc(c+'@', fp); - } else if (c == 0177) { - putc('^', fp); - putc('?', fp); - } else { - putc(c, fp); - } - } -} - - -/* - * asciize - same thing as makeascii except add a newline - */ -void -asciize(length, data, fp) - int length; - char *data; - FILE *fp; -{ - makeascii(length, data, fp); - putc('\n', fp); -} - - -/* - * Some circular buffer space - */ -#define CBLEN 80 -#define NUMCB 6 - -char circ_buf[NUMCB][CBLEN]; -int nextcb = 0; - - -/* - * getevents - return a descriptive string for the event count - */ -static char * -getevents(cnt) - int cnt; -{ - static char buf[20]; - - if (cnt == 0) - return "no events"; - (void) sprintf(buf, "%d event%s", cnt, (cnt==1) ? "" : "s"); - return buf; -} - - -/* - * statustoa - return a descriptive string for a peer status - */ -static char * -statustoa(type, st) - int type; - int st; -{ - char *cb; - u_char pst; - - cb = &circ_buf[nextcb][0]; - if (++nextcb >= NUMCB) - nextcb = 0; - - switch (type) { - case TYPE_SYS: - (void)strcpy(cb, getcode(CTL_SYS_LI(st), leap_codes)); - (void)strcat(cb, ", "); - (void)strcat(cb, getcode(CTL_SYS_SOURCE(st) & ~CTL_SST_TS_PPS, sync_codes)); - if (CTL_SYS_SOURCE(st) & CTL_SST_TS_PPS) - (void)strcat(cb, "/PPS"); - (void)strcat(cb, ", "); - (void)strcat(cb, getevents(CTL_SYS_NEVNT(st))); - (void)strcat(cb, ", "); - (void)strcat(cb, getcode(CTL_SYS_EVENT(st), sys_codes)); - break; - - case TYPE_PEER: - /* - * Handcraft the bits - */ - pst = CTL_PEER_STATVAL(st); - if (!(pst & CTL_PST_REACH)) { - (void)strcpy(cb, "unreach"); - } else { - (void)strcpy(cb, "reach"); -#if 0 - if (!(pst & CTL_PST_DISP)) { - (void)strcat(cb, ", hi_disp"); - } else { - if (pst & CTL_PST_SANE) { - if ((pst & 0x3) == CTL_PST_SEL_REJECT) - (void)strcat(cb, ", sane"); - } else { - (void)strcat(cb, ", insane"); - } - } -#endif - } - if (pst & CTL_PST_CONFIG) - (void)strcat(cb, ", conf"); - if (pst & CTL_PST_AUTHENABLE) { - if (!(pst & CTL_PST_REACH) || (pst & CTL_PST_AUTHENTIC)) - (void)strcat(cb, ", auth"); - else - (void)strcat(cb, ", unauth"); - } - - /* - * Now the codes - */ - if ((pst & 0x7) != CTL_PST_SEL_REJECT) { - (void)strcat(cb, ", "); - (void)strcat(cb, getcode(pst & 0x7, select_codes)); - } - (void)strcat(cb, ", "); - (void)strcat(cb, getevents(CTL_PEER_NEVNT(st))); - if (CTL_PEER_EVENT(st) != EVNT_UNSPEC) { - (void)strcat(cb, ", "); - (void)strcat(cb, getcode(CTL_PEER_EVENT(st), - peer_codes)); - } - break; - - case TYPE_CLOCK: - (void)strcpy(cb, getcode(((st)>>8) & 0xff, clock_codes)); - (void)strcat(cb, ", last_"); - (void)strcat(cb, getcode((st) & 0xff, clock_codes)); - break; - } - return cb; -} - - -/* - * nextvar - find the next variable in the buffer - */ -int -nextvar(datalen, datap, vname, vvalue) - int *datalen; - char **datap; - char **vname; - char **vvalue; -{ - register char *cp; - register char *np; - register char *cpend; - int quoted = 0; - static char name[MAXVARLEN]; - static char value[MAXVALLEN]; - - cp = *datap; - cpend = cp + *datalen; - - /* - * Space past commas and white space - */ - while (cp < cpend && (*cp == ',' || isspace(*cp))) - cp++; - if (cp == cpend) - return 0; - - /* - * Copy name until we hit a ',', an '=', a '\r' or a '\n'. Backspace - * over any white space and terminate it. - */ - np = name; - while (cp < cpend && *cp != ',' && *cp != '=' - && *cp != '\r' && *cp != '\n') - *np++ = *cp++; - while (isspace(*(np-1))) - np--; - *np = '\0'; - *vname = name; - - /* - * Check if we hit the end of the buffer or a ','. If so we are done. - */ - if (cp == cpend || *cp == ',' || *cp == '\r' || *cp == '\n') { - if (cp != cpend) - cp++; - *datap = cp; - *datalen = cpend - cp; - *vvalue = (char *)0; - return 1; - } - - /* - * So far, so good. Copy out the value - */ - cp++; /* past '=' */ - while (cp < cpend && (isspace(*cp) && *cp != '\r' && *cp != '\n')) - cp++; - np = value; - while (cp < cpend && ((*cp != ',') || quoted)) - { - quoted ^= ((*np++ = *cp++) == '"'); - } - - while (np > value && isspace(*(np-1))) - np--; - *np = '\0'; - - /* - * Return this. All done. - */ - if (cp != cpend) - cp++; - *datap = cp; - *datalen = cpend - cp; - *vvalue = value; - return 1; -} - - -/* - * findvar - see if this variable is known to us - */ -int -findvar(varname, varlist) - char *varname; - struct ctl_var *varlist; -{ - register char *np; - register struct ctl_var *vl; - - vl = varlist; - np = varname; - while (vl->fmt != EOV) { - if (vl->fmt != PADDING && STREQ(np, vl->text)) - return vl->code; - vl++; - } - return 0; -} - - - -/* - * printvars - print variables returned in response packet - */ -void -printvars(length, data, status, sttype, fp) - int length; - char *data; - int status; - int sttype; - FILE *fp; -{ - if (rawmode) - rawprint(sttype, length, data, status, fp); - else - cookedprint(sttype, length, data, status, fp); -} - - -/* - * rawprint - do a printout of the data in raw mode - */ -static void -rawprint(datatype, length, data, status, fp) - int datatype; - int length; - char *data; - int status; - FILE *fp; -{ - register char *cp; - register char *cpend; - - /* - * Essentially print the data as is. We reformat unprintables, though. - */ - cp = data; - cpend = data + length; - - (void) fprintf(fp, "status=%04x %s\n", status, - statustoa(datatype, status)); - - while (cp < cpend) { - if (*cp == '\r') { - /* - * If this is a \r and the next character is a - * \n, supress this, else pretty print it. Otherwise - * just output the character. - */ - if (cp == (cpend-1) || *(cp+1) != '\n') - makeascii(1, cp, fp); - } else if (isspace(*cp) || isprint(*cp)) { - putc(*cp, fp); - } else { - makeascii(1, cp, fp); - } - cp++; - } -} - - -/* - * Global data used by the cooked output routines - */ -int out_chars; /* number of characters output */ -int out_linecount; /* number of characters output on this line */ - - -/* - * startoutput - get ready to do cooked output - */ -static void -startoutput() -{ - out_chars = 0; - out_linecount = 0; -} - - -/* - * output - output a variable=value combination - */ -static void -output(fp, name, value) - FILE *fp; - char *name; - char *value; -{ - int lenname; - int lenvalue; - - lenname = strlen(name); - lenvalue = strlen(value); - - if (out_chars != 0) { - putc(',', fp); - out_chars++; - out_linecount++; - if ((out_linecount + lenname + lenvalue + 3) > MAXOUTLINE) { - putc('\n', fp); - out_chars++; - out_linecount = 0; - } else { - putc(' ', fp); - out_chars++; - out_linecount++; - } - } - - fputs(name, fp); - putc('=', fp); - fputs(value, fp); - out_chars += lenname + 1 + lenvalue; - out_linecount += lenname + 1 + lenvalue; -} - - -/* - * endoutput - terminate a block of cooked output - */ -static void -endoutput(fp) - FILE *fp; -{ - if (out_chars != 0) - putc('\n', fp); -} - - -/* - * outputarr - output an array of values - */ -static void -outputarr(fp, name, narr, lfp) - FILE *fp; - char *name; - int narr; - l_fp *lfp; -{ - register char *bp; - register char *cp; - register int i; - register int len; - char buf[256]; - - bp = buf; - /* - * Hack to align delay and offset values - */ - if ((int)strlen(name) < 10) - *bp++ = ' '; - - for (i = narr; i > 0; i--) { - if (i != narr) - *bp++ = ' '; - cp = lfptoms(lfp, 2); - len = strlen(cp); - while (len < 7) { - *bp++ = ' '; - len++; - } - while (*cp != '\0') - *bp++ = *cp++; - lfp++; - } - *bp = '\0'; - output(fp, name, buf); -} - -static char * -tstflags(val) - u_long val; -{ - register char *cb, *s; - register int i; - register char *sep; - - sep = ""; - i = 0; - s = cb = &circ_buf[nextcb][0]; - if (++nextcb >= NUMCB) - nextcb = 0; - - sprintf(cb, "0x%lx", val); - cb += strlen(cb); - if (val <= ((1<<8)-1)) { - if (!val) { - strcat(cb, "<OK>"); - cb += strlen(cb); - } else { - *cb++ = '<'; - while (val) { - if (val & 0x1) { - sprintf(cb, "%s%s", sep, tstflagnames[i]); - sep = ";"; - cb += strlen(cb); - } - i++; - val >>= 1; - } - *cb++ = '>'; - } - } else { - *cb++ = '?'; - } - *cb = '\0'; - return s; -} - -/* - * cookedprint - output variables in cooked mode - */ -static void -cookedprint(datatype, length, data, status, fp) - int datatype; - int length; - char *data; - int status; - FILE *fp; -{ - register int varid; - char *name; - char *value; - int output_raw; - int fmt; - struct ctl_var *varlist; - l_fp lfp; - long ival; - u_long hval; - u_long uval; - l_fp lfparr[8]; - int narr; - - switch (datatype) { - case TYPE_PEER: - varlist = peer_var; - break; - case TYPE_SYS: - varlist = sys_var; - break; - case TYPE_CLOCK: - varlist = clock_var; - break; - default: - (void) fprintf(stderr, "Unknown datatype(0x%x) in cookedprint\n", datatype); - return; - break; - } - - (void) fprintf(fp, "status=%04x %s\n", status, - statustoa(datatype, status)); - - startoutput(); - while (nextvar(&length, &data, &name, &value)) { - varid = findvar(name, varlist); - if (varid == 0) { - output_raw = '*'; - } else { - output_raw = 0; - switch((fmt = varlist[varid].fmt)) { - case TS: - if (!decodets(value, &lfp)) - output_raw = '?'; - else - output(fp, name, prettydate(&lfp)); - break; - case FL: - case FU: - case FS: - if (!decodetime(value, &lfp)) - output_raw = '?'; - else { - switch (fmt) { - case FL: - output(fp, name, - lfptoms(&lfp, 3)); - break; - case FU: - output(fp, name, - ulfptoms(&lfp, 2)); - break; - case FS: - output(fp, name, - lfptoms(&lfp, 2)); - break; - } - } - break; - - case UI: - if (!decodeuint(value, &uval)) - output_raw = '?'; - else - output(fp, name, uinttoa(uval)); - break; - - case IN: - if (!decodeint(value, &ival)) - output_raw = '?'; - else - output(fp, name, inttoa(ival)); - break; - - case HA: - case NA: - if (!decodenetnum(value, &hval)) - output_raw = '?'; - else if (fmt == HA) - output(fp, name, nntohost(hval)); - else - output(fp, name, numtoa(hval)); - break; - - case ST: - output_raw = '*'; - break; - - case RF: - if (decodenetnum(value, &hval)) - output(fp, name, nntohost(hval)); - else if ((int)strlen(value) <= 4) - output(fp, name, value); - else - output_raw = '?'; - break; - - case LP: - if (!decodeuint(value, &uval) || uval > 3) - output_raw = '?'; - else { - char b[3]; - b[0] = b[1] = '0'; - if (uval & 0x2) - b[0] = '1'; - if (uval & 0x1) - b[1] = '1'; - b[2] = '\0'; - output(fp, name, b); - } - break; - - case OC: - if (!decodeuint(value, &uval)) - output_raw = '?'; - else { - char b[10]; - - (void) sprintf(b, "%03lo", uval); - output(fp, name, b); - } - break; - - case MD: - if (!decodeuint(value, &uval)) - output_raw = '?'; - else - output(fp, name, uinttoa(uval)); - break; - - case AR: - if (!decodearr(value, &narr, lfparr)) - output_raw = '?'; - else - outputarr(fp, name, narr, lfparr); - break; - - case TST: - if (!decodeuint(value, &uval)) - output_raw = '?'; - else - output(fp, name, tstflags(uval)); - break; - - default: - (void) fprintf(stderr, - "Internal error in cookedprint, %s=%s, fmt %d\n", - name, value, fmt); - break; - } - - } - if (output_raw != 0) { - char bn[401]; - char bv[401]; - int len; - - atoascii(400, name, bn); - atoascii(400, value, bv); - if (output_raw != '*') { - len = strlen(bv); - bv[len] = output_raw; - bv[len+1] = '\0'; - } - output(fp, bn, bv); - } - } - endoutput(fp); -} - - -/* - * sortassoc - sort associations in the cache into ascending order - */ -void -sortassoc() -{ - if (numassoc > 1) -#if defined(sgi) || defined(SYS_BSDI) || defined(__STDC__) - qsort((void *)assoc_cache, numassoc, - sizeof(struct association), assoccmp); -#else - qsort((char *)assoc_cache, numassoc, - sizeof(struct association), assoccmp); -#endif /* sgi || bsdi */ -} - - -/* - * assoccmp - compare two associations - */ -static int -#if defined(sgi) || defined(SYS_BSDI) || defined(__STDC__) -assoccmp(t1, t2) - const void *t1; - const void *t2; -{ - const struct association *ass1 = (const struct association *)t1; - const struct association *ass2 = (const struct association *)t2; -#else -assoccmp(ass1, ass2) - struct association *ass1; - struct association *ass2; -{ -#endif /* sgi || bsdi */ - if (ass1->assid < ass2->assid) - return -1; - if (ass1->assid > ass2->assid) - return 1; - return 0; -} diff --git a/usr.sbin/xntpd/ntpq/ntpq.h b/usr.sbin/xntpd/ntpq/ntpq.h deleted file mode 100644 index c233b240ec5f..000000000000 --- a/usr.sbin/xntpd/ntpq/ntpq.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * ntpq.h - definitions of interest to ntpq - */ -#include "ntp_fp.h" -#include "ntp.h" -#include "ntp_control.h" -#include "ntp_string.h" -#include "ntp_malloc.h" - -/* - * Maximum number of arguments - */ -#define MAXARGS 4 - -/* - * Flags for forming descriptors. - */ -#define OPT 0x80 /* this argument is optional, or'd with type */ - -#define NO 0x0 -#define STR 0x1 /* string argument */ -#define UINT 0x2 /* unsigned integer */ -#define INT 0x3 /* signed integer */ -#define ADD 0x4 /* IP network address */ - -/* - * Arguments are returned in a union - */ -typedef union { - char *string; - long ival; - u_long uval; - u_long netnum; -} arg_v; - -/* - * Structure for passing parsed command line - */ -struct parse { - char *keyword; - arg_v argval[MAXARGS]; - int nargs; -}; - -/* - * xntpdc includes a command parser which could charitably be called - * crude. The following structure is used to define the command - * syntax. - */ -struct xcmd { - char *keyword; /* command key word */ - void (*handler) P((struct parse *, FILE *)); /* command handler */ - u_char arg[MAXARGS]; /* descriptors for arguments */ - char *desc[MAXARGS]; /* descriptions for arguments */ - char *comment; -}; - -/* - * Types of things we may deal with - */ -#define TYPE_SYS 1 -#define TYPE_PEER 2 -#define TYPE_CLOCK 3 - - -/* - * Structure to hold association data - */ -struct association { - u_short assid; - u_short status; -}; - -#define MAXASSOC 1024 - -/* - * Structure for translation tables between text format - * variable indices and text format. - */ -struct ctl_var { - u_short code; - u_short fmt; - char *text; -}; - -extern void asciize P((int, char *, FILE *)); -extern int getnetnum P((char *, u_long *, char *)); -extern void sortassoc P((void)); -extern int doquery P((int, int, int, int, char *, u_short *, int *, char **)); -extern char * nntohost P((u_long)); -extern int decodets P((char *, l_fp *)); -extern int decodeuint P((char *, u_long *)); -extern int nextvar P((int *, char **, char **, char **)); -extern int decodetime P((char *, l_fp *)); -extern void printvars P((int, char *, int, int, FILE *)); -extern int decodeint P((char *, long *)); -extern int findvar P((char *, struct ctl_var *)); diff --git a/usr.sbin/xntpd/ntpq/ntpq_ops.c b/usr.sbin/xntpd/ntpq/ntpq_ops.c deleted file mode 100644 index 8e59a7172c38..000000000000 --- a/usr.sbin/xntpd/ntpq/ntpq_ops.c +++ /dev/null @@ -1,1610 +0,0 @@ -/* - * ntpdc_ops.c - subroutines which are called to perform operations by xntpdc - */ -#include <stdio.h> -#include <ctype.h> -#include <sys/types.h> -#include <sys/time.h> -#include <netdb.h> - -#include "ntpq.h" -#include "ntp_stdlib.h" - -extern char * chosts[]; -extern char currenthost[]; -extern int numhosts; -int maxhostlen; - -/* - * Declarations for command handlers in here - */ -static int checkassocid P((u_long)); -static char * strsave P((char *)); -static struct varlist *findlistvar P((struct varlist *, char *)); -static void doaddvlist P((struct varlist *, char *)); -static void dormvlist P((struct varlist *, char *)); -static void doclearvlist P((struct varlist *)); -static void makequerydata P((struct varlist *, int *, char *)); -static int doquerylist P((struct varlist *, int, int, int, u_short *, int *, char **)); -static void doprintvlist P((struct varlist *, FILE *)); -static void addvars P((struct parse *, FILE *)); -static void rmvars P((struct parse *, FILE *)); -static void clearvars P((struct parse *, FILE *)); -static void showvars P((struct parse *, FILE *)); -static int dolist P((struct varlist *, int, int, int, FILE *)); -static void readlist P((struct parse *, FILE *)); -static void writelist P((struct parse *, FILE *)); -static void readvar P((struct parse *, FILE *)); -static void writevar P((struct parse *, FILE *)); -static void clocklist P((struct parse *, FILE *)); -static void clockvar P((struct parse *, FILE *)); -static int findassidrange P((u_long, u_long, int *, int *)); -static void mreadlist P((struct parse *, FILE *)); -static void mreadvar P((struct parse *, FILE *)); -static int dogetassoc P((FILE *)); -static void printassoc P((int, FILE *)); -static void associations P((struct parse *, FILE *)); -static void lassociations P((struct parse *, FILE *)); -static void passociations P((struct parse *, FILE *)); -static void lpassociations P((struct parse *, FILE *)); - -#ifdef UNUSED -static void radiostatus P((struct parse *, FILE *)); -#endif /* UNUSED */ - -static void pstatus P((struct parse *, FILE *)); -static char * fixup P((int, char *)); -static char * when P((l_fp *, l_fp *, l_fp *)); -static int doprintpeers P((struct varlist *, int, int, int, char *, FILE *)); -static int dogetpeers P((struct varlist *, int, FILE *)); -static void dopeers P((int, FILE *)); -static void peers P((struct parse *, FILE *)); -static void lpeers P((struct parse *, FILE *)); -static void doopeers P((int, FILE *)); -static void opeers P((struct parse *, FILE *)); -static void lopeers P((struct parse *, FILE *)); - - -/* - * Commands we understand. Ntpdc imports this. - */ -struct xcmd opcmds[] = { - { "associations", associations, { NO, NO, NO, NO }, - { "", "", "", "" }, - "print list of association ID's and statuses for the server's peers" }, - { "passociations", passociations, { NO, NO, NO, NO }, - { "", "", "", "" }, - "print list of associations returned by last associations command" }, - { "lassociations", lassociations, { NO, NO, NO, NO }, - { "", "", "", "" }, - "print list of associations including all client information" }, - { "lpassociations", lpassociations, { NO, NO, NO, NO }, - { "", "", "", "" }, -"print last obtained list of associations, including client information" }, - { "addvars", addvars, { STR, NO, NO, NO }, - { "name[=value][,...]", "", "", "" }, - "add variables to the variable list or change their values" }, - { "rmvars", rmvars, { STR, NO, NO, NO }, - { "name[,...]", "", "", "" }, - "remove variables from the variable list" }, - { "clearvars", clearvars, { NO, NO, NO, NO }, - { "", "", "", "" }, - "remove all variables from the variable list" }, - { "showvars", showvars, { NO, NO, NO, NO }, - { "", "", "", "" }, - "print variables on the variable list" }, - { "readlist", readlist, { OPT|UINT, NO, NO, NO }, - { "assocID", "", "", "" }, - "read the system or peer variables included in the variable list" }, - { "rl", readlist, { OPT|UINT, NO, NO, NO }, - { "assocID", "", "", "" }, - "read the system or peer variables included in the variable list" }, - { "writelist", writelist, { OPT|UINT, NO, NO, NO }, - { "assocID", "", "", "" }, - "write the system or peer variables included in the variable list" }, - { "readvar", readvar, { OPT|UINT, OPT|STR, NO, NO }, - { "assocID", "name=value[,...]", "", "" }, - "read system or peer variables" }, - { "rv", readvar, { OPT|UINT, OPT|STR, NO, NO }, - { "assocID", "name=value[,...]", "", "" }, - "read system or peer variables" }, - { "writevar", writevar, { UINT, STR, NO, NO }, - { "assocID", "name=value,[...]", "", "" }, - "write system or peer variables" }, - { "mreadlist", mreadlist, { UINT, UINT, NO, NO }, - { "assocID", "assocID", "", "" }, - "read the peer variables in the variable list for multiple peers" }, - { "mrl", mreadlist, { UINT, UINT, NO, NO }, - { "assocID", "assocID", "", "" }, - "read the peer variables in the variable list for multiple peers" }, - { "mreadvar", mreadvar, { UINT, UINT, OPT|STR, NO }, - { "assocID", "assocID", "name=value[,...]", "" }, - "read peer variables from multiple peers" }, - { "mrv", mreadvar, { UINT, UINT, OPT|STR, NO }, - { "assocID", "assocID", "name=value[,...]", "" }, - "read peer variables from multiple peers" }, - { "clocklist", clocklist, { OPT|UINT, NO, NO, NO }, - { "assocID", "", "", "" }, - "read the clock variables included in the variable list" }, - { "cl", clocklist, { OPT|UINT, NO, NO, NO }, - { "assocID", "", "", "" }, - "read the clock variables included in the variable list" }, - { "clockvar", clockvar, { OPT|UINT, OPT|STR, NO, NO }, - { "assocID", "name=value[,...]", "", "" }, - "read clock variables" }, - { "cv", clockvar, { OPT|UINT, OPT|STR, NO, NO }, - { "assocID", "name=value[,...]", "", "" }, - "read clock variables" }, - { "pstatus", pstatus, { UINT, NO, NO, NO }, - { "assocID", "", "", "" }, - "print status information returned for a peer" }, - { "peers", peers, { NO, NO, NO, NO }, - { "", "", "", "" }, - "obtain and print a list of the server's peers" }, - { "lpeers", lpeers, { NO, NO, NO, NO }, - { "", "", "", "" }, - "obtain and print a list of all peers and clients" }, - { "opeers", opeers, { NO, NO, NO, NO }, - { "", "", "", "" }, - "print peer list the old way, with dstadr shown rather than refid" }, - { "lopeers", lopeers, { NO, NO, NO, NO }, - { "", "", "", "" }, - "obtain and print a list of all peers and clients showing dstadr" }, - { 0, 0, { NO, NO, NO, NO }, - { "", "", "", "" }, "" } -}; - - -/* - * Variable list data space - */ -#define MAXLIST 64 /* maximum number of variables in list */ -#define LENHOSTNAME 256 /* host name is 256 characters long */ -/* - * Old CTL_PST defines for version 2. - */ -#define OLD_CTL_PST_CONFIG 0x80 -#define OLD_CTL_PST_AUTHENABLE 0x40 -#define OLD_CTL_PST_AUTHENTIC 0x20 -#define OLD_CTL_PST_REACH 0x10 -#define OLD_CTL_PST_SANE 0x08 -#define OLD_CTL_PST_DISP 0x04 -#define OLD_CTL_PST_SEL_REJECT 0 -#define OLD_CTL_PST_SEL_SELCAND 1 -#define OLD_CTL_PST_SEL_SYNCCAND 2 -#define OLD_CTL_PST_SEL_SYSPEER 3 - - -char flash2[] = " .+* "; /* flash decode for version 2 */ -char flash3[] = " x.-+#*o"; /* flash decode for peer status version 3 */ - -struct varlist { - char *name; - char *value; -} varlist[MAXLIST] = { { 0, 0 } }; - -/* - * Imported from ntpq.c - */ -extern int showhostnames; -extern int rawmode; -extern int debug; -extern struct servent *server_entry; -extern struct association assoc_cache[]; -extern int numassoc; -extern u_char pktversion; - -/* - * For quick string comparisons - */ -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - - -/* - * checkassocid - return the association ID, checking to see if it is valid - */ -static int -checkassocid(value) - u_long value; -{ - if (value == 0 || value >= 65536) { - (void) fprintf(stderr, "***Invalid association ID specified\n"); - return 0; - } - return (int)value; -} - - -/* - * strsave - save a string - * XXX - should be in libntp.a - */ -static char * -strsave(str) - char *str; -{ - char *cp; - u_int len; - - len = strlen(str) + 1; - if ((cp = (char *)malloc(len)) == NULL) { - (void) fprintf(stderr, "Malloc failed!!\n"); - exit(1); - } - - memmove(cp, str, len); - return (cp); -} - - -/* - * findlistvar - look for the named variable in a list and return if found - */ -static struct varlist * -findlistvar(list, name) - struct varlist *list; - char *name; -{ - register struct varlist *vl; - - for (vl = list; vl < list + MAXLIST && vl->name != 0; vl++) - if (STREQ(name, vl->name)) - return vl; - if (vl < list + MAXLIST) - return vl; - return (struct varlist *)0; -} - - -/* - * doaddvlist - add variable(s) to the variable list - */ -static void -doaddvlist(vlist, vars) - struct varlist *vlist; - char *vars; -{ - register struct varlist *vl; - int len; - char *name; - char *value; - - len = strlen(vars); - while (nextvar(&len, &vars, &name, &value)) { - vl = findlistvar(vlist, name); - if (vl == 0) { - (void) fprintf(stderr, "Variable list full\n"); - return; - } - - if (vl->name == 0) { - vl->name = strsave(name); - } else if (vl->value != 0) { - (void) free(vl->value); - vl->value = 0; - } - - if (value != 0) - vl->value = strsave(value); - } -} - - -/* - * dormvlist - remove variable(s) from the variable list - */ -static void -dormvlist(vlist, vars) - struct varlist *vlist; - char *vars; -{ - register struct varlist *vl; - int len; - char *name; - char *value; - - len = strlen(vars); - while (nextvar(&len, &vars, &name, &value)) { - vl = findlistvar(vlist, name); - if (vl == 0 || vl->name == 0) { - (void) fprintf(stderr, "Variable `%s' not found\n", - name); - } else { - (void) free(vl->name); - if (vl->value != 0) - (void) free(vl->value); - for ( ; (vl+1) < (varlist+MAXLIST) - && (vl+1)->name != 0; vl++) { - vl->name = (vl+1)->name; - vl->value = (vl+1)->value; - } - vl->name = vl->value = 0; - } - } -} - - -/* - * doclearvlist - clear a variable list - */ -static void -doclearvlist(vlist) - struct varlist *vlist; -{ - register struct varlist *vl; - - for (vl = vlist; vl < vlist + MAXLIST && vl->name != 0; vl++) { - (void) free(vl->name); - vl->name = 0; - if (vl->value != 0) { - (void) free(vl->value); - vl->value = 0; - } - } -} - - -/* - * makequerydata - form a data buffer to be included with a query - */ -static void -makequerydata(vlist, datalen, data) - struct varlist *vlist; - int *datalen; - char *data; -{ - register struct varlist *vl; - register char *cp, *cpend; - register int namelen, valuelen; - register int totallen; - - cp = data; - cpend = data + *datalen; - - for (vl = vlist; vl < vlist + MAXLIST && vl->name != 0; vl++) { - namelen = strlen(vl->name); - if (vl->value == 0) - valuelen = 0; - else - valuelen = strlen(vl->value); - totallen = namelen + valuelen + (valuelen != 0) + (cp != data); - if (cp + totallen > cpend) - break; - - if (cp != data) - *cp++ = ','; - memmove(cp, vl->name, namelen); - cp += namelen; - if (valuelen != 0) { - *cp++ = '='; - memmove(cp, vl->value, valuelen); - cp += valuelen; - } - } - *datalen = cp - data; -} - - -/* - * doquerylist - send a message including variables in a list - */ -static int -doquerylist(vlist, op, associd, auth, rstatus, dsize, datap) - struct varlist *vlist; - int op; - int associd; - int auth; - u_short *rstatus; - int *dsize; - char **datap; -{ - char data[CTL_MAX_DATA_LEN]; - int datalen; - - datalen = sizeof(data); - makequerydata(vlist, &datalen, data); - - return doquery(op, associd, auth, datalen, data, rstatus, - dsize, datap); -} - - -/* - * doprintvlist - print the variables on a list - */ -static void -doprintvlist(vlist, fp) - struct varlist *vlist; - FILE *fp; -{ - register struct varlist *vl; - - if (vlist->name == 0) { - (void) fprintf(fp, "No variables on list\n"); - } else { - for (vl = vlist; vl < vlist + MAXLIST && vl->name != 0; vl++) { - if (vl->value == 0) { - (void) fprintf(fp, "%s\n", vl->name); - } else { - (void) fprintf(fp, "%s=%s\n", - vl->name, vl->value); - } - } - } -} - - -/* - * addvars - add variables to the variable list - */ -/*ARGSUSED*/ -static void -addvars(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - doaddvlist(varlist, pcmd->argval[0].string); -} - - -/* - * rmvars - remove variables from the variable list - */ -/*ARGSUSED*/ -static void -rmvars(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - dormvlist(varlist, pcmd->argval[0].string); -} - - -/* - * clearvars - clear the variable list - */ -/*ARGSUSED*/ -static void -clearvars(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - doclearvlist(varlist); -} - - -/* - * showvars - show variables on the variable list - */ -/*ARGSUSED*/ -static void -showvars(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - doprintvlist(varlist, fp); -} - - -/* - * dolist - send a request with the given list of variables - */ -static int -dolist(vlist, associd, op, type, fp) - struct varlist *vlist; - int associd; - int op; - int type; - FILE *fp; -{ - char *datap; - int res; - int dsize; - u_short rstatus; - - res = doquerylist(vlist, op, associd, 0, &rstatus, &dsize, &datap); - - if (res != 0) - return 0; - - if (dsize == 0) { - if (associd == 0) - (void) fprintf(fp, "No system%s variables returned\n", - (type == TYPE_CLOCK) ? " clock" : ""); - else - (void) fprintf(fp, - "No information returned for%s association %u\n", - (type == TYPE_CLOCK) ? " clock" : "", associd); - return 1; - } - - printvars(dsize, datap, (int)rstatus, type, fp); - return 1; -} - - -/* - * readlist - send a read variables request with the variables on the list - */ -static void -readlist(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - int associd; - - if (pcmd->nargs == 0) { - associd = 0; - } else { - if (pcmd->argval[0].uval == 0) - associd = 0; - else if ((associd = checkassocid(pcmd->argval[0].uval)) == 0) - return; - } - - (void) dolist(varlist, associd, CTL_OP_READVAR, - (associd == 0) ? TYPE_SYS : TYPE_PEER, fp); -} - - -/* - * writelist - send a write variables request with the variables on the list - */ -static void -writelist(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - char *datap; - int res; - int associd; - int dsize; - u_short rstatus; - - if (pcmd->nargs == 0) { - associd = 0; - } else { - if (pcmd->argval[0].uval == 0) - associd = 0; - else if ((associd = checkassocid(pcmd->argval[0].uval)) == 0) - return; - } - - res = doquerylist(varlist, CTL_OP_WRITEVAR, associd, 0, &rstatus, - &dsize, &datap); - - if (res != 0) - return; - - if (dsize == 0) - (void) fprintf(fp, "done! (no data returned)\n"); - else - printvars(dsize, datap, (int)rstatus, - (associd != 0) ? TYPE_PEER : TYPE_SYS, fp); - return; -} - - -/* - * readvar - send a read variables request with the specified variables - */ -static void -readvar(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - int associd; - struct varlist tmplist[MAXLIST]; - - if (pcmd->nargs == 0 || pcmd->argval[0].uval == 0) - associd = 0; - else if ((associd = checkassocid(pcmd->argval[0].uval)) == 0) - return; - - memset((char *)tmplist, 0, sizeof(tmplist)); - if (pcmd->nargs >= 2) - doaddvlist(tmplist, pcmd->argval[1].string); - - (void) dolist(tmplist, associd, CTL_OP_READVAR, - (associd == 0) ? TYPE_SYS : TYPE_PEER, fp); - - doclearvlist(tmplist); -} - - -/* - * writevar - send a write variables request with the specified variables - */ -static void -writevar(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - char *datap; - int res; - int associd; - int dsize; - u_short rstatus; - struct varlist tmplist[MAXLIST]; - - if (pcmd->argval[0].uval == 0) - associd = 0; - else if ((associd = checkassocid(pcmd->argval[0].uval)) == 0) - return; - - memset((char *)tmplist, 0, sizeof(tmplist)); - doaddvlist(tmplist, pcmd->argval[1].string); - - res = doquerylist(tmplist, CTL_OP_WRITEVAR, associd, 0, &rstatus, - &dsize, &datap); - - doclearvlist(tmplist); - - if (res != 0) - return; - - if (dsize == 0) - (void) fprintf(fp, "done! (no data returned)\n"); - else - printvars(dsize, datap, (int)rstatus, - (associd != 0) ? TYPE_PEER : TYPE_SYS, fp); - return; -} - - -/* - * clocklist - send a clock variables request with the variables on the list - */ -static void -clocklist(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - int associd; - - if (pcmd->nargs == 0) { - associd = 0; - } else { - if (pcmd->argval[0].uval == 0) - associd = 0; - else if ((associd = checkassocid(pcmd->argval[0].uval)) == 0) - return; - } - - (void) dolist(varlist, associd, CTL_OP_READCLOCK, TYPE_CLOCK, fp); -} - - -/* - * clockvar - send a clock variables request with the specified variables - */ -static void -clockvar(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - int associd; - struct varlist tmplist[MAXLIST]; - - if (pcmd->nargs == 0 || pcmd->argval[0].uval == 0) - associd = 0; - else if ((associd = checkassocid(pcmd->argval[0].uval)) == 0) - return; - - memset((char *)tmplist, 0, sizeof(tmplist)); - if (pcmd->nargs >= 2) - doaddvlist(tmplist, pcmd->argval[1].string); - - (void) dolist(tmplist, associd, CTL_OP_READCLOCK, TYPE_CLOCK, fp); - - doclearvlist(tmplist); -} - - -/* - * findassidrange - verify a range of association ID's - */ -static int -findassidrange(assid1, assid2, from, to) - u_long assid1; - u_long assid2; - int *from; - int *to; -{ - register int i; - int f, t; - - if (assid1 == 0 || assid1 > 65535) { - (void) fprintf(stderr, - "***Invalid association ID %lu specified\n", (u_long)assid1); - return 0; - } - - if (assid2 == 0 || assid2 > 65535) { - (void) fprintf(stderr, - "***Invalid association ID %lu specified\n", (u_long)assid2); - return 0; - } - - f = t = -1; - for (i = 0; i < numassoc; i++) { - if (assoc_cache[i].assid == assid1) { - f = i; - if (t != -1) - break; - } - if (assoc_cache[i].assid == assid2) { - t = i; - if (f != -1) - break; - } - } - - if (f == -1 || t == -1) { - (void) fprintf(stderr, - "***Association ID %lu not found in list\n", - (f == -1) ? (u_long)assid1 : (u_long)assid2); - return 0; - } - - if (f < t) { - *from = f; - *to = t; - } else { - *from = t; - *to = f; - } - return 1; -} - - - -/* - * mreadlist - send a read variables request for multiple associations - */ -static void -mreadlist(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - int i; - int from; - int to; - - if (!findassidrange(pcmd->argval[0].uval, pcmd->argval[1].uval, - &from, &to)) - return; - - for (i = from; i <= to; i++) { - if (i != from) - (void) fprintf(fp, "\n"); - if (!dolist(varlist, (int)assoc_cache[i].assid, - CTL_OP_READVAR, TYPE_PEER, fp)) - return; - } - return; -} - - -/* - * mreadvar - send a read variables request for multiple associations - */ -static void -mreadvar(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - int i; - int from; - int to; - struct varlist tmplist[MAXLIST]; - - if (!findassidrange(pcmd->argval[0].uval, pcmd->argval[1].uval, - &from, &to)) - return; - - memset((char *)tmplist, 0, sizeof(tmplist)); - if (pcmd->nargs >= 3) - doaddvlist(tmplist, pcmd->argval[2].string); - - for (i = from; i <= to; i++) { - if (i != from) - (void) fprintf(fp, "\n"); - if (!dolist(varlist, (int)assoc_cache[i].assid, - CTL_OP_READVAR, TYPE_PEER, fp)) - break; - } - doclearvlist(tmplist); - return; -} - - -/* - * dogetassoc - query the host for its list of associations - */ -static int -dogetassoc(fp) - FILE *fp; -{ - u_short *datap; - int res; - int dsize; - u_short rstatus; - - res = doquery(CTL_OP_READSTAT, 0, 0, 0, (char *)0, &rstatus, - &dsize, (char **)&datap); - - if (res != 0) - return 0; - - if (dsize == 0) { - (void) fprintf(fp, "No association ID's returned\n"); - return 0; - } - - if (dsize & 0x3) { - (void) fprintf(stderr, - "***Server returned %d octets, should be multiple of 4\n", - dsize); - return 0; - } - - numassoc = 0; - while (dsize > 0) { - assoc_cache[numassoc].assid = ntohs(*datap); - datap++; - assoc_cache[numassoc].status = ntohs(*datap); - datap++; - if (++numassoc >= MAXASSOC) - break; - dsize -= sizeof(u_short) + sizeof(u_short); - } - sortassoc(); - return 1; -} - - -/* - * printassoc - print the current list of associations - */ -static void -printassoc(showall, fp) - int showall; - FILE *fp; -{ - register char *bp; - int i; - u_char statval; - int event; - u_long event_count; - char *conf; - char *reach; - char *auth; - char *condition = ""; - char *last_event; - char *cnt; - char buf[128]; - - if (numassoc == 0) { - (void) fprintf(fp, "No association ID's in list\n"); - return; - } - - /* - * Output a header - */ - (void) fprintf(fp, - "ind assID status conf reach auth condition last_event cnt\n"); - (void) fprintf(fp, - "===========================================================\n"); - for (i = 0; i < numassoc; i++) { - statval = CTL_PEER_STATVAL(assoc_cache[i].status); - if (!showall && !(statval & (CTL_PST_CONFIG|CTL_PST_REACH))) - continue; - event = CTL_PEER_EVENT(assoc_cache[i].status); - event_count = CTL_PEER_NEVNT(assoc_cache[i].status); - if (statval & CTL_PST_CONFIG) - conf = "yes"; - else - conf = "no"; - if (statval & CTL_PST_REACH) { - reach = "yes"; - if (statval & CTL_PST_AUTHENABLE) { - if (statval & CTL_PST_AUTHENTIC) - auth = "ok "; - else - auth = "bad"; - } else - auth = "none"; - - if (pktversion == NTP_VERSION) - switch (statval & 0x7) { - case CTL_PST_SEL_REJECT: - condition = "insane"; - break; - case CTL_PST_SEL_SANE: - condition = "falsetick"; - break; - case CTL_PST_SEL_CORRECT: - condition = "eliminate"; - break; - case CTL_PST_SEL_SELCAND: - condition = "outlyer"; - break; - case CTL_PST_SEL_SYNCCAND: - condition = "synchr."; - break; - case CTL_PST_SEL_DISTSYSPEER: - condition = "dist.peer"; - break; - case CTL_PST_SEL_SYSPEER: - condition = "sys.peer"; - break; - case CTL_PST_SEL_PPS: - condition = "pps.peer"; - break; - } - else - switch (statval & 0x3) { - case OLD_CTL_PST_SEL_REJECT: - if (!(statval & OLD_CTL_PST_SANE)) - condition = "insane"; - else if (!(statval & OLD_CTL_PST_DISP)) - condition = "hi_disp"; - else - condition = ""; - break; - case OLD_CTL_PST_SEL_SELCAND: - condition = "sel_cand"; - break; - case OLD_CTL_PST_SEL_SYNCCAND: - condition = "sync_cand"; - break; - case OLD_CTL_PST_SEL_SYSPEER: - condition = "sys.peer"; - break; - } - - } else { - reach = "no"; - auth = condition = ""; - } - - switch (PEER_EVENT|event) { - case EVNT_PEERIPERR: - last_event = "IP error"; - break; - case EVNT_PEERAUTH: - last_event = "auth fail"; - break; - case EVNT_UNREACH: - last_event = "lost reach"; - break; - case EVNT_REACH: - last_event = "reachable"; - break; - case EVNT_PEERCLOCK: - last_event = "clock expt"; - break; -#if 0 - case EVNT_PEERSTRAT: - last_event = "stratum chg"; - break; -#endif - default: - last_event = ""; - break; - } - - if (event_count != 0) - cnt = uinttoa(event_count); - else - cnt = ""; - (void) sprintf(buf, - "%3d %5u %04x %3.3s %4s %4.4s %9.9s %11s %2s", - i+1, assoc_cache[i].assid, assoc_cache[i].status, - conf, reach, auth, condition, last_event, cnt); - bp = &buf[strlen(buf)]; - while (bp > buf && *(bp-1) == ' ') - *(--bp) = '\0'; - (void) fprintf(fp, "%s\n", buf); - } -} - - - -/* - * associations - get, record and print a list of associations - */ -/*ARGSUSED*/ -static void -associations(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (dogetassoc(fp)) - printassoc(0, fp); -} - - -/* - * lassociations - get, record and print a long list of associations - */ -/*ARGSUSED*/ -static void -lassociations(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (dogetassoc(fp)) - printassoc(1, fp); -} - - -/* - * passociations - print the association list - */ -/*ARGSUSED*/ -static void -passociations(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - printassoc(0, fp); -} - - -/* - * lpassociations - print the long association list - */ -/*ARGSUSED*/ -static void -lpassociations(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - printassoc(1, fp); -} - - -#ifdef UNUSED -/* - * radiostatus - print the radio status returned by the server - */ -/*ARGSUSED*/ -static void -radiostatus(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - char *datap; - int res; - int dsize; - u_short rstatus; - - res = doquery(CTL_OP_READCLOCK, 0, 0, 0, (char *)0, &rstatus, - &dsize, &datap); - - if (res != 0) - return; - - if (dsize == 0) { - (void) fprintf(fp, "No radio status string returned\n"); - return; - } - - asciize(dsize, datap, fp); -} -#endif /* UNUSED */ - -/* - * pstatus - print peer status returned by the server - */ -static void -pstatus(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - char *datap; - int res; - int associd; - int dsize; - u_short rstatus; - - if ((associd = checkassocid(pcmd->argval[0].uval)) == 0) - return; - - res = doquery(CTL_OP_READSTAT, associd, 0, 0, (char *)0, &rstatus, - &dsize, &datap); - - if (res != 0) - return; - - if (dsize == 0) { - (void) fprintf(fp, - "No information returned for association %u\n", - associd); - return; - } - - printvars(dsize, datap, (int)rstatus, TYPE_PEER, fp); -} - - -/* - * fixup - fix up a string so we don't get a hanging decimal after it - */ -static char * -fixup(width, str) - int width; - char *str; -{ - if (str[width-1] == '.') - str[width-1] = '\0'; - return str; -} - - -/* - * when - print how long its been since his last packet arrived - */ -static char * -when(ts, rec, reftime) - l_fp *ts; - l_fp *rec; - l_fp *reftime; -{ - long diff; - l_fp *lasttime; - static char buf[20]; - - if (rec->l_ui != 0) - lasttime = rec; - else if (reftime->l_ui != 0) - lasttime = reftime; - else - return "-"; - - diff = (long)(ts->l_ui - lasttime->l_ui); - if (diff <= 0) { - /* - * Time warp? - */ - diff = 1; - } - - if (diff <= 2048) { - (void) sprintf(buf, "%ld", (long int)diff); - return buf; - } - - diff = (diff + 29) / 60; - if (diff <= 300) { - (void) sprintf(buf, "%ldm", (long int)diff); - return buf; - } - - diff = (diff + 29) / 60; - if (diff <= 96) { - (void) sprintf(buf, "%ldh", (long int)diff); - return buf; - } - - diff = (diff + 11) / 24; - (void) sprintf(buf, "%ldd", (long int)diff); - return buf; -} - - - -/* - * A list of variables required by the peers command - */ -struct varlist opeervarlist[] = { - { "srcadr", 0 }, /* 0 */ - { "dstadr", 0 }, /* 1 */ - { "stratum", 0 }, /* 2 */ - { "hpoll", 0 }, /* 3 */ - { "ppoll", 0 }, /* 4 */ - { "reach", 0 }, /* 5 */ - { "delay", 0 }, /* 6 */ - { "offset", 0 }, /* 7 */ - { "dispersion", 0 }, /* 8 */ - { "rec", 0 }, /* 9 */ - { "reftime", 0 }, /* 10 */ - { "srcport", 0 }, /* 11 */ - { 0, 0 } -}; - -struct varlist peervarlist[] = { - { "srcadr", 0 }, /* 0 */ - { "refid", 0 }, /* 1 */ - { "stratum", 0 }, /* 2 */ - { "hpoll", 0 }, /* 3 */ - { "ppoll", 0 }, /* 4 */ - { "reach", 0 }, /* 5 */ - { "delay", 0 }, /* 6 */ - { "offset", 0 }, /* 7 */ - { "dispersion", 0 }, /* 8 */ - { "rec", 0 }, /* 9 */ - { "reftime", 0 }, /* 10 */ - { "srcport", 0 }, /* 11 */ - { 0, 0 } -}; - -#define HAVE_SRCADR 0 -#define HAVE_DSTADR 1 -#define HAVE_REFID 1 -#define HAVE_STRATUM 2 -#define HAVE_HPOLL 3 -#define HAVE_PPOLL 4 -#define HAVE_REACH 5 -#define HAVE_DELAY 6 -#define HAVE_OFFSET 7 -#define HAVE_DISPERSION 8 -#define HAVE_REC 9 -#define HAVE_REFTIME 10 -#define HAVE_SRCPORT 11 -#define MAXHAVE 12 - -/* - * Decode an incoming data buffer and print a line in the peer list - */ -static int -doprintpeers(pvl, associd, rstatus, datalen, data, fp) - struct varlist *pvl; - int associd; - int rstatus; - int datalen; - char *data; - FILE *fp; -{ - char *name; - char *value; - int i; - int c; - - u_long srcadr; - u_long dstadr; - u_long srcport; - char *dstadr_refid = "0.0.0.0"; - u_long stratum; - long ppoll; - long hpoll; - u_long reach; - l_fp estdelay; - l_fp estoffset; - l_fp estdisp; - l_fp rec; - l_fp reftime; - l_fp ts; - u_char havevar[MAXHAVE]; - u_long poll; - char type = '?'; - char refid_string[10]; - extern struct ctl_var peer_var[]; - - memset((char *)havevar, 0, sizeof(havevar)); - gettstamp(&ts); - - while (nextvar(&datalen, &data, &name, &value)) { - u_long dummy; - i = findvar(name, peer_var); - if (i == 0) - continue; /* don't know this one */ - switch (i) { - case CP_SRCADR: - if (decodenetnum(value, &srcadr)) - havevar[HAVE_SRCADR] = 1; - break; - case CP_DSTADR: - if (decodenetnum(value, &dummy)) { - dummy = ntohl(dummy); - type = ((dummy&0xf0000000)==0xe0000000) ? 'm' : - ((dummy&0x000000ff)==0x000000ff) ? 'b' : - ((dummy&0xffffffff)==0x7f000001) ? 'l' : - ((dummy&0xffffffe0)==0x00000000) ? '-' : - 'u'; - } - if (pvl == opeervarlist) { - if (decodenetnum(value, &dstadr)) { - havevar[HAVE_DSTADR] = 1; - dstadr_refid = numtoa(dstadr); - } - } - break; - case CP_REFID: - if (pvl == peervarlist) { - havevar[HAVE_REFID] = 1; - if (*value == '\0') { - dstadr_refid = "0.0.0.0"; - } else if (decodenetnum(value, &dstadr)) { - if (dstadr == 0) - dstadr_refid = "0.0.0.0"; - else - dstadr_refid = nntohost(dstadr); - } else if ((int)strlen(value) <= 4) { - refid_string[0] = '.'; - (void) strcpy(&refid_string[1], value); - i = strlen(refid_string); - refid_string[i] = '.'; - refid_string[i+1] = '\0'; - dstadr_refid = refid_string; - } else { - havevar[HAVE_REFID] = 0; - } - } - break; - case CP_STRATUM: - if (decodeuint(value, &stratum)) - havevar[HAVE_STRATUM] = 1; - break; - case CP_HPOLL: - if (decodeint(value, &hpoll)) { - havevar[HAVE_HPOLL] = 1; - if (hpoll < 0) - hpoll = NTP_MINPOLL; - } - break; - case CP_PPOLL: - if (decodeint(value, &ppoll)) { - havevar[HAVE_PPOLL] = 1; - if (ppoll < 0) - ppoll = NTP_MINPOLL; - } - break; - case CP_REACH: - if (decodeuint(value, &reach)) - havevar[HAVE_REACH] = 1; - break; - case CP_DELAY: - if (decodetime(value, &estdelay)) - havevar[HAVE_DELAY] = 1; - break; - case CP_OFFSET: - if (decodetime(value, &estoffset)) - havevar[HAVE_OFFSET] = 1; - break; - case CP_DISPERSION: - if (decodetime(value, &estdisp)) - havevar[HAVE_DISPERSION] = 1; - break; - case CP_REC: - if (decodets(value, &rec)) - havevar[HAVE_REC] = 1; - break; - case CP_SRCPORT: - if (decodeuint(value, &srcport)) - havevar[HAVE_SRCPORT] = 1; - break; - case CP_REFTIME: - havevar[HAVE_REFTIME] = 1; - if (!decodets(value, &reftime)) - L_CLR(&reftime); - break; - default: - break; - } - } - - /* - * Check to see if the srcport is NTP's port. If not this probably - * isn't a valid peer association. - */ - if (havevar[HAVE_SRCPORT] && srcport != NTP_PORT) - return 1; - - /* - * Check to see if we got all of them. If not, return an - * error. - */ - for (i = 0; i < MAXHAVE; i++) - if (!havevar[i]) { - (void) fprintf(stderr, - "***Remote host didn't return peer.%s for association %d\n", - pvl[i].name, associd); - return 0; - } - - - /* - * Got everything, format the line - */ - poll = 1<<max(min3(ppoll, hpoll, NTP_MAXPOLL), NTP_MINPOLL); - if (pktversion == NTP_VERSION) - c = flash3[CTL_PEER_STATVAL(rstatus) & 0x7]; - else - c = flash2[CTL_PEER_STATVAL(rstatus) & 0x3]; - if (numhosts > 1) - (void) fprintf(fp, "%-*s ", maxhostlen, currenthost); - (void) fprintf(fp, - "%c%-15.15s %-15.15s %2ld %c %4.4s %4ld %3lo %7.7s %8.7s %7.7s\n", - c, nntohost(srcadr), dstadr_refid, stratum, type, - when(&ts, &rec, &reftime), poll, reach, - fixup(7, lfptoms(&estdelay, 2)), fixup(8, lfptoms(&estoffset, 3)), - fixup(7, lfptoms(&estdisp, 2))); - return 1; -} - -#undef HAVE_SRCADR -#undef HAVE_DSTADR -#undef HAVE_STRATUM -#undef HAVE_PPOLL -#undef HAVE_HPOLL -#undef HAVE_REACH -#undef HAVE_ESTDELAY -#undef HAVE_ESTOFFSET -#undef HAVE_ESTDISP -#undef HAVE_REFID -#undef HAVE_REC -#undef HAVE_SRCPORT -#undef HAVE_REFTIME -#undef MAXHAVE - - -/* - * dogetpeers - given an association ID, read and print the spreadsheet - * peer variables. - */ -static int -dogetpeers(pvl, associd, fp) - struct varlist *pvl; - int associd; - FILE *fp; -{ - char *datap; - int res; - int dsize; - u_short rstatus; - -#ifdef notdef - res = doquerylist(pvl, CTL_OP_READVAR, associd, 0, &rstatus, - &dsize, &datap); -#else - /* - * Damn fuzzballs - */ - res = doquery(CTL_OP_READVAR, associd, 0, 0, (char *)0, &rstatus, - &dsize, &datap); -#endif - - if (res != 0) - return 0; - - if (dsize == 0) { - (void) fprintf(stderr, - "***No information returned for association %d\n", - associd); - return 0; - } - - - return doprintpeers(pvl, associd, (int)rstatus, dsize, datap, fp); -} - - -/* - * peers - print a peer spreadsheet - */ -static void -dopeers(showall, fp) - int showall; - FILE *fp; -{ - register int i; - char fullname[LENHOSTNAME]; - u_long netnum; - - - if (!dogetassoc(fp)) - return; - - for (i = 0; i < numhosts; ++i) - { if(getnetnum(chosts[i],&netnum,fullname)) - if ((int)strlen(fullname) > maxhostlen) - maxhostlen = strlen(fullname); - } - if (numhosts > 1) - (void) fprintf(fp, "%-*.*s ", maxhostlen, maxhostlen, "host"); - (void) fprintf(fp, -" remote refid st t when poll reach delay offset disp\n"); - if (numhosts > 1) - for (i = 0; i <= maxhostlen; ++i) - (void) fprintf(fp, "="); - (void) fprintf(fp, -"==============================================================================\n"); - - for (i = 0; i < numassoc; i++) { - if (!showall && - !(CTL_PEER_STATVAL(assoc_cache[i].status) - & (CTL_PST_CONFIG|CTL_PST_REACH))) - continue; - if (!dogetpeers(peervarlist, (int)assoc_cache[i].assid, fp)) { - return; - } - } - return; -} - - -/* - * peers - print a peer spreadsheet - */ -/*ARGSUSED*/ -static void -peers(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - dopeers(0, fp); -} - - -/* - * lpeers - print a peer spreadsheet including all fuzzball peers - */ -/*ARGSUSED*/ -static void -lpeers(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - dopeers(1, fp); -} - - -/* - * opeers - print a peer spreadsheet - */ -static void -doopeers(showall, fp) - int showall; - FILE *fp; -{ - register int i; - - if (!dogetassoc(fp)) - return; - - (void) fprintf(fp, -" remote local st t when poll reach delay offset disp\n"); - (void) fprintf(fp, -"===========================================================================\n"); - - for (i = 0; i < numassoc; i++) { - if (!showall && - !(CTL_PEER_STATVAL(assoc_cache[i].status) - & (CTL_PST_CONFIG|CTL_PST_REACH))) - continue; - if (!dogetpeers(opeervarlist, (int)assoc_cache[i].assid, fp)) { - return; - } - } - return; -} - - -/* - * opeers - print a peer spreadsheet the old way - */ -/*ARGSUSED*/ -static void -opeers(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - doopeers(0, fp); -} - - -/* - * lopeers - print a peer spreadsheet including all fuzzball peers - */ -/*ARGSUSED*/ -static void -lopeers(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - doopeers(1, fp); -} diff --git a/usr.sbin/xntpd/ntptrace/Makefile b/usr.sbin/xntpd/ntptrace/Makefile deleted file mode 100644 index 1b704ba44ba0..000000000000 --- a/usr.sbin/xntpd/ntptrace/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# -# $FreeBSD$ -# - -CFLAGS+= -I${.CURDIR}/../include - -DPADD= ${LIBNTP} -LDADD= ${LIBNTP} - -PROG= ntptrace -MAN8= ${.CURDIR}/../doc/ntptrace.8 -CLEANFILES+= .version version.c - -SRCS= ntptrace.c version.c - -version.c: ${.CURDIR}/../VERSION - sh -e ${.CURDIR}/../scripts/mkversion ntptrace - -.include <bsd.prog.mk> diff --git a/usr.sbin/xntpd/ntptrace/README b/usr.sbin/xntpd/ntptrace/README deleted file mode 100644 index b976cfdf22ce..000000000000 --- a/usr.sbin/xntpd/ntptrace/README +++ /dev/null @@ -1,7 +0,0 @@ -README file for directory ./ntptrace of the NTP Version 3 distribution - -This directory contains the sources for the ntptrace utility program. See -the README and RELNOTES files in the parent directory for directions on -how to make and install this program. The current version number of this -program is in the version.c file. - diff --git a/usr.sbin/xntpd/ntptrace/ntptrace.c b/usr.sbin/xntpd/ntptrace/ntptrace.c deleted file mode 100644 index 0c54fdff2b43..000000000000 --- a/usr.sbin/xntpd/ntptrace/ntptrace.c +++ /dev/null @@ -1,774 +0,0 @@ -/* - * ntptrace - show the chain from an NTP host leading back to - * its source of time - * - * Jeffrey Mogul DECWRL 13 January 1993 - * - * Inspired by a script written by Glenn Trewitt - * - * Large portions stolen from ntpdate.c - * - * $FreeBSD$ - */ -#include <stdio.h> -#include <signal.h> -#include <ctype.h> -#include <errno.h> -#include <netdb.h> -#include <sys/types.h> -#include <sys/signal.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/resource.h> - - -#ifdef __STDC__ -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -#if defined(SYS_HPUX) -#include <utmp.h> -#endif - -#include "ntp_select.h" -#include "ntp_fp.h" -#include "ntp.h" -#include "ntp_io.h" -#include "ntp_unixtime.h" -#include "ntptrace.h" -#include "ntp_string.h" -#include "ntp_stdlib.h" -#include "ntp_syslog.h" - -/* - * Debugging flag - */ -int debug = 0; - -int nonames = 0; /* if set, don't print hostnames */ - -/* - * Program name. - */ -char *progname; - -/* - * Systemwide parameters and flags - */ -int sys_retries = 5; /* # of retry attempts per server */ -int sys_timeout = 2; /* timeout time, in seconds */ -struct server **sys_servers; /* the server list */ -int sys_numservers = 0; /* number of servers to poll */ -int sys_maxservers = NTP_MAXSTRATUM+1; /* max number of servers to deal with */ -int sys_version = NTP_OLDVERSION; /* version to poll with */ - -/* - * recvbuf lists - */ -struct recvbuf *freelist; /* free buffers */ -struct recvbuf *fulllist; /* buffers with data */ - -int full_recvbufs; /* number of full ones */ -int free_recvbufs; - -/* - * File descriptor masks etc. for call to select - */ -int fd; -fd_set fdmask; - -/* - * Miscellaneous flags - */ -int verbose = 0; -int always_step = 0; - -extern int errno; - -static void DoTrace P((struct server *)); -static void DoTransmit P((struct server *)); -static int DoReceive P((struct server *)); -static int ReceiveBuf P((struct server *, struct recvbuf *)); -static struct server *addserver P((struct in_addr *)); -static struct server *addservbyname P((char *)); -static void setup_io P((void)); -static void freerecvbuf P((struct recvbuf *)); -static void sendpkt P((struct sockaddr_in *, struct pkt *, int)); -static int getipaddr P((char *, long *)); -static int decodeipaddr P((char *, long *)); -static void printserver P((struct server *, FILE *)); -static void printrefid P((FILE *, struct server *)); - -/* - * Main program. Initialize us and loop waiting for I/O and/or - * timer expiries. - */ -int -main(argc, argv) - int argc; - char *argv[]; -{ - struct server *firstserver; - int errflg; - int c; - extern char *ntp_optarg; - extern int ntp_optind; - extern char *Version; - - errflg = 0; - progname = argv[0]; - - /* - * Decode argument list - */ - while ((c = ntp_getopt(argc, argv, "do:nr:t:v")) != EOF) - switch (c) { - case 'd': - ++debug; - break; - case 'n': - nonames = 1; - break; - case 'o': - sys_version = atoi(ntp_optarg); - break; - case 'r': - sys_retries = atoi(ntp_optarg); - if (sys_retries < 1) { - (void)fprintf(stderr, - "%s: retries (%d) too small\n", - progname, sys_retries); - errflg++; - } - break; - case 't': - sys_timeout = atoi(ntp_optarg); - if (sys_timeout < 1) { - (void)fprintf(stderr, - "%s: timeout (%d) too short\n", - progname, sys_timeout); - errflg++; - } - break; - case 'v': - verbose = 1; - break; - case '?': - ++errflg; - break; - default: - break; - } - - if (errflg || (argc - ntp_optind) > 1) { - (void) fprintf(stderr, - "usage: %s [-vnd] [-r retries] [-t timeout] [server]\n", - progname); - exit(2); - } - - sys_servers = (struct server **) - emalloc(sys_maxservers * sizeof(struct server *)); - - if (debug) { -#ifdef NTP_POSIX_SOURCE - static char buf[BUFSIZ]; - setvbuf(stdout, buf, _IOLBF, BUFSIZ); -#else - setlinebuf(stdout); -#endif - } - - if (debug || verbose) - syslog(LOG_NOTICE, "%s", Version); - - if ((argc - ntp_optind) == 1) - firstserver = addservbyname(argv[ntp_optind]); - else - firstserver = addservbyname("localhost"); - - if (firstserver == NULL) { - /* a message has already been printed */ - exit(2); - } - - /* - * Initialize the time of day routines and the I/O subsystem - */ - setup_io(); - - DoTrace(firstserver); - - exit(0); -} - -static void -DoTrace(server) -register struct server *server; -{ - int retries = sys_retries; - - if (!verbose) { - if (nonames) - printf("%s: ", ntoa(&server->srcadr)); - else - printf("%s: ", ntohost(&server->srcadr)); - fflush(stdout); - } - while (retries-- > 0) { - DoTransmit(server); - if (DoReceive(server)) - return; - } - if (verbose) { - if (nonames) - printf("%s:\t*Timeout*\n", ntoa(&server->srcadr)); - else - printf("%s:\t*Timeout*\n", ntohost(&server->srcadr)); - } - else - printf("\t*Timeout*\n"); -} - -/* - * Dotransmit - transmit a packet to the given server - */ -static void -DoTransmit(server) -register struct server *server; -{ - struct pkt xpkt; - - if (debug) - printf("DoTransmit(%s)\n", ntoa(&server->srcadr)); - - /* - * Fill in the packet and let 'er rip. - */ - xpkt.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOTINSYNC, - sys_version, MODE_CLIENT); - xpkt.stratum = STRATUM_TO_PKT(STRATUM_UNSPEC); - xpkt.ppoll = NTP_MINPOLL; - xpkt.precision = NTPTRACE_PRECISION; - xpkt.rootdelay = htonl(NTPTRACE_DISTANCE); - xpkt.rootdispersion = htonl(NTPTRACE_DISP); - xpkt.refid = htonl(NTPTRACE_REFID); - L_CLR(&xpkt.reftime); - L_CLR(&xpkt.org); - L_CLR(&xpkt.rec); - - /* - * just timestamp packet and send it away. - */ - get_systime(&(server->xmt)); - HTONL_FP(&server->xmt, &xpkt.xmt); - sendpkt(&(server->srcadr), &xpkt, LEN_PKT_NOMAC); - - if (debug) - printf("DoTransmit to %s\n", ntoa(&(server->srcadr))); -} - -/* - * DoReceive - attempt to receive a packet from a specific server - */ -static int -DoReceive(server) -register struct server *server; -{ - register int n; - fd_set fds; - struct timeval timeout; - l_fp ts; - register struct recvbuf *rb; - int fromlen; - int status; - - /* - * Loop until we see the packet we want or until we time out - */ - for (;;) { - fds = fdmask; - timeout.tv_sec = sys_timeout; - timeout.tv_usec = 0; - n = select(fd+1, &fds, (fd_set *)0, (fd_set *)0, &timeout); - - if (n == 0) { /* timed out */ - if (debug) - printf("timeout\n"); - return(0); - } - else if (n == -1) { - syslog(LOG_ERR, "select() error: %m"); - return(0); - } - get_systime(&ts); - - if (free_recvbufs == 0) { - syslog(LOG_ERR, "no buffers"); - exit(1); - } - - rb = freelist; - freelist = rb->next; - free_recvbufs--; - - fromlen = sizeof(struct sockaddr_in); - rb->recv_length = recvfrom(fd, (char *)&rb->recv_pkt, - sizeof(rb->recv_pkt), 0, - (struct sockaddr *)&rb->srcadr, &fromlen); - if (rb->recv_length == -1) { - rb->next = freelist; - freelist = rb; - free_recvbufs++; - continue; - } - - /* - * Got one. Mark how and when it got here, - * put it on the full list. - */ - rb->recv_time = ts; - rb->next = fulllist; - fulllist = rb; - full_recvbufs++; - - status = ReceiveBuf(server, rb); - - freerecvbuf(rb); - - return(status); - } -} - -/* - * receive - receive and process an incoming frame - * Return 1 on success, 0 on failure - */ -static int -ReceiveBuf(server, rbufp) - struct server *server; - struct recvbuf *rbufp; -{ - register struct pkt *rpkt; - register s_fp di; - l_fp t10, t23; - l_fp org; - l_fp rec; - l_fp ci; - struct server *nextserver; - struct in_addr nextia; - - - if (debug) { - printf("ReceiveBuf(%s, ", ntoa(&server->srcadr)); - printf("%s)\n", ntoa(&rbufp->srcadr)); - } - - /* - * Check to see if the packet basically looks like something - * intended for us. - */ - if (rbufp->recv_length < LEN_PKT_NOMAC) { - if (debug) - printf("receive: packet length %d\n", - rbufp->recv_length); - return(0); /* funny length packet */ - } - if (rbufp->srcadr.sin_addr.s_addr != server->srcadr.sin_addr.s_addr) { - if (debug) - printf("receive: wrong server\n"); - return(0); /* funny length packet */ - } - - rpkt = &(rbufp->recv_pkt); - - if (PKT_VERSION(rpkt->li_vn_mode) < NTP_OLDVERSION) { - if (debug) - printf("receive: version %d\n", PKT_VERSION(rpkt->li_vn_mode)); - return(0); - } - if (PKT_VERSION(rpkt->li_vn_mode) > NTP_VERSION) { - if (debug) - printf("receive: version %d\n", PKT_VERSION(rpkt->li_vn_mode)); - return(0); - } - - if ((PKT_MODE(rpkt->li_vn_mode) != MODE_SERVER - && PKT_MODE(rpkt->li_vn_mode) != MODE_PASSIVE) - || rpkt->stratum > NTP_MAXSTRATUM) { - if (debug) - printf("receive: mode %d stratum %d\n", - PKT_MODE(rpkt->li_vn_mode), rpkt->stratum); - return(0); - } - - /* - * Decode the org timestamp and make sure we're getting a response - * to our last request. - */ - NTOHL_FP(&rpkt->org, &org); - if (!L_ISEQU(&org, &server->xmt)) { - if (debug) - printf("receive: pkt.org and peer.xmt differ\n"); - return(0); - } - - /* - * Looks good. Record info from the packet. - */ - server->leap = PKT_LEAP(rpkt->li_vn_mode); - server->stratum = PKT_TO_STRATUM(rpkt->stratum); - server->precision = rpkt->precision; - server->rootdelay = ntohl(rpkt->rootdelay); - server->rootdispersion = ntohl(rpkt->rootdispersion); - server->refid = rpkt->refid; - NTOHL_FP(&rpkt->reftime, &server->reftime); - NTOHL_FP(&rpkt->rec, &rec); - NTOHL_FP(&rpkt->xmt, &server->org); - - /* - * Make sure the server is at least somewhat sane. If not, try - * again. - */ - if (L_ISZERO(&rec) || !L_ISHIS(&server->org, &rec)) { - return(0); - } - - /* - * Calculate the round trip delay (di) and the clock offset (ci). - * We use the equations (reordered from those in the spec): - * - * d = (t2 - t3) - (t1 - t0) - * c = ((t2 - t3) + (t1 - t0)) / 2 - */ - t10 = server->org; /* pkt.xmt == t1 */ - L_SUB(&t10, &rbufp->recv_time); /* recv_time == t0*/ - - t23 = rec; /* pkt.rec == t2 */ - L_SUB(&t23, &org); /* pkt->org == t3 */ - - /* now have (t2 - t3) and (t0 - t1). Calculate (ci) and (di) */ - ci = t10; - L_ADD(&ci, &t23); - L_RSHIFT(&ci); - - /* - * Calculate di in t23 in full precision, then truncate - * to an s_fp. - */ - L_SUB(&t23, &t10); - di = LFPTOFP(&t23); - - server->offset = ci; - server->delay = di; - - printserver(server, stdout); - - /* End of recursion if we reach stratum 1 */ - if (server->stratum <= 1) - return(1); - - nextia.s_addr = server->refid; - nextserver = addserver(&nextia); - DoTrace(nextserver); - return(1); -} - -/* XXX ELIMINATE addserver (almost) identical to ntpdate.c, ntptrace.c */ -/* - * addserver - Allocate a new structure for server. - * Returns a pointer to that structure. - */ -static struct server * -addserver(iap) -struct in_addr *iap; -{ - register struct server *server; - static int toomany = 0; - - if (sys_numservers >= sys_maxservers) { - if (!toomany) { - toomany = 1; - syslog(LOG_ERR, - "too many servers (> %d) specified, remainder not used", - sys_maxservers); - } - return(NULL); - } - - server = (struct server *)emalloc(sizeof(struct server)); - memset((char *)server, 0, sizeof(struct server)); - - server->srcadr.sin_family = AF_INET; - server->srcadr.sin_addr = *iap; - server->srcadr.sin_port = htons(NTP_PORT); - - sys_servers[sys_numservers++] = server; - - return(server); -} -/* - * addservbyname - determine a server's address and allocate a new structure - * for it. Returns a pointer to that structure. - */ -static struct server * -addservbyname(serv) - char *serv; -{ - long ipaddr; - struct in_addr ia; - - if (!getipaddr(serv, &ipaddr)) { - syslog(LOG_ERR, "can't find host %s\n", serv); - return(NULL); - } - - ia.s_addr = ipaddr; - return(addserver(&ia)); -} - -/* XXX ELIMINATE getrecvbufs (almost) identical to ntpdate.c, ntptrace.c, ntp_io.c */ -/* - * setup_io - initialize I/O data and open socket - */ -static void -setup_io() -{ - register int i; - register struct recvbuf *rb; - - /* - * Init buffer free list and stat counters - */ - rb = (struct recvbuf *) - emalloc((sys_maxservers + 2) * sizeof(struct recvbuf)); - freelist = 0; - for (i = sys_maxservers + 2; i > 0; i--) { - rb->next = freelist; - freelist = rb; - rb++; - } - - fulllist = 0; - full_recvbufs = 0; - free_recvbufs = sys_maxservers + 2; - - /* create a datagram (UDP) socket */ - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - syslog(LOG_ERR, "socket() failed: %m"); - exit(1); - /*NOTREACHED*/ - } - - FD_ZERO(&fdmask); - FD_SET(fd, &fdmask); -} - -/* XXX ELIMINATE freerecvbuf (almost) identical to ntpdate.c, ntptrace.c, ntp_io.c */ -/* - * freerecvbuf - make a single recvbuf available for reuse - */ -static void -freerecvbuf(rb) - struct recvbuf *rb; -{ - rb->next = freelist; - freelist = rb; - free_recvbufs++; -} - - -/* XXX ELIMINATE sendpkt similar in ntpq.c, ntpdc.c, ntp_io.c, ntptrace.c */ -/* - * sendpkt - send a packet to the specified destination - */ -static void -sendpkt(dest, pkt, len) - struct sockaddr_in *dest; - struct pkt *pkt; - int len; -{ - int cc; - - cc = sendto(fd, (char *)pkt, len, 0, (struct sockaddr *)dest, - sizeof(struct sockaddr_in)); - if (cc == -1) { - if (errno != EWOULDBLOCK && errno != ENOBUFS) - syslog(LOG_ERR, "sendto(%s): %m", ntoa(dest)); - } -} - -/* - * getipaddr - given a host name, return its host address - */ -static int -getipaddr(host, num) - char *host; - long *num; -{ - struct hostent *hp; - - if (decodeipaddr(host, num)) { - return 1; - } else if ((hp = gethostbyname(host)) != 0) { - memmove((char *)num, hp->h_addr, sizeof(long)); - return 1; - } - return 0; -} - -/* - * decodeipaddr - return a host address (this is crude, but careful) - */ -static int -decodeipaddr(num, ipaddr) - char *num; - long *ipaddr; -{ - register char *cp; - register char *bp; - register int i; - register int temp; - char buf[80]; /* will core dump on really stupid stuff */ - - cp = num; - *ipaddr = 0; - for (i = 0; i < 4; i++) { - bp = buf; - while (isdigit(*cp)) - *bp++ = *cp++; - if (bp == buf) - break; - - if (i < 3) { - if (*cp++ != '.') - break; - } else if (*cp != '\0') - break; - - *bp = '\0'; - temp = atoi(buf); - if (temp > 255) - break; - *ipaddr <<= 8; - *ipaddr += temp; - } - - if (i < 4) - return 0; - *ipaddr = htonl(*ipaddr); - return 1; -} - - -/* XXX ELIMINATE printserver similar in ntptrace.c, ntpdate.c */ -/* - * printserver - print detail information for a server - */ -static void -printserver(pp, fp) - register struct server *pp; - FILE *fp; -{ - u_fp synchdist; - - synchdist = pp->rootdispersion + (pp->rootdelay/2); - - if (!verbose) { - (void) fprintf(fp, "stratum %d, offset %s, synch distance %s", - pp->stratum, - lfptoa(&pp->offset, 6), - ufptoa(synchdist, 5)); - if (pp->stratum == 1) { - (void) fprintf(fp, ", refid "); - printrefid(fp, pp); - } - (void) fprintf(fp, "\n"); - return; - } - - (void) fprintf(fp, "server %s, port %d\n", - ntoa(&pp->srcadr), ntohs(pp->srcadr.sin_port)); - - (void) fprintf(fp, "stratum %d, precision %d, leap %c%c\n", - pp->stratum, pp->precision, - pp->leap & 0x2 ? '1' : '0', - pp->leap & 0x1 ? '1' : '0'); - - (void) fprintf(fp, "refid "); - printrefid(fp, pp); - - (void) fprintf(fp, - " delay %s, dispersion %s ", - fptoa(pp->delay, 5), - ufptoa(pp->dispersion, 5)); - (void) fprintf(fp, "offset %s\n", - lfptoa(&pp->offset, 6)); - (void) fprintf(fp, "rootdelay %s, rootdispersion %s", - fptoa(pp->rootdelay, 5), ufptoa(pp->rootdispersion, 5)); - (void) fprintf(fp, ", synch dist %s\n", - ufptoa(synchdist, 5)); - - (void) fprintf(fp, "reference time: %s\n", - prettydate(&pp->reftime)); - (void) fprintf(fp, "originate timestamp: %s\n", - prettydate(&pp->org)); - (void) fprintf(fp, "transmit timestamp: %s\n", - prettydate(&pp->xmt)); - - (void) fprintf(fp, "\n"); - -} - -static void -printrefid(fp, pp) -FILE *fp; -struct server *pp; -{ - char junk[5]; - char *str; - - if (pp->stratum == 1) { - junk[4] = 0; - memmove(junk, (char *)&pp->refid, 4); - str = junk; - (void) fprintf(fp, "'%s'", str); - } else { - if (nonames) { - str = numtoa(pp->refid); - (void) fprintf(fp, "[%s]", str); - } - else { - str = numtohost(pp->refid); - (void) fprintf(fp, "%s", str); - } - } -} - -#if defined(NEED_VSPRINTF) -/* - * This nugget for pre-tahoe 4.3bsd systems - */ -#if !defined(__STDC__) || !__STDC__ -#define const -#endif - -int -vsprintf(str, fmt, ap) - char *str; - const char *fmt; - va_list ap; -{ - FILE f; - int len; - - f._flag = _IOWRT+_IOSTRG; - f._ptr = str; - f._cnt = 32767; - len = _doprnt(fmt, ap, &f); - *f._ptr = 0; - return (len); -} -#endif diff --git a/usr.sbin/xntpd/ntptrace/ntptrace.h b/usr.sbin/xntpd/ntptrace/ntptrace.h deleted file mode 100644 index 65b72fb71c66..000000000000 --- a/usr.sbin/xntpd/ntptrace/ntptrace.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * ntptrace.h - declarations for the ntptrace program - */ - -/* - * The server structure is a much simplified version of the - * peer structure, for ntptrace's use. Since we always send - * in client mode and expect to receive in server mode, this - * leaves only a very limited number of things we need to - * remember about the server. - */ -struct server { - struct sockaddr_in srcadr; /* address of remote host */ - u_char leap; /* leap indicator */ - u_char stratum; /* stratum of remote server */ - s_char precision; /* server's clock precision */ - u_fp rootdelay; /* distance from primary clock */ - u_fp rootdispersion; /* peer clock dispersion */ - U_LONG refid; /* peer reference ID */ - l_fp reftime; /* time of peer's last update */ - l_fp org; /* peer's originate time stamp */ - l_fp xmt; /* transmit time stamp */ - u_fp delay; /* filter estimated delay */ - u_fp dispersion; /* filter estimated dispersion */ - l_fp offset; /* filter estimated clock offset */ -}; - - -/* - * Since ntptrace isn't aware of some of the things that normally get - * put in an NTP packet, we fix some values. - */ -#define NTPTRACE_PRECISION (-6) /* use this precision */ -#define NTPTRACE_DISTANCE FP_SECOND /* distance is 1 sec */ -#define NTPTRACE_DISP FP_SECOND /* so is the dispersion */ -#define NTPTRACE_REFID (0) /* reference ID to use */ diff --git a/usr.sbin/xntpd/parse/Makefile b/usr.sbin/xntpd/parse/Makefile deleted file mode 100644 index 444f23dd7a35..000000000000 --- a/usr.sbin/xntpd/parse/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# -# $FreeBSD$ -# - -PARSEFLAGS= -DCLOCK_SCHMID -DCLOCK_DCF7000 -DCLOCK_MEINBERG \ - -DCLOCK_RAWDCF -DCLOCK_TRIMSV6 - -CFLAGS+= -I${.CURDIR}/../include ${PARSEFLAGS} - -SRCS= parse.c parse_conf.c clk_meinberg.c clk_schmid.c clk_rawdcf.c \ - clk_dcf7000.c clk_trimble.c - -NOMAN= -NOPROFILE= -LIB= parse - -install: - -.include <bsd.lib.mk> diff --git a/usr.sbin/xntpd/parse/README b/usr.sbin/xntpd/parse/README deleted file mode 100644 index aa83aa7ae009..000000000000 --- a/usr.sbin/xntpd/parse/README +++ /dev/null @@ -1,100 +0,0 @@ -PARSE reference clock driver: - -This directory contains the files making up the parser for -the parse refclock driver. For reasonably sane clocks this refclock -drivers allows a refclock implementation by just providing a -conversion routine and the appropriate NTP parameters. Refclock -support can run as low a 3k code with the parse refclock driver. - -The modules in here are designed to live in two worlds. In userlevel -as part of the xntp daemon and in kernel land as part of a STREAMS module -or, if someone gets to it, as part of a line discipline. Currently only -SunOS4.x/SunOS5.x STREAMS are supported (volunteers for other vendors like HP?). -This structure means, that refclock_parse can work with or without kernel -support. Kernelsupport increases accuracy tremendingly. The current restriction -of the parse driver is that it only supports SYSV type ttys and that kernel -support is only available for Suns right now. - -Three kernel modules are part of this directory. These work only on -SunOS (SunOS4 and SunOS5 (not fully tested!)). - - SunOS4 (aka Solaris 1.x): - parsestreams.o - standard parse module for SunOS 4 - mparsestreams.o - parse module for SunOS 4 with better - clock reading code (assembler) - - Both modules can be loaded via modload <modulename>. - - SunOS5 (aka Solaris 2.x): - parse - auto loadable streams module - (not fully tested - don't kill me if - it kills you machine) - - To install just drop "parse" into /kernel/strmod and - start the daemon (SunOS5 will do the rest). - -The structure of the parse reference clock driver is as follows: - - xntpd - contains NTP implementation and calls a reference clock - 127.127.8.x which is implemented by - refclock_parse.c - - which contains several refclock decriptions. These are - selected by the x part of the refclock address. - The lower two bits specify the device to use. Thus the - value (x % 4) determines the device to open - (/dev/refclock-0 - /dev/refclock-3). - - The kind of clock is selected by bits 2-6. This parameter - selects the clock type which deterimines how I/O is done, - the tty parameters and the NTP parameters. - - refclock_parse operates on an abstract reference clock - that delivers time stamps and stati. Offsets and sychron- - isation information is derived from this data and passed - on to refclock_receive of xntp which uses that data for - syncronisation. - - The abstract reference clock is generated by the parse* - routines. They parse the incoming data stream from the - clock and convert it to the appropriate time stamps. - The data is also mapped int the abstract clock states - POWERUP - clock has no valid phase and time code - information - - NOSYNC - Time code is not confirmed, phase is probably - ok. - SYNC - Time code and phase are correct. - - A clock is trusted for a certain time (type parameter) when - it leaves the SYNC state. This is derived from the - observation that quite a few clocks can still generate good - time code information when losing contact to their - synchronisation source. When the clock does not reagain - synchronisation in that trust period it will be deemed - unsynchronised until it regains synchronisation. The same - will happen if xntp sees the clock unsynchronised at - startup. - - The upper bit of x specifies that all samples delivered - from the clock should be used to discipline the NTP - loppfilter. For clock with accurate once a second time - information this means big improvements for time keeping. - A prerequisite for passing on the time stamps to - the loopfilter is, that the clock is in synchronised state. - - parse.c These are the general routines to parse the incoming data - stream. Usually these routines should not require - modification. - - clk_*.c These files hole the conversion code for the time stamps - and the description how the time code can be parsed and - where the time stamps are to be taken. - If you want to add a new clock type this is the file - you need to write in addition to mention it in - parse_conf.c and setting up the NTP and TTY parameters - in refclock_parse.c. - -Further information can be found in parse/README.parse and the various source -files. - -Frank Kardel diff --git a/usr.sbin/xntpd/parse/README.new_clocks b/usr.sbin/xntpd/parse/README.new_clocks deleted file mode 100644 index 5b2d29e67816..000000000000 --- a/usr.sbin/xntpd/parse/README.new_clocks +++ /dev/null @@ -1,212 +0,0 @@ -Here is an attempt to sketch out what you need to do in order to -add another clock to the parse driver: - -Prerequisites: -- Does the system you want the clock connect to have - termio.h or termios.h ? (You need that for the parse driver) - -What to do: - -Make a conversion module (parse/clk_*.c) - -- What ist the time code format ? - - find year, month, day, hour, minute, second, status (synchronised or - not), possibly time zone information (you need to give the offset to UTC) - You will have to convert the data from a string into a struct clocktime: - struct clocktime /* clock time broken up from time code */ - { - long day; - long month; - long year; - long hour; - long minute; - long second; - long usecond; - long utcoffset; /* in seconds */ - time_t utcoffset; /* true utc time instead of date/time */ - long flags; /* current clock status */ - }; - - Conversion is usually simple and straight forward. For the flags following - values can be OR'ed together: - - PARSEB_ANNOUNCE switch time zone warning (informational only) - PARSEB_POWERUP no synchronisation - clock confused (must set then) - PARSEB_NOSYNC timecode currently not confirmed (must set then) - usually on reception error when there is still a - chance the the generated time is still ok. - - PARSEB_DST DST in effect (informational only) - PARSEB_UTC timecode contains UTC time (informational only) - PARSEB_LEAPADD LEAP addition warning (prior to leap happening - must set when imminent) - also used for time code that do not encode the - direction (as this is currently the default). - PARSEB_LEAPDEL LEAP deletion warning (prior to leap happening - must set when imminent) - PARSEB_ALTERNATE backup transmitter (informational only) - PARSEB_POSITION geographic position available (informational only) - PARSEB_LEAPSECOND actual leap second (this time code is the leap - second - informational only) - - These are feature flags denoting items that are supported by the clock: - PARSEB_S_LEAP supports LEAP - might set PARSEB_LEAP - PARSEB_S_ANTENNA supports ANTENNA - might set PARSEB_ALTERNATE - PARSEB_S_PPS supports PPS time stamping - PARSEB_S_POSITION supports position information (GPS) - - If the utctime field is non zero this value will be take as - time code value. This allows for conversion routines that - already have the utc time value. The utctime field gives the seconds - since Jan 1st 1970, 0:00:00. The useconds field gives the respective - usec value. The fields for date and time (down to second resolution) - will be ignored. - - Conversion is done in the cvt_* routine in parse/clk_*.c files. look in - them for examples. The basic structure is: - - struct clockformat <yourclock>_format = { - lots of fields for you to fill out (see below) - }; - - static cvt_<yourclock>() - ... - { - if (<I do not recognize my time code>) { - return CVT_NONE; - } else { - if (<conversion into clockformat is ok>) { - <set all necessary flags>; - return CVT_OK; - } else { - return CVT_FAIL|CVT_BADFMT; - } - } - - The struct clockformat is the interface to the rest of the parse - driver - it holds all information necessary for finding the - clock message and doing the appropriate time stamping. - -struct clockformat -{ - u_long (*convert)(); - /* conversion routine - your routine - cvt_<yourclock> */ - void (*syncevt)(); - /* routine for handling RS232 sync events (time stamps) - usually sync_simple */ - u_long (*syncpps)(); - /* PPS input routine - usually pps_simple */ - u_long (*synth)(); - /* time code synthesizer - usually not used - (long (*)())0 */ - void *data; - /* local parameters - any parameters/data/configuration info your conversion - routine might need */ - char *name; - /* clock format name - Name of the time code */ - unsigned short length; - /* maximum length of data packet for your clock format */ - u_long flags; - /* information for the parser what to look for */ - struct timeval timeout; - /* buffer restart after timeout (us) - some clocks preceede new data by - a longer period of silence - unsually not used */ - unsigned char startsym; - /* start symbol - character at the beginning of the clock data */ - unsigned char endsym; - /* end symbol - character at the end of the clock data */ - unsigned char syncsym; - /* sync symbol - character that is "on time" - where the time stamp should be taken */ -}; - - The flags: - F_START use startsym to find the beginning of the clock data - F_END use endsym to find the end of the clock data - SYNC_TIMEOUT packet restart after timeout in timeout field - SYNC_START packet start is sync event (time stamp at paket start) - SYNC_END packet end is sync event (time stamp at paket end) - SYNC_CHAR special character (syncsym) is sync event - SYNC_ONE PPS synchronize on 'ONE' transition - SYNC_ZERO PPS synchronize on 'ZERO' transition - SYNC_SYNTHESIZE generate intermediate time stamps (very special case!) - CVT_FIXEDONLY convert only in fixed configuration - (data format not - suitable for auto-configuration) - - - The above should have given you some hints on how to build a clk_*.c - file with the time code conversion. See the examples and pick a clock - closest to yours and tweak the code to match your clock. - - In order to make your clk_*.c file usable a reference to the clockformat - structure must be put into parse_conf.c. - -TTY setup and initialisation/configuration will be done in -xntpd/refclock_parse.c - -- Find out the exact tty settings for your clock (baud rate, parity, - stop bits, character size, ...) and note them in terms of - termio*.h c_cflag macros. - -- in xntpd/refclock_parse.c fill out a new the struct clockinfo element - (that allocates a new "IP" address - see comments) - (see all the other clocks for example) - struct clockinfo - { - u_long cl_flags; /* operation flags (io modes) */ - PARSE_F_NOPOLLONLY always do async io - read whenever input comes - PARSE_F_POLLONLY never do async io - only read when expecting data - PARSE_F_PPSPPS use loopfilter PPS code (CIOGETEV) - PARSE_F_PPSONSECOND PPS pulses are on second - usually flags stay 0 as they are used only for special setups - - void (*cl_poll)(); /* active poll routine */ - The routine to call when the clock needs data sent to it in order to - get a time code from the clock (e.g. Trimble clock) - int (*cl_init)(); /* active poll init routine */ - The routine to call for very special initializations. - void (*cl_end)(); /* active poll end routine */ - The routine to call to undo any special initialisation (free memory/timers) - void *cl_data; /* local data area for "poll" mechanism */ - local data for polling routines - u_fp cl_rootdelay; /* rootdelay */ - NTP rottdelay estimate (usually 0) - u_long cl_basedelay; /* current offset - unsigned l_fp fractional par - time (fraction) by which the RS232 time code is delayed from the actual time. - t */ - u_long cl_ppsdelay; /* current PPS offset - unsigned l_fp fractional - time (fraction) by which the PPS time stamp is delayed (usually 0) - part */ - char *cl_id; /* ID code (usually "DCF") */ - Refclock id - (max 4 chars) - char *cl_description; /* device name */ - Name of this device. - char *cl_format; /* fixed format */ - If the data format cann not ne detected automatically this is the name - as in clk_*.c clockformat. - u_char cl_type; /* clock type (ntp control) */ - Type if clock as in clock status word (ntp control messages) - usually 0 - u_long cl_maxunsync; /* time to trust oscillator after loosing synch - */ - seconds a clock can be trusted after loosing synchronisation. - - u_long cl_cflag; /* terminal io flags */ - u_long cl_iflag; /* terminal io flags */ - u_long cl_oflag; /* terminal io flags */ - u_long cl_lflag; /* terminal io flags */ - termio*.h tty modes. - } clockinfo[] = { - ...,<other clocks>,... - { < your parameters> }, - }; - - -Well, this is very sketchy, i know. But I hope it helps a little bit. -The best way is to look which clock comes closest to your and tweak that -code. -Two sorts of clocks are used with parse. Clocks that automatically send -their time code (once a second) do not need entries in the poll routines because -they send the data all the time. The second sort are the clocks that need a -command sent to them in order to reply with a time code (like the Trimble -clock). - -For questions: kardel@informatik.uni-erlangen.de. Please include -an exact description on how your clock works. (initialisation, -TTY modes, strings to be sent to it, responses received from the clock). - -Frank Kardel diff --git a/usr.sbin/xntpd/parse/README.parse b/usr.sbin/xntpd/parse/README.parse deleted file mode 100644 index 660973af319a..000000000000 --- a/usr.sbin/xntpd/parse/README.parse +++ /dev/null @@ -1,142 +0,0 @@ -MINI INFO: -The following info pertains mainly to SunOS4.x in respect to installation. -Installation for SunOS5.x (Solaris 2.x) is very simple - just drop the parse -module into /kernel/strmod. -All others notes about the software structure refer to both environments. - -#ifdef ENGLISH -Installation of a Streams module requires knowledge in kernel generation -and possession of "superuser" rights. - -This directory contains the STREAMS module code for the supported DCF/GPS -receivers of the "parse" driver. -The dataformat should be easy to adept for other clocks. - -A suitable kernel module can be generated in two ways: - 1) loadable driver - 2) linking into the kernel - -Solution 1 has the advantage that the kernel module is present right at system startup, -while solution 2 avoids reconfigurating the kernel (except for VDDRV). - -Loadable Driver: (Kernel must be configured with VDDRV option like e.g. GENERIC) - make -f Makefile.kernel - -# make one module for each kernel architecture you intend to use this module for - - make -f Makefile.kernel mparsestreams.o -# use the above command for a version with increased time stamp precision -# (available only for sun4c and sun4m architectures (thanks Craig Leres) - -Integration into kernel (refer to the Manual for complete instructions) - Still possible, but not recommended - -if you run into trouble: time@informatik.uni-erlangen.de - -Porting to different clock formats: -The streams module is designed to be able to parse different time code -packets. The parser is very simple and expects at least a start or end of packet -character. In order to be able to distinguish time code packets a list -of several start/end pairs and conversion routines can be defined in the -clockformats structure. Whenever a packet delimited by any start/end pair is -detected the conversion routines are called in a RR fashion for converting the -time code into a clocktime structure. A return code of CVT_OK indicates a -correct conversion. -(This routine will be called first on the next conversion attempt). CVT_FAIL -indicates the the packet format was detected, but the actual conversion failed -(e.g. illegal time codes). A CVT_NONE indicates that this conversion routine -did not recognize the packet format. -See the simpleformat conversion routines for Meinberg clocks for examples. -It might be possible to parse other periodically sent time codes with a fixed -format with these simple conversion routines. -The parser can be found in parse/*.c - -The actual STREAMS module is parsestreams.c. It contains some fudge factors. -These are needed if a PPS hardware signal is sampled via the serial CD input. -There are some emperically determined valued for sun4c type machine in there. -Measurements have shown, that for full precision these values have to be -determined in the actual environment, as line lengths and capacities DO matter. -So for absolute precision you need a good oscilloscope and the license for -hardware work. -WARNING: DO NOT ATTEMPT TO MEASURE IF YOU ARE NOT ABSOLUTELY CERTAIN WHAT YOU -ARE DOING. - -This instructions are distributed in the hope that they will be -useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -I will not be in any case responsible for any damage cause by this -Software/Instruction. - -USE AT YOUR OWN RISK. - -#else - -Die folgenden Hinweise zur Uebersetzung und Installation besiehen sich auf -SunOS 4.x (Solaris1.x). Die Installation auf SunOS5.x (Solaris 2.x) gestaltet -sich erheblich einfacher. Man muss nur die Daten "parse" in dem Verzeichnis -/kernel/strmod ablegen. -Alle anderen Hinweise zur Softwarestruktur sind fuer beide Umgebungen gueltig. - -Installation eines STREAMS Moduls setzt Kenntnisse in der Kerngenerierung -und "Superuser"-Rechte vorraus. - -Dieses Inhaltsverzeichnis enthaelt das aktuelle Streams Modul fuer Sun. - -Man kann dieses Modul auf zwei Weisen in den Kern integrieren: - 1) direkt durch Einbinden (neuer Kern) - 2) als ladbarer Treiber - -Loesung 1 hat den Vorteil, dass das Modul gleich nach Systemstart zur -Verfuegung steht. -Loesung 2 besticht dadurch, das man das Modul nachtraeglich laden und -auch debuggen kann, ohne einen neuen Kern zu booten. - -Fuer ein ladbares Modul muss der Kern mit der VDDRV option konfiguriert sein und das -parsestreams.c muss mit -DVDDRV uebersetzt werden. - -Uebersetzung fuer ladbaren Treiber (Kern muss mit VDDRV konfiguriert sein): - make -f Makefile.kernel - bitte einmal fuer jede Kernelarchitektur, fuer die dieses Modul - benoetigt wird durchfuehren. - - make -f Makefile.kernel mparsestreams.o - Das obige make erstellt eine Version, die die Rechneruhr besser - als SunOS abliest. Nur fur sun4c und sun4m Architekturen verfuegbar - -Uebersetzung als .o Modul oder vorherige Einbindung in die Kernbauumgebung: - Immer noch moeglich, wird aber nicht mehr empfohlen. - -Anpassung an andere Datenformate: -Das Streamsmodul ist in der Lage verschiedene Datenformate zu erkennen und -umzusetzen. Der Parser ist einfach gehalten und kann Datenpakete anhand von -Start und Endekennzeichen unterscheiden. Jedes so erkannte Paket wird einer -Liste von Konvertierroutinen vorgelegt (clockformats Struktur). Die -Konvertierroutinen koennen mit drei verschiedenen Rueckgabewerten angeben, -wie die Konvertierung verlaufen ist. CVT_OK heisst, dass die Konvertierung -in die clocktime Struktur erfolgreich verlaufen ist. Beim naechsten -Umsetzungsversuch wird diese Routine als erstes wieder befragt werden -(Optimierung). CVT_FAIL bedeutet, dass zwar das Format erkannt wurde, aber -die eigentliche Konvertierung fehlgeschlagen ist (z. B. illegale Feldwerte). -CVT_NONE heisst, dass das Format dieser Konvertierroutine nicht erkannt wurde. -Die simpleformat Routinen fuer Meinberg Uhren koennen als Vorlage fuer eigene -Anpassungen an Uhren mit periodischem Zeittelegramm und festem Format genommen werden. -Der Parser ist in parse/*.c zu finden. - -Das eigentliche STREAMSmodul ist parsestreams.c. Es enthaelt einige -Korrekturfaktoren, die beim Einsatz von Hardware-PPS Signalen benoetigt werden. -Einige empirische Werte fuer sun4c Maschinen sind schon vorgegeben. Bei exterm -hohen Genauigkeitsanforderungen muessen diese Werte aber in der aktuellen -Installation NEU ermittelt werden, weil die Zeiten unter anderem von -Leitunglaengen der PPS Leitung abhaengen. Wenn Sie diese Abstimmung -durchfuehren, benoetigen Sie ein gutes Oszilloskop und die Lizenz fuer -Hardwarearbeiten. - -ACHTUNG: VERSUCHEN SIE NICHT DIESE MESSUNGEN ZU MACHEN, WENN IHNEN DIE -VORAUSSETZUNGEN DAFUER FEHLEN ! - -WIR GEBEN KEINE GARANTIEN - -Bei Schwierigkeiten email an: time@informatik.uni-erlangen.de - -#endif diff --git a/usr.sbin/xntpd/parse/README.parse_clocks b/usr.sbin/xntpd/parse/README.parse_clocks deleted file mode 100644 index a3c5a80d2b74..000000000000 --- a/usr.sbin/xntpd/parse/README.parse_clocks +++ /dev/null @@ -1,264 +0,0 @@ -The parse driver currently supports several clocks with different -query mechanisms. In order for you to find a sample that might be -similar to a clock you might want to integrate into parse i'll sum -up the major features of the clocks (this information is distributed -in the parse/clk_*.c and xntpd/refclock_parse.c files). - ---- - Meinberg: 127.127.8. 0- 3 (PZF535TCXO) - 127.127.8. 4- 7 (PZF535OCXO) - 127.127.8. 8-11 (DCFUA31) - 127.127.8.28-31 (GPS166) - Meinberg: start=<STX>, end=<ETX>, sync on start - pattern="\2D: . . ;T: ;U: . . ; \3" - pattern="\2 . . ; ; : : ; \3" - pattern="\2 . . ; ; : : ; : ; ; . . " - - Meinberg is a german manufacturer of time code receivers. Those clocks - have a pretty common output format in the stock version. In order to - support NTP Meinberg was so kind to produce some special versions of - the firmware for the use with NTP. So, if you are going to use a - Meinberg clock please ask whether there is a special Uni Erlangen - version. - - General characteristics: - Meinberg clocks primarily output pulse per second and a describing - ASCII string. This string can be produced in two modes. either upon - the reception of a question mark or every second. NTP uses the latter - mechanism. The DCF77 variants have a pretty good relationship between - RS232 time code and the PPS signal while the GPS receiver has no fixed - timeing between the datagram and the pulse (you need to use PPS with - GPS!) on DCF77 you might get away without the PPS signal. - - The preferred tty setting for Meinberg is: - CFLAG (B9600|CS7|PARENB|CREAD|HUPCL) - IFLAG (IGNBRK|IGNPAR|ISTRIP) - OFLAG 0 - LFLAG 0 - - The clock is run at datagram once per second. - Stock dataformat is: - - <STX>D:<dd>.<mm>.<yy>;T:<w>;U:<hh>:<mm>:<ss>;<S><F><D><A><ETX> - pos: 0 00 00 0 00 0 11 111 1 111 12 2 22 2 22 2 2 2 3 3 3 - 1 23 45 6 78 9 01 234 5 678 90 1 23 4 56 7 8 9 0 1 2 - - <STX> = '\002' ASCII start of text - <ETX> = '\003' ASCII end of text - <dd>,<mm>,<yy> = day, month, year(2 digits!!) - <w> = day of week (sunday= 0) - <hh>,<mm>,<ss> = hour, minute, second - <S> = '#' if never synced since powerup else ' ' for DCF U/A 31 - '#' if not PZF sychronisation available else ' ' for PZF 535 - <F> = '*' if time comes from internal quartz else ' ' - <D> = 'S' if daylight saving time is active else ' ' - <A> = '!' during the hour preceeding an daylight saving time - start/end change - - For the university of Erlangen a special format was implemented to support - LEAP announcement and anouncement of alternate antenna. - - Version for UNI-ERLANGEN Software is: PZFUERL V4.6 (Meinberg) - - The use of this software release (or higher) is *ABSOLUTELY* - recommended (ask for PZFUERL version as some minor HW fixes have - been introduced) due to the LEAP second support and UTC indication. - The standard timecode does not indicate when the timecode is in - UTC (by front panel configuration) thus we have no chance to find - the correct utc offset. For the standard format do not ever use - UTC display as this is not detectable in the time code !!! - - <STX><dd>.<mm>.<yy>; <w>; <hh>:<mm>:<ss>; <U><S><F><D><A><L><R><ETX> - pos: 0 00 0 00 0 00 11 1 11 11 1 11 2 22 22 2 2 2 2 2 3 3 3 - 1 23 4 56 7 89 01 2 34 56 7 89 0 12 34 5 6 7 8 9 0 1 2 - <STX> = '\002' ASCII start of text - <ETX> = '\003' ASCII end of text - <dd>,<mm>,<yy> = day, month, year(2 digits!!) - <w> = day of week (sunday= 0) - <hh>,<mm>,<ss> = hour, minute, second - <U> = 'U' UTC time display - <S> = '#' if never synced since powerup else ' ' for DCF U/A 31 - '#' if not PZF sychronisation available else ' ' for PZF 535 - <F> = '*' if time comes from internal quartz else ' ' - <D> = 'S' if daylight saving time is active else ' ' - <A> = '!' during the hour preceeding an daylight saving time - start/end change - <L> = 'A' LEAP second announcement - <R> = 'R' alternate antenna - - Meinberg GPS166 receiver - - You must get the Uni-Erlangen firmware for the GPS receiver support - to work to full satisfaction ! - - <STX><dd>.<mm>.<yy>; <w>; <hh>:<mm>:<ss>; <+/-><00:00>; <U><S><F><D><A><L><R><L>; <position...><ETX> - * - 000000000111111111122222222223333333333444444444455555555556666666 - 123456789012345678901234567890123456789012345678901234567890123456 - \x0209.07.93; 5; 08:48:26; +00:00; ; 49.5736N 11.0280E 373m\x03 - * - - <STX> = '\002' ASCII start of text - <ETX> = '\003' ASCII end of text - <dd>,<mm>,<yy> = day, month, year(2 digits!!) - <w> = day of week (sunday= 0) - <hh>,<mm>,<ss> = hour, minute, second - <+/->,<00:00> = offset to UTC - <S> = '#' if never synced since powerup else ' ' for DCF U/A 31 - '#' if not PZF sychronisation available else ' ' for PZF 535 - <U> = 'U' UTC time display - <F> = '*' if time comes from internal quartz else ' ' - <D> = 'S' if daylight saving time is active else ' ' - <A> = '!' during the hour preceeding an daylight saving time - start/end change - <L> = 'A' LEAP second announcement - <R> = 'R' alternate antenna (reminiscent of PZF535) usually ' ' - <L> = 'L' on 23:59:60 - - - For the Meinberg parse look into clock_meinberg.c - ---- - RAWDCF: 127.127.8.20-23 (Conrad receiver module - delay 258ms) - 127.127.8.24-27 (FAU receiver - delay 210ms) - 127.127.8.40-43 (Boeder receiver - delay 258ms) - RAWDCF: end=TIMEOUT>1.5s, sync each char (any char), generate psuedo time - codes, fixed format - - direct DCF77 code input - In Europe it is relatively easy/cheap the receive the german time code - transmitter DCF77. The simplest version to process its signal is to - feed the 100/200ms pulse of the demodulated AM signal via a level - converter to an RS232 port at 50Baud. parse/clk_rawdcf.c holds all - necessary decoding logic for the time code which is transmitted each - minute for one minute. A bit of the time code is sent once a second. - - The preferred tty setting is: - CFLAG (B50|CS8|CREAD|CLOCAL) - IFLAG 0 - OFLAG 0 - LFLAG 0 - - DCF77 raw time code - - From "Zur Zeit", Physikalisch-Technische Bundesanstalt (PTB), Braunschweig - und Berlin, Maerz 1989 - - Timecode transmission: - AM: - time marks are send every second except for the second before the - next minute mark - time marks consist of a reduction of transmitter power to 25% - of the nominal level - the falling edge is the time indication (on time) - time marks of a 100ms duration constitute a logical 0 - time marks of a 200ms duration constitute a logical 1 - FM: - see the spec. (basically a (non-)inverted psuedo random phase shift) - - Encoding: - Second Contents - 0 - 10 AM: free, FM: 0 - 11 - 14 free - 15 R - alternate antenna - 16 A1 - expect zone change (1 hour before) - 17 - 18 Z1,Z2 - time zone - 0 0 illegal - 0 1 MEZ (MET) - 1 0 MESZ (MED, MET DST) - 1 1 illegal - 19 A2 - expect leap insertion/deletion (1 hour before) - 20 S - start of time code (1) - 21 - 24 M1 - BCD (lsb first) Minutes - 25 - 27 M10 - BCD (lsb first) 10 Minutes - 28 P1 - Minute Parity (even) - 29 - 32 H1 - BCD (lsb first) Hours - 33 - 34 H10 - BCD (lsb first) 10 Hours - 35 P2 - Hour Parity (even) - 36 - 39 D1 - BCD (lsb first) Days - 40 - 41 D10 - BCD (lsb first) 10 Days - 42 - 44 DW - BCD (lsb first) day of week (1: Monday -> 7: Sunday) - 45 - 49 MO - BCD (lsb first) Month - 50 MO0 - 10 Months - 51 - 53 Y1 - BCD (lsb first) Years - 54 - 57 Y10 - BCD (lsb first) 10 Years - 58 P3 - Date Parity (even) - 59 - usually missing (minute indication), except for leap insertion - ---- - Schmid clock: 127.127.8.16-19 - Schmid clock: needs poll, binary input, end='\xFC', sync start - - The Schmid clock is a DCF77 receiver that sends a binary - time code at the reception of a flag byte. The contents - if the flag byte determined the time code format. The - binary time code is delimited by the byte 0xFC. - - TTY setup is: - CFLAG (B1200|CS8|CREAD|CLOCAL) - IFLAG 0 - OFLAG 0 - LFLAG 0 - - The command to Schmid's DCF77 clock is a single byte; each bit - allows the user to select some part of the time string, as follows (the - output for the lsb is sent first). - - Bit 0: time in MEZ, 4 bytes *binary, not BCD*; hh.mm.ss.tenths - Bit 1: date 3 bytes *binary, not BCD: dd.mm.yy - Bit 2: week day, 1 byte (unused here) - Bit 3: time zone, 1 byte, 0=MET, 1=MEST. (unused here) - Bit 4: clock status, 1 byte, 0=time invalid, - 1=time from crystal backup, - 3=time from DCF77 - Bit 5: transmitter status, 1 byte, - bit 0: backup antenna - bit 1: time zone change within 1h - bit 3,2: TZ 01=MEST, 10=MET - bit 4: leap second will be - added within one hour - bits 5-7: Zero - Bit 6: time in backup mode, units of 5 minutes (unused here) - - ---- - Trimble SV6: 127.127.8.32-35 - Trimble SV6: needs poll, ascii timecode, start='>', end='<', - query='>QTM<', eol='<' - - Trimble SV6 is a GPS receiver with PPS output. It needs to be polled. - It also need a special tty mode setup (EOL='<'). - - TTY setup is: - CFLAG (B4800|CS8|CREAD) - IFLAG (BRKINT|IGNPAR|ISTRIP|ICRNL|IXON) - OFLAG (OPOST|ONLCR) - LFLAG (ICANON|ECHOK) - - Special flags are: - PARSE_F_PPSPPS - use CIOGETEV for PPS time stamping - PARSE_F_PPSONSECOND - the time code is not related to - the PPS pulse (so use the time code - only for the second epoch) - - Timecode - 0000000000111111111122222222223333333 / char - 0123456789012345678901234567890123456 \ posn - >RTMhhmmssdddDDMMYYYYoodnnvrrrrr;*xx< Actual - ----33445566600112222BB7__-_____--99- Parse - >RTM 1 ;* <", Check - ---- - ELV DCF7000: 127.127.8.12-15 - ELV DCF7000: end='\r', pattern=" - - - - - - - \r" - - The ELV DCF7000 is a cheap DCF77 receiver sending each second - a time code (though not very precise!) delimited by '`r' - - Timecode - YY-MM-DD-HH-MM-SS-FF\r - - FF&0x1 - DST - FF&0x2 - DST switch warning - FF&0x4 - unsynchronised - diff --git a/usr.sbin/xntpd/parse/clk_dcf7000.c b/usr.sbin/xntpd/parse/clk_dcf7000.c deleted file mode 100644 index 82e791578a33..000000000000 --- a/usr.sbin/xntpd/parse/clk_dcf7000.c +++ /dev/null @@ -1,150 +0,0 @@ -#if defined(REFCLOCK) && (defined(PARSE) || defined(PARSEPPS)) && defined(CLOCK_DCF7000) -/* - * /src/NTP/REPOSITORY/v3/parse/clk_dcf7000.c,v 3.12 1994/05/30 10:19:57 kardel Exp - * - * clk_dcf7000.c,v 3.12 1994/05/30 10:19:57 kardel Exp - * - * ELV DCF7000 module - * - * Copyright (c) 1992,1993,1994 - * Frank Kardel Friedrich-Alexander Universitaet Erlangen-Nuernberg - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#include "sys/types.h" -#include "sys/time.h" -#include "sys/errno.h" -#include "ntp_fp.h" -#include "ntp_unixtime.h" -#include "ntp_calendar.h" - -#include "parse.h" - -static struct format dcf7000_fmt = -{ /* ELV DCF7000 */ - { - { 6, 2}, { 3, 2}, { 0, 2}, - { 12, 2}, { 15, 2}, { 18, 2}, - { 9, 2}, { 21, 2}, - }, - " - - - - - - - \r", - 0 -}; - -static u_long cvt_dcf7000(); - -clockformat_t clock_dcf7000 = -{ - (unsigned LONG (*)())0, /* no input handling */ - cvt_dcf7000, /* ELV DCF77 conversion */ - syn_simple, /* easy time stamps */ - (u_long (*)())0, /* no direct PPS monitoring */ - (u_long (*)())0, /* no time code synthesizer monitoring */ - (void *)&dcf7000_fmt, /* conversion configuration */ - "ELV DCF7000", /* ELV clock */ - 24, /* string buffer */ - F_END|SYNC_END, /* END packet delimiter / synchronisation */ - 0, /* no private data (complete pakets) */ - { 0, 0}, - '\0', - '\r', - '\0' -}; - -/* - * cvt_dcf7000 - * - * convert dcf7000 type format - */ -static u_long -cvt_dcf7000(buffer, size, format, clock) - register char *buffer; - register int size; - register struct format *format; - register clocktime_t *clock; -{ - if (!Strok(buffer, format->fixed_string)) - { - return CVT_NONE; - } - else - { - if (Stoi(&buffer[format->field_offsets[O_DAY].offset], &clock->day, - format->field_offsets[O_DAY].length) || - Stoi(&buffer[format->field_offsets[O_MONTH].offset], &clock->month, - format->field_offsets[O_MONTH].length) || - Stoi(&buffer[format->field_offsets[O_YEAR].offset], &clock->year, - format->field_offsets[O_YEAR].length) || - Stoi(&buffer[format->field_offsets[O_HOUR].offset], &clock->hour, - format->field_offsets[O_HOUR].length) || - Stoi(&buffer[format->field_offsets[O_MIN].offset], &clock->minute, - format->field_offsets[O_MIN].length) || - Stoi(&buffer[format->field_offsets[O_SEC].offset], &clock->second, - format->field_offsets[O_SEC].length)) - { - return CVT_FAIL|CVT_BADFMT; - } - else - { - char *f = &buffer[format->field_offsets[O_FLAGS].offset]; - long flags; - - clock->flags = 0; - clock->usecond = 0; - - if (Stoi(f, &flags, format->field_offsets[O_FLAGS].length)) - { - return CVT_FAIL|CVT_BADFMT; - } - else - { - if (flags & 0x1) - clock->utcoffset = -2*60*60; - else - clock->utcoffset = -1*60*60; - - if (flags & 0x2) - clock->flags |= PARSEB_ANNOUNCE; - - if (flags & 0x4) - clock->flags |= PARSEB_NOSYNC; - } - return CVT_OK; - } - } -} -#endif /* defined(PARSE) && defined(CLOCK_DCF7000) */ - -/* - * History: - * - * clk_dcf7000.c,v - * Revision 3.12 1994/05/30 10:19:57 kardel - * LONG cleanup - * - * Revision 3.11 1994/02/02 17:45:14 kardel - * rcs ids fixed - * - * Revision 3.6 1993/10/09 15:01:27 kardel - * file structure unified - * - * Revision 3.5 1993/10/03 19:10:41 kardel - * restructured I/O handling - * - * Revision 3.4 1993/09/27 21:08:02 kardel - * utcoffset now in seconds - * - * Revision 3.3 1993/09/26 23:40:20 kardel - * new parse driver logic - * - * Revision 3.2 1993/07/09 11:37:15 kardel - * Initial restructured version + GPS support - * - * Revision 3.1 1993/07/06 10:00:14 kardel - * DCF77 driver goes generic... - * - */ diff --git a/usr.sbin/xntpd/parse/clk_meinberg.c b/usr.sbin/xntpd/parse/clk_meinberg.c deleted file mode 100644 index 10389cfce827..000000000000 --- a/usr.sbin/xntpd/parse/clk_meinberg.c +++ /dev/null @@ -1,473 +0,0 @@ -#if defined(REFCLOCK) && (defined(PARSE) || defined(PARSEPPS)) && defined(CLOCK_MEINBERG) -/* - * /src/NTP/REPOSITORY/v3/parse/clk_meinberg.c,v 3.15 1994/05/30 10:19:59 kardel Exp - * - * clk_meinberg.c,v 3.15 1994/05/30 10:19:59 kardel Exp - * - * Meinberg clock support - * - * Copyright (c) 1992,1993,1994 - * Frank Kardel Friedrich-Alexander Universitaet Erlangen-Nuernberg - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#include "sys/types.h" -#include "sys/time.h" -#include "sys/errno.h" -#include "ntp_fp.h" -#include "ntp_unixtime.h" -#include "ntp_calendar.h" - -#include "parse.h" - -/* - * The Meinberg receiver every second sends a datagram of the following form - * (Standard Format) - * - * <STX>D:<dd>.<mm>.<yy>;T:<w>;U:<hh>:<mm>:<ss>;<S><F><D><A><ETX> - * pos: 0 00 00 0 00 0 11 111 1 111 12 2 22 2 22 2 2 2 3 3 3 - * 1 23 45 6 78 9 01 234 5 678 90 1 23 4 56 7 8 9 0 1 2 - * <STX> = '\002' ASCII start of text - * <ETX> = '\003' ASCII end of text - * <dd>,<mm>,<yy> = day, month, year(2 digits!!) - * <w> = day of week (sunday= 0) - * <hh>,<mm>,<ss> = hour, minute, second - * <S> = '#' if never synced since powerup else ' ' for DCF U/A 31 - * '#' if not PZF sychronisation available else ' ' for PZF 535 - * <F> = '*' if time comes from internal quartz else ' ' - * <D> = 'S' if daylight saving time is active else ' ' - * <A> = '!' during the hour preceeding an daylight saving time - * start/end change - * - * For the university of Erlangen a special format was implemented to support - * LEAP announcement and anouncement of alternate antenna. - * - * Version for UNI-ERLANGEN Software is: PZFUERL V4.6 (Meinberg) - * - * The use of this software release (or higher) is *ABSOLUTELY* - * recommended (ask for PZFUERL version as some minor HW fixes have - * been introduced) due to the LEAP second support and UTC indication. - * The standard timecode does not indicate when the timecode is in - * UTC (by front panel configuration) thus we have no chance to find - * the correct utc offset. For the standard format do not ever use - * UTC display as this is not detectable in the time code !!! - * - * <STX><dd>.<mm>.<yy>; <w>; <hh>:<mm>:<ss>; <U><S><F><D><A><L><R><ETX> - * pos: 0 00 0 00 0 00 11 1 11 11 1 11 2 22 22 2 2 2 2 2 3 3 3 - * 1 23 4 56 7 89 01 2 34 56 7 89 0 12 34 5 6 7 8 9 0 1 2 - * <STX> = '\002' ASCII start of text - * <ETX> = '\003' ASCII end of text - * <dd>,<mm>,<yy> = day, month, year(2 digits!!) - * <w> = day of week (sunday= 0) - * <hh>,<mm>,<ss> = hour, minute, second - * <U> = 'U' UTC time display - * <S> = '#' if never synced since powerup else ' ' for DCF U/A 31 - * '#' if not PZF sychronisation available else ' ' for PZF 535 - * <F> = '*' if time comes from internal quartz else ' ' - * <D> = 'S' if daylight saving time is active else ' ' - * <A> = '!' during the hour preceeding an daylight saving time - * start/end change - * <L> = 'A' LEAP second announcement - * <R> = 'R' alternate antenna - * - * Meinberg GPS166 receiver - * - * You must get the Uni-Erlangen firmware for the GPS receiver support - * to work to full satisfaction ! - * - * <STX><dd>.<mm>.<yy>; <w>; <hh>:<mm>:<ss>; <+/-><00:00>; <U><S><F><D><A><L><R><L>; <position...><ETX> - * - * 000000000111111111122222222223333333333444444444455555555556666666 - * 123456789012345678901234567890123456789012345678901234567890123456 - * \x0209.07.93; 5; 08:48:26; +00:00; ; 49.5736N 11.0280E 373m\x03 - * - * - * <STX> = '\002' ASCII start of text - * <ETX> = '\003' ASCII end of text - * <dd>,<mm>,<yy> = day, month, year(2 digits!!) - * <w> = day of week (sunday= 0) - * <hh>,<mm>,<ss> = hour, minute, second - * <+/->,<00:00> = offset to UTC - * <S> = '#' if never synced since powerup else ' ' for DCF U/A 31 - * '#' if not PZF sychronisation available else ' ' for PZF 535 - * <U> = 'U' UTC time display - * <F> = '*' if time comes from internal quartz else ' ' - * <D> = 'S' if daylight saving time is active else ' ' - * <A> = '!' during the hour preceeding an daylight saving time - * start/end change - * <L> = 'A' LEAP second announcement - * <R> = 'R' alternate antenna (reminiscent of PZF535) usually ' ' - * <L> = 'L' on 23:59:60 - */ - -static struct format meinberg_fmt[] = -{ - { - { - { 3, 2}, { 6, 2}, { 9, 2}, - { 18, 2}, { 21, 2}, { 24, 2}, - { 14, 1}, { 27, 4}, { 29, 1}, - }, - "\2D: . . ;T: ;U: . . ; \3", - 0 - }, - { /* special extended FAU Erlangen extended format */ - { - { 1, 2}, { 4, 2}, { 7, 2}, - { 14, 2}, { 17, 2}, { 20, 2}, - { 11, 1}, { 25, 4}, { 27, 1}, - }, - "\2 . . ; ; : : ; \3", - MBG_EXTENDED - }, - { /* special extended FAU Erlangen GPS format */ - { - { 1, 2}, { 4, 2}, { 7, 2}, - { 14, 2}, { 17, 2}, { 20, 2}, - { 11, 1}, { 32, 8}, { 35, 1}, - { 25, 2}, { 28, 2}, { 24, 1} - }, - "\2 . . ; ; : : ; : ; ; . . ", - 0 - } -}; - -static u_long cvt_meinberg(); -static u_long cvt_mgps(); - -clockformat_t clock_meinberg[] = -{ - { - (unsigned LONG (*)())0, /* no input handling */ - cvt_meinberg, /* Meinberg conversion */ - syn_simple, /* easy time stamps for RS232 (fallback) */ - pps_simple, /* easy PPS monitoring */ - (u_long (*)())0, /* no time code synthesizer monitoring */ - (void *)&meinberg_fmt[0], /* conversion configuration */ - "Meinberg Standard", /* Meinberg simple format - beware */ - 32, /* string buffer */ - F_START|F_END|SYNC_START|SYNC_ONE, /* paket START/END delimiter, START synchronisation, PPS ONE sampling */ - 0, /* no private data (complete pakets) */ - { 0, 0}, - '\2', - '\3', - '\0' - }, - { - (unsigned LONG (*)())0, /* no input handling */ - cvt_meinberg, /* Meinberg conversion */ - syn_simple, /* easy time stamps for RS232 (fallback) */ - pps_simple, /* easy PPS monitoring */ - (u_long (*)())0, /* no time code synthesizer monitoring */ - (void *)&meinberg_fmt[1], /* conversion configuration */ - "Meinberg Extended", /* Meinberg enhanced format */ - 32, /* string buffer */ - F_START|F_END|SYNC_START|SYNC_ONE, /* paket START/END delimiter, START synchronisation, PPS ONE sampling */ - 0, /* no private data (complete pakets) */ - { 0, 0}, - '\2', - '\3', - '\0' - }, - { - (unsigned LONG (*)())0, /* no input handling */ - cvt_mgps, /* Meinberg GPS166 conversion */ - syn_simple, /* easy time stamps for RS232 (fallback) */ - pps_simple, /* easy PPS monitoring */ - (u_long (*)())0, /* no time code synthesizer monitoring */ - (void *)&meinberg_fmt[2], /* conversion configuration */ - "Meinberg GPS Extended", /* Meinberg FAU GPS format */ - 70, /* string buffer */ - F_START|F_END|SYNC_START|SYNC_ONE, /* paket START/END delimiter, START synchronisation, PPS ONE sampling */ - 0, /* no private data (complete pakets) */ - { 0, 0}, - '\2', - '\3', - '\0' - } -}; - -/* - * cvt_meinberg - * - * convert simple type format - */ -static u_long -cvt_meinberg(buffer, size, format, clock) - register char *buffer; - register int size; - register struct format *format; - register clocktime_t *clock; -{ - if (!Strok(buffer, format->fixed_string)) - { - return CVT_NONE; - } - else - { - if (Stoi(&buffer[format->field_offsets[O_DAY].offset], &clock->day, - format->field_offsets[O_DAY].length) || - Stoi(&buffer[format->field_offsets[O_MONTH].offset], &clock->month, - format->field_offsets[O_MONTH].length) || - Stoi(&buffer[format->field_offsets[O_YEAR].offset], &clock->year, - format->field_offsets[O_YEAR].length) || - Stoi(&buffer[format->field_offsets[O_HOUR].offset], &clock->hour, - format->field_offsets[O_HOUR].length) || - Stoi(&buffer[format->field_offsets[O_MIN].offset], &clock->minute, - format->field_offsets[O_MIN].length) || - Stoi(&buffer[format->field_offsets[O_SEC].offset], &clock->second, - format->field_offsets[O_SEC].length)) - { - return CVT_FAIL|CVT_BADFMT; - } - else - { - char *f = &buffer[format->field_offsets[O_FLAGS].offset]; - - clock->flags = 0; - clock->usecond = 0; - - /* - * in the extended timecode format we have also the - * indication that the timecode is in UTC - * for compatibilty reasons we start at the USUAL - * offset (POWERUP flag) and know that the UTC indication - * is the character before the powerup flag - */ - if ((format->flags & MBG_EXTENDED) && (f[-1] == 'U')) - { - /* - * timecode is in UTC - */ - clock->utcoffset = 0; /* UTC */ - clock->flags |= PARSEB_UTC; - } - else - { - /* - * only calculate UTC offset if MET/MED is in time code - * or we have the old time code format, where we do not - * know whether it is UTC time or MET/MED - * pray that nobody switches to UTC in the standard time code - * ROMS !!!! - */ - switch (buffer[format->field_offsets[O_ZONE].offset]) - { - case ' ': - clock->utcoffset = -1*60*60; /* MET */ - break; - - case 'S': - clock->utcoffset = -2*60*60; /* MED */ - break; - - default: - return CVT_FAIL|CVT_BADFMT; - } - } - - /* - * gather status flags - */ - if (buffer[format->field_offsets[O_ZONE].offset] == 'S') - clock->flags |= PARSEB_DST; - - if (f[0] == '#') - clock->flags |= PARSEB_POWERUP; - - if (f[1] == '*') - clock->flags |= PARSEB_NOSYNC; - - if (f[3] == '!') - clock->flags |= PARSEB_ANNOUNCE; - - if (format->flags & MBG_EXTENDED) - { - clock->flags |= PARSEB_S_LEAP; - clock->flags |= PARSEB_S_ANTENNA; - - /* - * DCF77 does not encode the direction - - * so we take the current default - - * earth slowing down - */ - if (f[4] == 'A') - clock->flags |= PARSEB_LEAPADD; - - if (f[5] == 'R') - clock->flags |= PARSEB_ALTERNATE; - } - return CVT_OK; - } - } -} - -/* - * cvt_mgps - * - * convert Meinberg GPS format - */ -static u_long -cvt_mgps(buffer, size, format, clock) - register char *buffer; - register int size; - register struct format *format; - register clocktime_t *clock; -{ - if (!Strok(buffer, format->fixed_string)) - { - return CVT_NONE; - } - else - { - if (Stoi(&buffer[format->field_offsets[O_DAY].offset], &clock->day, - format->field_offsets[O_DAY].length) || - Stoi(&buffer[format->field_offsets[O_MONTH].offset], &clock->month, - format->field_offsets[O_MONTH].length) || - Stoi(&buffer[format->field_offsets[O_YEAR].offset], &clock->year, - format->field_offsets[O_YEAR].length) || - Stoi(&buffer[format->field_offsets[O_HOUR].offset], &clock->hour, - format->field_offsets[O_HOUR].length) || - Stoi(&buffer[format->field_offsets[O_MIN].offset], &clock->minute, - format->field_offsets[O_MIN].length) || - Stoi(&buffer[format->field_offsets[O_SEC].offset], &clock->second, - format->field_offsets[O_SEC].length)) - { - return CVT_FAIL|CVT_BADFMT; - } - else - { - long h; - char *f = &buffer[format->field_offsets[O_FLAGS].offset]; - - clock->flags = PARSEB_S_LEAP|PARSEB_S_POSITION; - - clock->usecond = 0; - - /* - * calculate UTC offset - */ - if (Stoi(&buffer[format->field_offsets[O_UTCHOFFSET].offset], &h, - format->field_offsets[O_UTCHOFFSET].length)) - { - return CVT_FAIL|CVT_BADFMT; - } - else - { - if (Stoi(&buffer[format->field_offsets[O_UTCMOFFSET].offset], &clock->utcoffset, - format->field_offsets[O_UTCMOFFSET].length)) - { - return CVT_FAIL|CVT_BADFMT; - } - - clock->utcoffset += TIMES60(h); - - if (buffer[format->field_offsets[O_UTCSOFFSET].offset] != '-') - { - clock->utcoffset = -clock->utcoffset; - } - } - - /* - * gather status flags - */ - if (buffer[format->field_offsets[O_ZONE].offset] == 'S') - clock->flags |= PARSEB_DST; - - if ((f[0] == 'U') || - (clock->utcoffset == 0)) - clock->flags |= PARSEB_UTC; - - /* - * no sv's seen - no time & position - */ - if (f[1] == '#') - clock->flags |= PARSEB_POWERUP; - - /* - * at least one sv seen - time (for last position) - */ - if (f[2] == '*') - clock->flags |= PARSEB_NOSYNC; - else - if (!(clock->flags & PARSEB_POWERUP)) - clock->flags |= PARSEB_POSITION; - - /* - * oncoming zone switch - */ - if (f[4] == '!') - clock->flags |= PARSEB_ANNOUNCE; - - /* - * oncoming leap second - * data format does not (yet) specify whether - * to add or to delete a second - thus we - * pick the current default - */ - if (f[5] == 'A') - clock->flags |= PARSEB_LEAPADD; - - /* - * this is the leap second - */ - if (f[7] == 'L') - clock->flags |= PARSEB_LEAPSECOND; - - return CVT_OK; - } - } -} -#endif /* defined(PARSE) && defined(CLOCK_MEINBERG) */ - -/* - * History: - * - * clk_meinberg.c,v - * Revision 3.15 1994/05/30 10:19:59 kardel - * LONG cleanup - * - * Revision 3.14 1994/02/20 13:04:37 kardel - * parse add/delete second support - * - * Revision 3.13 1994/02/02 17:45:21 kardel - * rcs ids fixed - * - * Revision 3.11 1994/01/25 19:05:10 kardel - * 94/01/23 reconcilation - * - * Revision 3.10 1994/01/23 17:21:54 kardel - * 1994 reconcilation - * - * Revision 3.9 1993/10/30 09:44:38 kardel - * conditional compilation flag cleanup - * - * Revision 3.8 1993/10/22 14:27:48 kardel - * Oct. 22nd 1993 reconcilation - * - * Revision 3.7 1993/10/09 15:01:30 kardel - * file structure unified - * - * Revision 3.6 1993/10/03 19:10:43 kardel - * restructured I/O handling - * - * Revision 3.5 1993/09/27 21:08:04 kardel - * utcoffset now in seconds - * - * Revision 3.4 1993/09/26 23:40:22 kardel - * new parse driver logic - * - * Revision 3.3 1993/08/18 09:29:32 kardel - * GPS format is somewhat variable length - variable length part holds position - * - * Revision 3.2 1993/07/09 11:37:16 kardel - * Initial restructured version + GPS support - * - * Revision 3.1 1993/07/06 10:00:17 kardel - * DCF77 driver goes generic... - * - */ diff --git a/usr.sbin/xntpd/parse/clk_rawdcf.c b/usr.sbin/xntpd/parse/clk_rawdcf.c deleted file mode 100644 index 042e5d35e551..000000000000 --- a/usr.sbin/xntpd/parse/clk_rawdcf.c +++ /dev/null @@ -1,580 +0,0 @@ -#if defined(REFCLOCK) && (defined(PARSE) || defined(PARSEPPS)) && defined(CLOCK_RAWDCF) -/* - * /src/NTP/REPOSITORY/v3/parse/clk_rawdcf.c,v 3.16 1994/05/31 20:02:40 kardel Exp - * - * clk_rawdcf.c,v 3.16 1994/05/31 20:02:40 kardel Exp - * - * Raw DCF77 pulse clock support - * - * Copyright (c) 1992,1993,1994 - * Frank Kardel Friedrich-Alexander Universitaet Erlangen-Nuernberg - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#include "sys/types.h" -#include "sys/time.h" -#include "sys/errno.h" -#include "ntp_fp.h" -#include "ntp_unixtime.h" -#include "ntp_calendar.h" - -#include "parse.h" -#ifdef PARSESTREAM -#include "sys/parsestreams.h" -#endif - -#ifndef PARSEKERNEL -#include "ntp_stdlib.h" -#endif - -/* - * DCF77 raw time code - * - * From "Zur Zeit", Physikalisch-Technische Bundesanstalt (PTB), Braunschweig - * und Berlin, Maerz 1989 - * - * Timecode transmission: - * AM: - * time marks are send every second except for the second before the - * next minute mark - * time marks consist of a reduction of transmitter power to 25% - * of the nominal level - * the falling edge is the time indication (on time) - * time marks of a 100ms duration constitute a logical 0 - * time marks of a 200ms duration constitute a logical 1 - * FM: - * see the spec. (basically a (non-)inverted psuedo random phase shift) - * - * Encoding: - * Second Contents - * 0 - 10 AM: free, FM: 0 - * 11 - 14 free - * 15 R - alternate antenna - * 16 A1 - expect zone change (1 hour before) - * 17 - 18 Z1,Z2 - time zone - * 0 0 illegal - * 0 1 MEZ (MET) - * 1 0 MESZ (MED, MET DST) - * 1 1 illegal - * 19 A2 - expect leap insertion/deletion (1 hour before) - * 20 S - start of time code (1) - * 21 - 24 M1 - BCD (lsb first) Minutes - * 25 - 27 M10 - BCD (lsb first) 10 Minutes - * 28 P1 - Minute Parity (even) - * 29 - 32 H1 - BCD (lsb first) Hours - * 33 - 34 H10 - BCD (lsb first) 10 Hours - * 35 P2 - Hour Parity (even) - * 36 - 39 D1 - BCD (lsb first) Days - * 40 - 41 D10 - BCD (lsb first) 10 Days - * 42 - 44 DW - BCD (lsb first) day of week (1: Monday -> 7: Sunday) - * 45 - 49 MO - BCD (lsb first) Month - * 50 MO0 - 10 Months - * 51 - 53 Y1 - BCD (lsb first) Years - * 54 - 57 Y10 - BCD (lsb first) 10 Years - * 58 P3 - Date Parity (even) - * 59 - usually missing (minute indication), except for leap insertion - */ - -static u_long cvt_rawdcf(); -static u_long pps_rawdcf(); -static u_long snt_rawdcf(); - -clockformat_t clock_rawdcf = -{ - (unsigned LONG (*)())0, /* no input handling */ - cvt_rawdcf, /* raw dcf input conversion */ - (void (*)())0, /* no character bound synchronisation */ - pps_rawdcf, /* examining PPS information */ - snt_rawdcf, /* synthesize time code from input */ - (void *)0, /* buffer bit representation */ - "RAW DCF77 Timecode", /* direct decoding / time synthesis */ - 61, /* bit buffer */ - SYNC_ONE|SYNC_ZERO|SYNC_TIMEOUT|SYNC_SYNTHESIZE|CVT_FIXEDONLY, - /* catch all transitions, buffer restart on timeout, fixed configuration only */ - 0, /* no private data (currently in input buffer) */ - { 1, 500000}, /* restart after 1.5 seconds */ - '\0', - '\0', - '\0' -}; - -static struct dcfparam -{ - unsigned char onebits[60]; - unsigned char zerobits[60]; -} dcfparam = -{ - "###############RADMLS1248124P124812P1248121241248112481248P", /* 'ONE' representation */ - "--------------------s-------p------p----------------------p" /* 'ZERO' representation */ -}; - -static struct rawdcfcode -{ - char offset; /* start bit */ -} rawdcfcode[] = -{ - { 0 }, { 15 }, { 16 }, { 17 }, { 19 }, { 20 }, { 21 }, { 25 }, { 28 }, { 29 }, - { 33 }, { 35 }, { 36 }, { 40 }, { 42 }, { 45 }, { 49 }, { 50 }, { 54 }, { 58 }, { 59 } -}; - -#define DCF_M 0 -#define DCF_R 1 -#define DCF_A1 2 -#define DCF_Z 3 -#define DCF_A2 4 -#define DCF_S 5 -#define DCF_M1 6 -#define DCF_M10 7 -#define DCF_P1 8 -#define DCF_H1 9 -#define DCF_H10 10 -#define DCF_P2 11 -#define DCF_D1 12 -#define DCF_D10 13 -#define DCF_DW 14 -#define DCF_MO 15 -#define DCF_MO0 16 -#define DCF_Y1 17 -#define DCF_Y10 18 -#define DCF_P3 19 - -static struct partab -{ - char offset; /* start bit of parity field */ -} partab[] = -{ - { 21 }, { 29 }, { 36 }, { 59 } -}; - -#define DCF_P_P1 0 -#define DCF_P_P2 1 -#define DCF_P_P3 2 - -#define DCF_Z_MET 0x2 -#define DCF_Z_MED 0x1 - -static u_long ext_bf(buf, idx, zero) - register char *buf; - register int idx; - register char *zero; -{ - register u_long sum = 0; - register int i, first; - - first = rawdcfcode[idx].offset; - - for (i = rawdcfcode[idx+1].offset - 1; i >= first; i--) - { - sum <<= 1; - sum |= (buf[i] != zero[i]); - } - return sum; -} - -static unsigned pcheck(buf, idx, zero) - register char *buf; - register int idx; - register char *zero; -{ - register int i,last; - register unsigned psum = 1; - - last = partab[idx+1].offset; - - for (i = partab[idx].offset; i < last; i++) - psum ^= (buf[i] != zero[i]); - - return psum; -} - -static u_long convert_rawdcf(buffer, size, dcfparam, clock) - register unsigned char *buffer; - register int size; - register struct dcfparam *dcfparam; - register clocktime_t *clock; -{ - register unsigned char *s = buffer; - register unsigned char *b = dcfparam->onebits; - register unsigned char *c = dcfparam->zerobits; - register int i; - - parseprintf(DD_RAWDCF,("parse: convert_rawdcf: \"%s\"\n", buffer)); - - if (size < 57) - { -#ifdef PARSEKERNEL - printf("parse: convert_rawdcf: INCOMPLETE DATA - time code only has %d bits\n", size); -#else - syslog(LOG_ERR, "parse: convert_rawdcf: INCOMPLETE DATA - time code only has %d bits\n", size); -#endif - return CVT_NONE; - } - - for (i = 0; i < 58; i++) - { - if ((*s != *b) && (*s != *c)) - { - /* - * we only have two types of bytes (ones and zeros) - */ -#ifdef PARSEKERNEL - printf("parse: convert_rawdcf: BAD DATA - no conversion for \"%s\"\n", buffer); -#else - syslog(LOG_ERR, "parse: convert_rawdcf: BAD DATA - no conversion for \"%s\"\n", buffer); -#endif - return CVT_NONE; - } - b++; - c++; - s++; - } - - /* - * check Start and Parity bits - */ - if ((ext_bf(buffer, DCF_S, dcfparam->zerobits) == 1) && - pcheck(buffer, DCF_P_P1, dcfparam->zerobits) && - pcheck(buffer, DCF_P_P2, dcfparam->zerobits) && - pcheck(buffer, DCF_P_P3, dcfparam->zerobits)) - { - /* - * buffer OK - */ - parseprintf(DD_RAWDCF,("parse: convert_rawdcf: parity check passed\n")); - - clock->flags = PARSEB_S_ANTENNA|PARSEB_S_LEAP; - clock->utctime= 0; - clock->usecond= 0; - clock->second = 0; - clock->minute = ext_bf(buffer, DCF_M10, dcfparam->zerobits); - clock->minute = TIMES10(clock->minute) + ext_bf(buffer, DCF_M1, dcfparam->zerobits); - clock->hour = ext_bf(buffer, DCF_H10, dcfparam->zerobits); - clock->hour = TIMES10(clock->hour) + ext_bf(buffer, DCF_H1, dcfparam->zerobits); - clock->day = ext_bf(buffer, DCF_D10, dcfparam->zerobits); - clock->day = TIMES10(clock->day) + ext_bf(buffer, DCF_D1, dcfparam->zerobits); - clock->month = ext_bf(buffer, DCF_MO0, dcfparam->zerobits); - clock->month = TIMES10(clock->month) + ext_bf(buffer, DCF_MO, dcfparam->zerobits); - clock->year = ext_bf(buffer, DCF_Y10, dcfparam->zerobits); - clock->year = TIMES10(clock->year) + ext_bf(buffer, DCF_Y1, dcfparam->zerobits); - - switch (ext_bf(buffer, DCF_Z, dcfparam->zerobits)) - { - case DCF_Z_MET: - clock->utcoffset = -1*60*60; - break; - - case DCF_Z_MED: - clock->flags |= PARSEB_DST; - clock->utcoffset = -2*60*60; - break; - - default: - parseprintf(DD_RAWDCF,("parse: convert_rawdcf: BAD TIME ZONE\n")); - return CVT_FAIL|CVT_BADFMT; - } - - if (ext_bf(buffer, DCF_A1, dcfparam->zerobits)) - clock->flags |= PARSEB_ANNOUNCE; - - if (ext_bf(buffer, DCF_A2, dcfparam->zerobits)) - clock->flags |= PARSEB_LEAPADD; /* default: DCF77 data format deficiency */ - - if (ext_bf(buffer, DCF_R, dcfparam->zerobits)) - clock->flags |= PARSEB_ALTERNATE; - - parseprintf(DD_RAWDCF,("parse: convert_rawdcf: TIME CODE OK: %d:%d, %d.%d.%d, flags 0x%lx\n", - (int)clock->hour, (int)clock->minute, (int)clock->day, (int)clock->month,(int) clock->year, - (u_long)clock->flags)); - return CVT_OK; - } - else - { - /* - * bad format - not for us - */ -#ifdef PARSEKERNEL - printf("parse: convert_rawdcf: parity check FAILED for \"%s\"\n", buffer); -#else - syslog(LOG_ERR, "parse: convert_rawdcf: parity check FAILED for \"%s\"\n", buffer); -#endif - return CVT_FAIL|CVT_BADFMT; - } -} - -/* - * raw dcf input routine - needs to fix up 50 baud - * characters for 1/0 decision - */ -static u_long cvt_rawdcf(buffer, size, param, clock) - register unsigned char *buffer; - register int size; - register void *param; - register clocktime_t *clock; -{ - register unsigned char *s = buffer; - register unsigned char *e = buffer + size; - register unsigned char *b = dcfparam.onebits; - register unsigned char *c = dcfparam.zerobits; - register unsigned rtc = CVT_NONE; - register unsigned int i, lowmax, highmax, cutoff, span; -#define BITS 9 - unsigned char histbuf[BITS]; - /* - * the input buffer contains characters with runs of consecutive - * bits set. These set bits are an indication of the DCF77 pulse - * length. We assume that we receive the pulse at 50 Baud. Thus - * a 100ms pulse would generate a 4 bit train (20ms per bit and - * start bit) - * a 200ms pulse would create all zeroes (and probably a frame error) - */ - - for (i = 0; i < BITS; i++) - { - histbuf[i] = 0; - } - - cutoff = 0; - lowmax = 0; - - while (s < e) - { - register unsigned int ch = *s ^ 0xFF; - /* - * these lines are left as an excercise to the reader 8-) - */ - if (!((ch+1) & ch) || !*s) - { - - for (i = 0; ch; i++) - { - ch >>= 1; - } - - *s = i; - histbuf[i]++; - cutoff += i; - lowmax++; - } - else - { - parseprintf(DD_RAWDCF,("parse: cvt_rawdcf: character check for 0x%x@%d FAILED\n", *s, s - buffer)); - *s = ~0; - rtc = CVT_FAIL|CVT_BADFMT; - } - s++; - } - - if (lowmax) - { - cutoff /= lowmax; - } - else - { - cutoff = 4; /* doesn't really matter - it'll fail anyway, but gives error output */ - } - - parseprintf(DD_RAWDCF,("parse: cvt_rawdcf: average bit count: %d\n", cutoff)); - - lowmax = 0; - highmax = 0; - - parseprintf(DD_RAWDCF,("parse: cvt_rawdcf: histogram:")); - for (i = 0; i <= cutoff; i++) - { - lowmax+=histbuf[i] * i; - highmax += histbuf[i]; - parseprintf(DD_RAWDCF,(" %d", histbuf[i])); - } - parseprintf(DD_RAWDCF, (" <M>")); - - lowmax += highmax / 2; - - if (highmax) - { - lowmax /= highmax; - } - else - { - lowmax = 0; - } - - highmax = 0; - cutoff = 0; - - for (; i < BITS; i++) - { - highmax+=histbuf[i] * i; - cutoff +=histbuf[i]; - parseprintf(DD_RAWDCF,(" %d", histbuf[i])); - } - parseprintf(DD_RAWDCF,("\n")); - - if (cutoff) - { - highmax /= cutoff; - } - else - { - highmax = BITS-1; - } - - span = cutoff = lowmax; - for (i = lowmax; i <= highmax; i++) - { - if (histbuf[cutoff] > histbuf[i]) - { - cutoff = i; - span = i; - } - else - if (histbuf[cutoff] == histbuf[i]) - { - span = i; - } - } - - cutoff = (cutoff + span) / 2; - - parseprintf(DD_RAWDCF,("parse: cvt_rawdcf: lower maximum %d, higher maximum %d, cutoff %d\n", lowmax, highmax, cutoff)); - - s = buffer; - while ((s < e) && *c && *b) - { - if (*s == (unsigned char)~0) - { - *s = '?'; - } - else - { - *s = (*s >= cutoff) ? *b : *c; - } - s++; - b++; - c++; - } - - return (rtc == CVT_NONE) ? convert_rawdcf(buffer, size, &dcfparam, clock) : rtc; -} - -/* - * pps_rawdcf - * - * currently a very stupid version - should be extended to decode - * also ones and zeros (which is easy) - */ -/*ARGSUSED*/ -static u_long pps_rawdcf(parseio, status, ptime) - register parse_t *parseio; - register int status; - register timestamp_t *ptime; -{ - if (status) - { - parseio->parse_dtime.parse_ptime = *ptime; - parseio->parse_dtime.parse_state |= PARSEB_PPS|PARSEB_S_PPS; - } - - return CVT_NONE; -} - -/*ARGSUSED*/ -static u_long snt_rawdcf(parseio, ptime) - register parse_t *parseio; - register timestamp_t *ptime; -{ - clocktime_t clock; - u_long cvtrtc; - time_t t; - - /* - * start at last sample and add second index - gross, may have to be much more careful - */ - if (convert_rawdcf(parseio->parse_ldata, parseio->parse_ldsize - 1, &dcfparam, &clock) == CVT_OK) - { - if ((t = parse_to_unixtime(&clock, &cvtrtc)) == -1) - { - parseprintf(DD_RAWDCF,("parse: snt_rawdcf: time conversion FAILED\n")); - return CVT_FAIL|cvtrtc; - } - } - else - { - parseprintf(DD_RAWDCF,("parse: snt_rawdcf: data conversion FAILED\n")); - return CVT_NONE; - } - - parseio->parse_dtime.parse_stime = *ptime; - - t += parseio->parse_index - 1; - - /* - * time stamp - */ -#ifdef PARSEKERNEL - parseio->parse_dtime.parse_time.tv.tv_sec = t; - parseio->parse_dtime.parse_time.tv.tv_usec = clock.usecond; -#else - parseio->parse_dtime.parse_time.fp.l_ui = t + JAN_1970; - TVUTOTSF(clock.usecond, parseio->parse_dtime.parse_time.fp.l_uf); -#endif - - parseprintf(DD_RAWDCF,("parse: snt_rawdcf: time stamp synthesized offset %d seconds\n", parseio->parse_index - 1)); - - return updatetimeinfo(parseio, t, clock.usecond, clock.flags); -} -#endif /* defined(PARSE) && defined(CLOCK_RAWDCF) */ - -/* - * History: - * - * clk_rawdcf.c,v $ - * Revision 3.16 1994/05/31 20:02:40 kardel - * sync on ONE transition - * - * Revision 3.15 1994/05/30 10:20:01 kardel - * LONG cleanup - * - * Revision 3.14 1994/05/12 12:49:09 kardel - * printf fmt/arg cleanup - * - * Revision 3.13 1994/03/10 19:00:43 kardel - * clear utctime field to avoid confusion on synthesize time stamps - * - * Revision 3.12 1994/02/20 13:04:39 kardel - * parse add/delete second support - * - * Revision 3.11 1994/02/02 17:45:23 kardel - * rcs ids fixed - * - * Revision 3.9 1994/01/25 19:05:12 kardel - * 94/01/23 reconcilation - * - * Revision 3.8 1994/01/22 11:24:11 kardel - * fixed PPS handling - * - * Revision 3.7 1993/10/30 09:44:41 kardel - * conditional compilation flag cleanup - * - * Revision 3.6 1993/10/03 19:10:45 kardel - * restructured I/O handling - * - * Revision 3.5 1993/09/27 21:08:07 kardel - * utcoffset now in seconds - * - * Revision 3.4 1993/09/26 23:40:25 kardel - * new parse driver logic - * - * Revision 3.3 1993/09/01 21:44:54 kardel - * conditional cleanup - * - * Revision 3.2 1993/07/09 11:37:18 kardel - * Initial restructured version + GPS support - * - * Revision 3.1 1993/07/06 10:00:19 kardel - * DCF77 driver goes generic... - * - */ diff --git a/usr.sbin/xntpd/parse/clk_schmid.c b/usr.sbin/xntpd/parse/clk_schmid.c deleted file mode 100644 index 457a659426d6..000000000000 --- a/usr.sbin/xntpd/parse/clk_schmid.c +++ /dev/null @@ -1,217 +0,0 @@ -#if defined(REFCLOCK) && (defined(PARSE) || defined(PARSEPPS)) && defined(CLOCK_SCHMID) -/* - * /src/NTP/REPOSITORY/v3/parse/clk_schmid.c,v 3.16 1994/05/30 10:20:03 kardel Exp - * - * clk_schmid.c,v 3.16 1994/05/30 10:20:03 kardel Exp - * - * Schmid clock support - * - * Copyright (c) 1992,1993,1994 - * Frank Kardel Friedrich-Alexander Universitaet Erlangen-Nuernberg - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#include "sys/types.h" -#include "sys/time.h" -#include "sys/errno.h" -#include "ntp_fp.h" -#include "ntp_unixtime.h" -#include "ntp_calendar.h" - -#include "parse.h" - -/* - * Description courtesy of Adam W. Feigin et. al (Swisstime iis.ethz.ch) - * - * The command to Schmid's DCF77 clock is a single byte; each bit - * allows the user to select some part of the time string, as follows (the - * output for the lsb is sent first). - * - * Bit 0: time in MEZ, 4 bytes *binary, not BCD*; hh.mm.ss.tenths - * Bit 1: date 3 bytes *binary, not BCD: dd.mm.yy - * Bit 2: week day, 1 byte (unused here) - * Bit 3: time zone, 1 byte, 0=MET, 1=MEST. (unused here) - * Bit 4: clock status, 1 byte, 0=time invalid, - * 1=time from crystal backup, - * 3=time from DCF77 - * Bit 5: transmitter status, 1 byte, - * bit 0: backup antenna - * bit 1: time zone change within 1h - * bit 3,2: TZ 01=MEST, 10=MET - * bit 4: leap second will be - * added within one hour - * bits 5-7: Zero - * Bit 6: time in backup mode, units of 5 minutes (unused here) - * - */ -#define WS_TIME 0x01 -#define WS_SIGNAL 0x02 - -#define WS_ALTERNATE 0x01 -#define WS_ANNOUNCE 0x02 -#define WS_TZ 0x0c -#define WS_MET 0x08 -#define WS_MEST 0x04 -#define WS_LEAP 0x10 - -static u_long cvt_schmid(); - -clockformat_t clock_schmid = -{ - (unsigned LONG (*)())0, /* no input handling */ - cvt_schmid, /* Schmid conversion */ - syn_simple, /* easy time stamps */ - (u_long (*)())0, /* not direct PPS monitoring */ - (u_long (*)())0, /* no time code synthesizer monitoring */ - (void *)0, /* conversion configuration */ - "Schmid", /* Schmid receiver */ - 12, /* binary data buffer */ - F_END|SYNC_START, /* END packet delimiter / synchronisation */ - 0, /* no private data (complete messages) */ - { 0, 0}, - '\0', - (unsigned char)'\375', - '\0' -}; - - -static u_long -cvt_schmid(buffer, size, format, clock) - register unsigned char *buffer; - register int size; - register struct format *format; - register clocktime_t *clock; -{ - if ((size != 11) || (buffer[10] != (unsigned char)'\375')) - { - return CVT_NONE; - } - else - { - if (buffer[0] > 23 || buffer[1] > 59 || buffer[2] > 59 || buffer[3] > 9) /* Time */ - { - return CVT_FAIL|CVT_BADTIME; - } - else - if (buffer[4] < 1 || buffer[4] > 31 || buffer[5] < 1 || buffer[5] > 12 - || buffer[6] > 99) - { - return CVT_FAIL|CVT_BADDATE; - } - else - { - clock->hour = buffer[0]; - clock->minute = buffer[1]; - clock->second = buffer[2]; - clock->usecond = buffer[3] * 100000; - clock->day = buffer[4]; - clock->month = buffer[5]; - clock->year = buffer[6]; - - clock->flags = 0; - - switch (buffer[8] & WS_TZ) - { - case WS_MET: - clock->utcoffset = -1*60*60; - break; - - case WS_MEST: - clock->utcoffset = -2*60*60; - clock->flags |= PARSEB_DST; - break; - - default: - return CVT_FAIL|CVT_BADFMT; - } - - if (!(buffer[7] & WS_TIME)) - { - clock->flags |= PARSEB_POWERUP; - } - - if (!(buffer[7] & WS_SIGNAL)) - { - clock->flags |= PARSEB_NOSYNC; - } - - if (buffer[7] & WS_SIGNAL) - { - if (buffer[8] & WS_ALTERNATE) - { - clock->flags |= PARSEB_ALTERNATE; - } - - if (buffer[8] & WS_ANNOUNCE) - { - clock->flags |= PARSEB_ANNOUNCE; - } - - if (buffer[8] & WS_LEAP) - { - clock->flags |= PARSEB_LEAPADD; /* default: DCF77 data format deficiency */ - } - } - - clock->flags |= PARSEB_S_LEAP|PARSEB_S_ANTENNA; - - return CVT_OK; - } - } -} -#endif /* defined(PARSE) && defined(CLOCK_SCHMID) */ - -/* - * History: - * - * clk_schmid.c,v - * Revision 3.16 1994/05/30 10:20:03 kardel - * LONG cleanup - * - * Revision 3.15 1994/05/12 12:34:48 kardel - * data type cleanup - * - * Revision 3.14 1994/04/12 14:56:31 kardel - * fix declaration - * - * Revision 3.13 1994/02/20 13:04:41 kardel - * parse add/delete second support - * - * Revision 3.12 1994/02/02 17:45:25 kardel - * rcs ids fixed - * - * Revision 3.10 1994/01/25 19:05:15 kardel - * 94/01/23 reconcilation - * - * Revision 3.9 1994/01/23 17:21:56 kardel - * 1994 reconcilation - * - * Revision 3.8 1993/11/01 20:00:18 kardel - * parse Solaris support (initial version) - * - * Revision 3.7 1993/10/30 09:44:43 kardel - * conditional compilation flag cleanup - * - * Revision 3.6 1993/10/09 15:01:32 kardel - * file structure unified - * - * Revision 3.5 1993/10/03 19:10:47 kardel - * restructured I/O handling - * - * Revision 3.4 1993/09/27 21:08:09 kardel - * utcoffset now in seconds - * - * Revision 3.3 1993/09/26 23:40:27 kardel - * new parse driver logic - * - * Revision 3.2 1993/07/09 11:37:19 kardel - * Initial restructured version + GPS support - * - * Revision 3.1 1993/07/06 10:00:22 kardel - * DCF77 driver goes generic... - * - */ diff --git a/usr.sbin/xntpd/parse/clk_trimble.c b/usr.sbin/xntpd/parse/clk_trimble.c deleted file mode 100644 index 4cb96e2bdea1..000000000000 --- a/usr.sbin/xntpd/parse/clk_trimble.c +++ /dev/null @@ -1,140 +0,0 @@ -#if defined(REFCLOCK) && (defined(PARSE) || defined(PARSEPPS)) && defined(CLOCK_TRIMSV6) -/* - * /src/NTP/REPOSITORY/v3/parse/clk_trimble.c,v 3.9 1994/02/02 17:45:27 kardel Exp - * - * Trimble SV6 clock support - */ - -#include "sys/types.h" -#include "sys/time.h" -#include "sys/errno.h" -#include "ntp_fp.h" -#include "ntp_unixtime.h" -#include "ntp_calendar.h" - -#include "parse.h" - -/* 0000000000111111111122222222223333333 / char - * 0123456789012345678901234567890123456 \ posn - * >RTMhhmmssdddDDMMYYYYoodnnvrrrrr;*xx< Actual - * ----33445566600112222BB7__-_____--99- Parse - * >RTM 1 ;* <", Check - */ - -#define hexval(x) (('0' <= (x) && (x) <= '9') ? (x) - '0' : \ - ('a' <= (x) && (x) <= 'f') ? (x) - 'a' + 10 : \ - ('A' <= (x) && (x) <= 'F') ? (x) - 'A' + 10 : \ - -1) -#define O_USEC O_WDAY -#define O_GPSFIX O_FLAGS -#define O_CHKSUM O_UTCHOFFSET -static struct format trimsv6_fmt = -{ { { 13, 2 }, {15, 2}, { 17, 4}, /* Day, Month, Year */ - { 4, 2 }, { 6, 2}, { 8, 2}, /* Hour, Minute, Second */ - { 10, 3 }, {23, 1}, { 0, 0}, /* uSec, FIXes (WeekDAY, FLAGS, ZONE) */ - { 34, 2 }, { 0, 0}, { 21, 2}, /* cksum, -, utcS (UTC[HMS]OFFSET) */ - }, - ">RTM 1 ;* <", - 0 -}; - -static unsigned LONG cvt_trimsv6(); - -clockformat_t clock_trimsv6 = -{ - (unsigned LONG (*)())0, /* XXX?: no input handling */ - cvt_trimsv6, /* Trimble conversion */ - syn_simple, /* easy time stamps for RS232 (fallback) */ - pps_simple, /* easy PPS monitoring */ - (unsigned LONG (*)())0, /* no time code synthesizer monitoring */ - (void *)&trimsv6_fmt, /* conversion configuration */ - "Trimble SV6", - 37, /* string buffer */ - F_START|F_END|SYNC_START|SYNC_ONE, /* paket START/END delimiter, START synchronisation, PPS ONE sampling */ - 0, /* XXX?: no private data (complete messages) */ - { 0, 0}, - '>', - '<', - '\0' -}; - -static unsigned LONG -cvt_trimsv6(buffer, size, format, clock) - register char *buffer; - register int size; - register struct format *format; - register clocktime_t *clock; -{ - LONG gpsfix; - u_char calc_csum = 0; - long recv_csum; - int i; - - if (!Strok(buffer, format->fixed_string)) return CVT_NONE; -#define OFFS(x) format->field_offsets[(x)].offset -#define STOI(x, y) \ - Stoi(&buffer[OFFS(x)], y, \ - format->field_offsets[(x)].length) - if ( STOI(O_DAY, &clock->day) || - STOI(O_MONTH, &clock->month) || - STOI(O_YEAR, &clock->year) || - STOI(O_HOUR, &clock->hour) || - STOI(O_MIN, &clock->minute) || - STOI(O_SEC, &clock->second) || - STOI(O_USEC, &clock->usecond)|| - STOI(O_GPSFIX, &gpsfix) - ) return CVT_FAIL|CVT_BADFMT; - - clock->usecond *= 1000; - /* Check that the checksum is right */ - for (i=OFFS(O_CHKSUM)-1; i >= 0; i--) calc_csum ^= buffer[i]; - recv_csum = (hexval(buffer[OFFS(O_CHKSUM)]) << 4) | - hexval(buffer[OFFS(O_CHKSUM)+1]); - if (recv_csum < 0) return CVT_FAIL|CVT_BADTIME; - if (((u_char) recv_csum) != calc_csum) return CVT_FAIL|CVT_BADTIME; - - clock->utcoffset = 0; - - /* What should flags be set to ? */ - clock->flags = PARSEB_UTC; - - /* if the current GPS fix is 9 (unknown), reject */ - if (0 > gpsfix || gpsfix > 9) clock->flags |= PARSEB_POWERUP; - - return CVT_OK; -} -#endif /* defined(PARSE) && defined(CLOCK_TRIMSV6) */ - -/* - * History: - * - * clk_trimble.c,v - * Revision 3.9 1994/02/02 17:45:27 kardel - * rcs ids fixed - * - * Revision 3.7 1994/01/25 19:05:17 kardel - * 94/01/23 reconcilation - * - * Revision 3.6 1993/10/30 09:44:45 kardel - * conditional compilation flag cleanup - * - * Revision 3.5 1993/10/09 15:01:35 kardel - * file structure unified - * - * revision 3.4 - * date: 1993/10/08 14:44:51; author: kardel; - * trimble - initial working version - * - * revision 3.3 - * date: 1993/10/03 19:10:50; author: kardel; - * restructured I/O handling - * - * revision 3.2 - * date: 1993/09/27 21:07:17; author: kardel; - * Trimble alpha integration - * - * revision 3.1 - * date: 1993/09/26 23:40:29; author: kardel; - * new parse driver logic - * - */ diff --git a/usr.sbin/xntpd/parse/clk_trimtaip.c b/usr.sbin/xntpd/parse/clk_trimtaip.c deleted file mode 100644 index 6255163a2474..000000000000 --- a/usr.sbin/xntpd/parse/clk_trimtaip.c +++ /dev/null @@ -1,140 +0,0 @@ -#if defined(REFCLOCK) && (defined(PARSE) || defined(PARSEPPS)) && defined(CLOCK_TRIMTAIP) -/* - * $FreeBSD$ - * - * Trimble SV6 clock support - */ - -#include "sys/types.h" -#include "sys/time.h" -#include "sys/errno.h" -#include "ntp_fp.h" -#include "ntp_unixtime.h" -#include "ntp_calendar.h" - -#include "parse.h" - -/* 0000000000111111111122222222223333333 / char - * 0123456789012345678901234567890123456 \ posn - * >RTMhhmmssdddDDMMYYYYoodnnvrrrrr;*xx< Actual - * ----33445566600112222BB7__-_____--99- Parse - * >RTM 1 ;* <", Check - */ - -#define hexval(x) (('0' <= (x) && (x) <= '9') ? (x) - '0' : \ - ('a' <= (x) && (x) <= 'f') ? (x) - 'a' + 10 : \ - ('A' <= (x) && (x) <= 'F') ? (x) - 'A' + 10 : \ - -1) -#define O_USEC O_WDAY -#define O_GPSFIX O_FLAGS -#define O_CHKSUM O_UTCHOFFSET -static struct format trimsv6_fmt = -{ { { 13, 2 }, {15, 2}, { 17, 4}, /* Day, Month, Year */ - { 4, 2 }, { 6, 2}, { 8, 2}, /* Hour, Minute, Second */ - { 10, 3 }, {23, 1}, { 0, 0}, /* uSec, FIXes (WeekDAY, FLAGS, ZONE) */ - { 34, 2 }, { 0, 0}, { 21, 2}, /* cksum, -, utcS (UTC[HMS]OFFSET) */ - }, - ">RTM 1 ;* <", - 0 -}; - -static unsigned LONG cvt_trimtaip(); - -clockformat_t clock_trimtaip = -{ - (unsigned LONG (*)())0, /* no input handling */ - cvt_trimtaip, /* Trimble conversion */ - syn_simple, /* easy time stamps for RS232 (fallback) */ - pps_simple, /* easy PPS monitoring */ - (unsigned LONG (*)())0, /* no time code synthesizer monitoring */ - (void *)&trimsv6_fmt, /* conversion configuration */ - "Trimble SV6/TAIP", - 37, /* string buffer */ - F_START|F_END|SYNC_START|SYNC_ONE, /* paket START/END delimiter, START synchronisation, PPS ONE sampling */ - 0, /* no private data */ - { 0, 0}, - '>', - '<', - '\0' -}; - -static unsigned LONG -cvt_trimtaip(buffer, size, format, clock) - register char *buffer; - register int size; - register struct format *format; - register clocktime_t *clock; -{ - LONG gpsfix; - u_char calc_csum = 0; - long recv_csum; - int i; - - if (!Strok(buffer, format->fixed_string)) return CVT_NONE; -#define OFFS(x) format->field_offsets[(x)].offset -#define STOI(x, y) \ - Stoi(&buffer[OFFS(x)], y, \ - format->field_offsets[(x)].length) - if ( STOI(O_DAY, &clock->day) || - STOI(O_MONTH, &clock->month) || - STOI(O_YEAR, &clock->year) || - STOI(O_HOUR, &clock->hour) || - STOI(O_MIN, &clock->minute) || - STOI(O_SEC, &clock->second) || - STOI(O_USEC, &clock->usecond)|| - STOI(O_GPSFIX, &gpsfix) - ) return CVT_FAIL|CVT_BADFMT; - - clock->usecond *= 1000; - /* Check that the checksum is right */ - for (i=OFFS(O_CHKSUM)-1; i >= 0; i--) calc_csum ^= buffer[i]; - recv_csum = (hexval(buffer[OFFS(O_CHKSUM)]) << 4) | - hexval(buffer[OFFS(O_CHKSUM)+1]); - if (recv_csum < 0) return CVT_FAIL|CVT_BADTIME; - if (((u_char) recv_csum) != calc_csum) return CVT_FAIL|CVT_BADTIME; - - clock->utcoffset = 0; - - /* What should flags be set to ? */ - clock->flags = PARSEB_UTC; - - /* if the current GPS fix is 9 (unknown), reject */ - if (0 > gpsfix || gpsfix > 9) clock->flags |= PARSEB_POWERUP; - - return CVT_OK; -} -#endif /* defined(PARSE) && defined(CLOCK_TRIMTAIP) */ - -/* - * History: - * - * $Log: clk_trimtaip.c,v $ - * Revision 3.9 1994/02/02 17:45:27 kardel - * rcs ids fixed - * - * Revision 3.7 1994/01/25 19:05:17 kardel - * 94/01/23 reconcilation - * - * Revision 3.6 1993/10/30 09:44:45 kardel - * conditional compilation flag cleanup - * - * Revision 3.5 1993/10/09 15:01:35 kardel - * file structure unified - * - * revision 3.4 - * date: 1993/10/08 14:44:51; author: kardel; - * trimble - initial working version - * - * revision 3.3 - * date: 1993/10/03 19:10:50; author: kardel; - * restructured I/O handling - * - * revision 3.2 - * date: 1993/09/27 21:07:17; author: kardel; - * Trimble alpha integration - * - * revision 3.1 - * date: 1993/09/26 23:40:29; author: kardel; - * new parse driver logic - * - */ diff --git a/usr.sbin/xntpd/parse/clk_trimtsip.c b/usr.sbin/xntpd/parse/clk_trimtsip.c deleted file mode 100644 index 9df7e2ae2b58..000000000000 --- a/usr.sbin/xntpd/parse/clk_trimtsip.c +++ /dev/null @@ -1,471 +0,0 @@ -#if defined(REFCLOCK) && (defined(PARSE) || defined(PARSEPPS)) && defined(CLOCK_TRIMTSIP) -/* - * $FreeBSD$ - * - * Trimble TSIP support - CURRENTLY VERY MUCH UNDER CONSTRUCTION - */ - -#include "sys/types.h" -#include "sys/time.h" -#include "sys/errno.h" - -#include "ntp_syslog.h" -#include "ntp_types.h" -#include "ntp_fp.h" -#include "ntp_unixtime.h" -#include "ntp_calendar.h" - -#include "parse.h" - -/* - * Trimble TSIP parser - * - * The receiver uses a serial message protocol called Trimble Standard - * Interface Protocol (it can support others but this driver only supports - * TSIP). Messages in this protocol have the following form: - * - * <DLE><id> ... <data> ... <DLE><ETX> - * - * Any bytes within the <data> portion of value 10 hex (<DLE>) are doubled - * on transmission and compressed back to one on reception. Otherwise - * the values of data bytes can be anything. The serial interface is RS-422 - * asynchronous using 9600 baud, 8 data bits with odd party (**note** 9 bits - * in total!), and 1 stop bit. The protocol supports byte, integer, single, - * and double datatypes. Integers are two bytes, sent most significant first. - * Singles are IEEE754 single precision floating point numbers (4 byte) sent - * sign & exponent first. Doubles are IEEE754 double precision floating point - * numbers (8 byte) sent sign & exponent first. - * The receiver supports a large set of messages, only a small subset of - * which are used here. From driver to receiver the following are used: - * - * ID Description - * - * 21 Request current time - * 22 Mode Select - * 2C Set/Request operating parameters - * 2F Request UTC info - * 35 Set/Request I/O options - * - * From receiver to driver the following are recognised: - * - * ID Description - * - * 41 GPS Time - * 44 Satellite selection, PDOP, mode - * 46 Receiver health - * 4B Machine code/status - * 4C Report operating parameters (debug only) - * 4F UTC correction data (used to get leap second warnings) - * 55 I/O options (debug only) - * - * All others are accepted but ignored. - * - */ - -extern int debug; - -struct trimble -{ - u_char t_in_pkt; /* first DLE received */ - u_char t_dle; /* subsequent DLE received */ - u_char t_status; /* last status */ - u_char t_error; /* last error */ - u_short t_week; /* GPS week */ - u_short t_weekleap; /* GPS week of next/last week */ - u_short t_dayleap; /* day in week */ - u_short t_gpsutc; /* GPS - UTC offset */ - u_short t_gpsutcleap; /* offset at next/last leap */ - u_char t_operable; /* receiver feels OK */ - u_char t_leap; /* possible leap warning */ -}; - -static unsigned LONG inp_tsip(); -static unsigned LONG cvt_trimtsip(); - -struct clockformat clock_trimtsip = -{ - inp_tsip, /* Trimble TSIP input handler */ - cvt_trimtsip, /* Trimble TSIP conversion */ - syn_simple, /* easy time stamps for RS232 (fallback) */ - pps_simple, /* easy PPS monitoring */ - (unsigned LONG (*)())0, /* no time code synthesizer monitoring */ - (void *)0, /* no configuration data */ - "Trimble SV6/TSIP", - 128, /* input buffer */ - CVT_FIXEDONLY, /* we do our own input handling */ - sizeof(struct trimble), /* no private data */ - { 0, 0}, - '\0', - '\0', - '\0' -}; - -#define ADDSECOND 0x01 -#define DELSECOND 0x02 - -#define DLE 0x10 -#define ETX 0x03 - -static unsigned LONG inp_tsip(parseio, ch, ctime) - register parse_t *parseio; - register unsigned char ch; - register timestamp_t *ctime; -{ - register struct trimble *t = (struct trimble *)parseio->parse_pdata; - - if (!t) - return 0; /* local data not allocated - sigh! */ - - if (!t->t_in_pkt && ch != DLE) { - /* wait for start of packet */ -#ifdef DEBUG - if (debug > 2) - printf("sv6+ discarding %2.2x\n", ch); -#endif - return 0; - } - - switch (ch) { - case DLE: - if (!t->t_in_pkt) { - t->t_dle = 0; - t->t_in_pkt = 1; - parseio->parse_index = 0; - parseio->parse_data[parseio->parse_index++] = ch; - parseio->parse_dtime.parse_stime = *ctime; /* pick up time stamp at packet start */ - } else if (t->t_dle) { - /* Double DLE -> insert a DLE */ - t->t_dle = 0; - parseio->parse_data[parseio->parse_index++] = DLE; - } else - t->t_dle = 1; - break; - case ETX: - if (t->t_dle) { - /* DLE,ETX -> end of packet */ - parseio->parse_data[parseio->parse_index++] = DLE; - parseio->parse_data[parseio->parse_index++] = ch; - parseio->parse_data[parseio->parse_index] = '\0'; - parseio->parse_ldsize = parseio->parse_index+1; - bcopy(parseio->parse_data, parseio->parse_ldata, parseio->parse_ldsize); - t->t_in_pkt = t->t_dle = 0; - return 1; - } - /* fall into ... */ - default: - t->t_dle = 0; - parseio->parse_data[parseio->parse_index++] = ch; - } - - return (parseio->parse_index == parseio->parse_dsize-1); /* buffer full - attempt to parse (likely to fail) */ -} - -#define GPSORIGIN 2524953600 /* NTP origin - GPS origin in seconds */ -#define SECSPERWEEK 604800 /* seconds per week - GPS tells us about weeks */ -#define L_UF_SCALE 4294967296.0 /* scale a float fraction to l_uf units */ - -/* - * mapping union for ints, floats, doubles for both input & output to the - * receiver - * - * CAVEAT: must disappear - non portable - */ - -union { - u_char bd[8]; - int iv; - float fv; - double dv; -} uval; - -static float getflt P((u_char *)); -static double getdbl P((u_char *)); -static int getint P((u_char *)); - -/* - * cvt_trimtsip - * - * convert TSIP type format - */ -static unsigned LONG -cvt_trimtsip(buffer, size, format, clock, t) - register char *buffer; - register int size; - register struct format *format; - register clocktime_t *clock; - register struct trimble *t; -{ -#define mb(_X_) (buffer[2+(_X_)]) /* shortcut for buffer access */ - register u_char cmd; - - if (!t) { -#ifdef DEBUG - if (debug) printf("sv6+ BAD call (t=0)\n"); -#endif - return CVT_NONE; /* local data not allocated - sigh! */ - } - - if ((size < 4) || - (buffer[0] != DLE) || - (buffer[size-1] != ETX) || - (buffer[size-2] != DLE)) - { -#ifdef DEBUG - if (debug > 2) { - int i; - - printf("sv6+ BAD packet, size %d:\n ", size); - for (i = 0; i < size; i++) { - printf ("%2.2x, ", buffer[i]&0xff); - if (i%16 == 15) printf("\n\t"); - } - printf("\n"); - } -#endif - return CVT_NONE; - } - else - { - cmd = buffer[1]; - -#ifdef DEBUG - if (debug > 1) - switch(cmd) - { - case 0x41: - printf("sv6+ gps time: %f, %d, %f\n", - getflt(&mb(0)), getint(&mb(4)), getflt(&mb(6))); - break; - - case 0x44: - printf("sv6+ sats: %2x, %2d %2d %2d %2d, %.2f\n", - mb(0), mb(1), mb(2), mb(3), mb(4), getflt(&mb(5))); - break; - - case 0x45: - printf("sv6+ software: %d.%d (%d/%d/%d)\n", - mb(0)&0xff, mb(1)&0xff, (mb(4)&0xff)+1900, mb(2)&0xff, mb(3)&0xff); - break; - - case 0x46: - printf("sv6+ health: %2x %2x\n", - mb(0), mb(1)); - break; - - case 0x48: - printf("sv6+ gps message: '%.22s'\n", &mb(0)); - break; - - case 0x4b: - printf("sv6+ status: %2d %2x\n", - mb(0), mb(1)); - break; - - case 0x4c: - printf("sv6+ op params: %2x %.1f %.1f %.1f %.1f\n", - mb(0), getflt(&mb(1)), getflt(&mb(5)), - getflt(&mb(9)), getflt(&mb(13))); - break; - - case 0x4f: - printf("sv6+ utc data: %.3e %.3e %d %d %d %d %d\n", - getdbl(&mb(0)), getflt(&mb(8)), getint(&mb(18)), - getint(&mb(12)), getint(&mb(20)), getint(&mb(22)), getint(&mb(24))); - break; - - case 0x54: - /*printf("sv6+ bias and rate: %.1fm %.2fm/s at %.1fs\n", - getflt(&mb(0)), getflt(&mb(4)), getflt(&mb(8))); ignore it*/ - break; - - case 0x55: - printf("sv6+ io opts: %2x %2x %2x %2x\n", - mb(0), mb(1), mb(2), mb(3)); - break; - - case 0x8f: - { -#define RTOD (180.0 / 3.1415926535898) - double lat = getdbl(&mb(2)); - double lng = getdbl(&mb(10)); - printf("sv6+ last fix: %2.2x %d lat %f %c, long %f %c, alt %.2fm\n", - mb(1)&0xff, mb(40)&0xff, - ((lat < 0) ? (-lat) : (lat))*RTOD, (lat < 0 ? 'S' : 'N'), - ((lng < 0) ? (-lng) : (lng))*RTOD, (lng < 0 ? 'W' : 'E'), - getdbl(&mb(18))); - } - break; - - case 0x40: - case 0x5b: - case 0x6d: - /* Ignore */ - break; - - default: - printf("sv6+ cmd ignored: %2x, length: %d\n", - cmd, size); - break; - } -#endif /* DEBUG */ - - switch(cmd) - { - case 0x41: - { /* GPS time */ - float secs = getflt(&mb(0)); - int week = getint(&mb(4)); - int secint; - float secfrac; - l_fp gpstime, off; - - if (secs <= 0) - { -#ifdef DEBUG - if (debug) - printf("sv6+ seconds <= 0 (%e), setting POWERUP\n"); -#endif - clock->flags = PARSEB_POWERUP; - return CVT_OK; - } - - /* time OK */ - secint = secs; /* integer part, hopefully */ - secfrac = secs - secint; /* 0.0 <= secfrac < 1.0 */ - secint -= getflt(&mb(6)); /* UTC offset */ - gpstime.l_ui = week*SECSPERWEEK + secint + GPSORIGIN; /* convert to NTP time */ - gpstime.l_uf = secfrac*L_UF_SCALE; - - clock->utctime = gpstime.l_ui - JAN_1970; - TSFTOTVU(gpstime.l_uf, clock->usecond); - - if (t->t_leap == ADDSECOND) - clock->flags |= PARSEB_LEAPADD; - - if (t->t_leap == DELSECOND) - clock->flags |= PARSEB_LEAPDEL; - - if (t->t_operable) - clock->flags &= ~(PARSEB_NOSYNC|PARSEB_POWERUP); - else - clock->flags |= PARSEB_NOSYNC; - return CVT_OK; - - } /* case 0x41 */ - break; - - case 0x46: - { - /* sv6+ health */ - u_char status = t->t_status = mb(0); - u_char error = t->t_error = mb(1); - - if (status == 0 || status == 9 || status == 10 || status == 11) - { - if (!t->t_operable) - syslog(LOG_ERR, "Trimble clock synced"); - t->t_operable = 1; - } - else - { - if (t->t_operable) - syslog(LOG_ERR, "Trimble clock unsynced"); - t->t_operable = 0; - } - } - break; - - case 0x4f: - { - /* UTC correction data - derive a leap warning */ - int tls = t->t_gpsutc = getint(&mb(12)); /* current leap correction (GPS-UTC) */ - int wnlsf = t->t_weekleap = getint(&mb(20)); /* week no of leap correction */ - int dn = t->t_dayleap = getint(&mb(22)); /* day in week of leap correction */ - int tlsf = t->t_gpsutcleap = getint(&mb(24)); /* new leap correction */ - U_LONG now, leaptime; - - t->t_week = getint(&mb(18)); /* current week no */ - - /* this stuff hasn't been tested yet... */ - now = clock->utctime + JAN_1970; /* now in GPS seconds */ - leaptime = (wnlsf*7 + dn)*86400; /* time of leap in GPS seconds */ - if ((leaptime > now) && ((leaptime-now) < 86400*28)) - { - /* generate a leap warning */ - if (tlsf > tls) - t->t_leap = ADDSECOND; - else - t->t_leap = DELSECOND; - } - else - { - t->t_leap = 0; - } - } - break; - - default: - /* it's validly formed, but we don't care about it! */ - break; - } - } - return CVT_SKIP; -} - -/* - * getflt, getdbl, getint convert fields in the incoming data into the - * appropriate type of item - * - * CAVEAT: these routines are currently definitely byte order dependent - * and assume Representation(float) == IEEE754 - * These functions MUST be converted to portable versions (especially - * converting the float representation into ntp_fp formats in order - * to avoid floating point operations at all! - */ - -static float -getflt(bp) - u_char *bp; -{ - uval.bd[0] = *bp++; - uval.bd[1] = *bp++; - uval.bd[2] = *bp++; - uval.bd[3] = *bp; - return uval.fv; -} - -static double -getdbl(bp) - u_char *bp; -{ - uval.bd[0] = *bp++; - uval.bd[1] = *bp++; - uval.bd[2] = *bp++; - uval.bd[3] = *bp++; - uval.bd[4] = *bp++; - uval.bd[5] = *bp++; - uval.bd[6] = *bp++; - uval.bd[7] = *bp; - return uval.dv; -} - -static int -getint(bp) - u_char *bp; -{ - uval.bd[2] = *bp++; - uval.bd[3] = *bp; - if (uval.bd[2] & 0x80) /* sign-extend */ - uval.bd[0] = uval.bd[1] = 0xff; - else - uval.bd[0] = uval.bd[1] = 0; - return uval.iv; -} - -#endif /* defined(PARSE) && defined(CLOCK_TRIMTSIP) */ - -/* - * History: - * - * $Log: clk_trimtsip.c,v $ - */ diff --git a/usr.sbin/xntpd/parse/empty.c b/usr.sbin/xntpd/parse/empty.c deleted file mode 100644 index 91b777afe709..000000000000 --- a/usr.sbin/xntpd/parse/empty.c +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Well, some ranlibs, ar's or compilers react funny - * if asked to do nothing but build empty valid files - * I would have preferred to a no or at least a static - * symbol here... - */ -char * _____empty__ = "empty .o file"; diff --git a/usr.sbin/xntpd/parse/parse.c b/usr.sbin/xntpd/parse/parse.c deleted file mode 100644 index 11dacd91fad8..000000000000 --- a/usr.sbin/xntpd/parse/parse.c +++ /dev/null @@ -1,1309 +0,0 @@ -#if defined(REFCLOCK) && (defined(PARSE) || defined(PARSEPPS)) -/* - * /src/NTP/REPOSITORY/v3/parse/parse.c,v 3.27 1994/06/01 08:18:33 kardel Exp - * - * parse.c,v 3.27 1994/06/01 08:18:33 kardel Exp - * - * Parser module for reference clock - * - * PARSEKERNEL define switches between two personalities of the module - * if PARSEKERNEL is defined this module can be used with dcf77sync.c as - * a PARSEKERNEL kernel module. In this case the time stamps will be - * a struct timeval. - * when PARSEKERNEL is not defined NTP time stamps will be used. - * - * Copyright (c) 1992,1993,1994 - * Frank Kardel Friedrich-Alexander Universitaet Erlangen-Nuernberg - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#if !(defined(lint) || defined(__GNUC__)) -static char rcsid[] = "parse.c,v 3.19 1994/01/25 19:05:20 kardel Exp"; -#endif - -#include "sys/types.h" -#include "sys/time.h" -#include "sys/errno.h" - -#include "ntp_fp.h" -#include "ntp_unixtime.h" -#include "ntp_calendar.h" - -#include "ntp_machine.h" - -#if defined(PARSESTREAM) && (defined(SYS_SUNOS4) || defined(SYS_SOLARIS)) && defined(STREAM) -/* - * Sorry, but in SunOS 4.x AND Solaris 2.x kernels there are no - * mem* operations. I don't want them - bcopy, bzero - * are fine in the kernel - */ -#ifndef NTP_NEED_BOPS -#define NTP_NEED_BOPS -#endif -#else -#ifndef NTP_NEED_BOPS -#ifndef bzero -#define bzero(_X_, _Y_) memset(_X_, 0, _Y_) -#define bcopy(_X_, _Y_, _Z_) memmove(_Y_, _X_, _Z_) -#endif -#endif -#endif - -#include "parse.h" - -#include "ntp_stdlib.h" - -#ifdef PARSESTREAM -#include "sys/parsestreams.h" -#endif - -extern clockformat_t *clockformats[]; -extern unsigned short nformats; - -static u_long timepacket(); - -/* - * strings support usually not in kernel - duplicated, but what the heck - */ -static int -Strlen(s) - register char *s; -{ - register int c; - - c = 0; - if (s) - { - while (*s++) - { - c++; - } - } - return c; -} - -static int -Strcmp(s, t) - register char *s; - register char *t; -{ - register int c = 0; - - if (!s || !t || (s == t)) - { - return 0; - } - - while (!(c = *s++ - *t++) && *s && *t) - /* empty loop */; - - return c; -} - -static int -timedout(parseio, ctime) - register parse_t *parseio; - register timestamp_t *ctime; -{ - struct timeval delta; - -#ifdef PARSEKERNEL - delta.tv_sec = ctime->tv.tv_sec - parseio->parse_lastchar.tv.tv_sec; - delta.tv_usec = ctime->tv.tv_usec - parseio->parse_lastchar.tv.tv_usec; - if (delta.tv_usec < 0) - { - delta.tv_sec -= 1; - delta.tv_usec += 1000000; - } -#else - extern long tstouslo[]; - extern long tstousmid[]; - extern long tstoushi[]; - - l_fp delt; - - delt = ctime->fp; - L_SUB(&delt, &parseio->parse_lastchar.fp); - TSTOTV(&delt, &delta); -#endif - - if (timercmp(&delta, &parseio->parse_timeout, >)) - { - parseprintf(DD_PARSE, ("parse: timedout: TRUE\n")); - return 1; - } - else - { - parseprintf(DD_PARSE, ("parse: timedout: FALSE\n")); - return 0; - } -} - -/* - * setup_bitmaps - * WARNING: NOT TO BE CALLED CONCURRENTLY WITH - * parse_ioread, parse_ioend, parse_ioinit - */ -static int -setup_bitmaps(parseio, low, high) - register parse_t *parseio; - register unsigned short low; - register unsigned short high; -{ - register unsigned short i; - register int f = 0; - register clockformat_t *fmt; - register unsigned short index, mask, plen; - - if ((low >= high) || - (high > nformats)) - { - parseprintf(DD_PARSE, ("setup_bitmaps: failed: bounds error (low=%d, high=%d, nformats=%d)\n", low, high, nformats)); - return 0; - } - - bzero(parseio->parse_startsym, sizeof (parseio->parse_startsym)); - bzero(parseio->parse_endsym, sizeof (parseio->parse_endsym)); - bzero(parseio->parse_syncsym, sizeof (parseio->parse_syncsym)); - - plen = 0; - - parseio->parse_syncflags = 0; - parseio->parse_timeout.tv_sec = 0; - parseio->parse_timeout.tv_usec = 0; - - /* - * gather bitmaps of possible start and end values - */ - for (i=low; i < high; i++) - { - fmt = clockformats[i]; - - if (!(parseio->parse_flags & PARSE_FIXED_FMT) && - (fmt->flags & CVT_FIXEDONLY)) { - if (parseio->parse_dsize < fmt->length) - parseio->parse_dsize = fmt->length; - continue; - } - - if (fmt->flags & F_START) - { - index = fmt->startsym >> 3; - mask = 1 << (fmt->startsym & 0x7); - - if (parseio->parse_endsym[index] & mask) - { -#ifdef PARSEKERNEL - printf("parse: setup_bitmaps: failed: START symbol collides with END symbol (format %d)\n", i); -#else - syslog(LOG_ERR, "parse: setup_bitmaps: failed: START symbol collides with END symbol (format %d)\n", i); -#endif - return 0; - } - else - { - parseio->parse_startsym[index] |= mask; - f = 1; - } - } - - if (fmt->flags & F_END) - { - index = fmt->endsym >> 3; - mask = 1 << (fmt->endsym & 0x7); - - if (parseio->parse_startsym[index] & mask) - { -#ifdef PARSEKERNEL - printf("parse: setup_bitmaps: failed: END symbol collides with START symbol (format %d)\n", i); -#else - syslog(LOG_ERR, "parse: setup_bitmaps: failed: END symbol collides with START symbol (format %d)\n", i); -#endif - return 0; - } - else - { - parseio->parse_endsym[index] |= mask; - f = 1; - } - } - - if (fmt->flags & SYNC_CHAR) - { - parseio->parse_syncsym[fmt->syncsym >> 3] |= (1 << (fmt->syncsym & 0x7)); - } - - parseio->parse_syncflags |= fmt->flags & (SYNC_START|SYNC_END|SYNC_CHAR|SYNC_ONE|SYNC_ZERO|SYNC_TIMEOUT|SYNC_SYNTHESIZE); - - if (((fmt->flags & (SYNC_TIMEOUT|CVT_FIXEDONLY)) == (SYNC_TIMEOUT|CVT_FIXEDONLY)) && - ((parseio->parse_timeout.tv_sec || parseio->parse_timeout.tv_usec) ? timercmp(&parseio->parse_timeout, &fmt->timeout, >) : 1)) - { - parseio->parse_timeout = fmt->timeout; - } - - if (parseio->parse_dsize < fmt->length) - parseio->parse_dsize = fmt->length; - } - - if (parseio->parse_pdata) - { - FREE(parseio->parse_pdata, parseio->parse_plen); - parseio->parse_plen = 0; - parseio->parse_pdata = (void *)0; - } - - if (!f && ((int)(high - low) > 1)) - { - /* - * need at least one start or end symbol - */ -#ifdef PARSEKERNEL - printf("parse: setup_bitmaps: failed: neither START nor END symbol defined\n"); -#else - syslog(LOG_ERR, "parse: setup_bitmaps: failed: neither START nor END symbol defined\n"); -#endif - return 0; - } - - if ((high - low == 1) && (clockformats[low]->flags & CVT_FIXEDONLY) && - (clockformats[low]->plen)) - { - parseio->parse_plen = clockformats[low]->plen; - parseio->parse_pdata = (void *)MALLOC(parseio->parse_plen); - - if (!parseio->parse_pdata) - { - /* - * no memory - */ -#ifdef PARSEKERNEL - printf("parse: setup_bitmaps: failed: no memory for private data\n"); -#else - syslog(LOG_ERR, "parse: setup_bitmaps: failed: no memory for private data\n"); -#endif - return 0; - } - bzero((char *)parseio->parse_pdata, parseio->parse_plen); - } - - return 1; -} - -/*ARGSUSED*/ -int -parse_ioinit(parseio) - register parse_t *parseio; -{ - parseprintf(DD_PARSE, ("parse_iostart\n")); - - parseio->parse_plen = 0; - parseio->parse_pdata = (void *)0; - - if (!setup_bitmaps(parseio, 0, nformats)) - return 0; - - parseio->parse_data = MALLOC(parseio->parse_dsize * 2 + 2); - if (!parseio->parse_data) - { - parseprintf(DD_PARSE, ("init failed: malloc for data area failed\n")); - return 0; - } - - /* - * leave room for '\0' - */ - parseio->parse_ldata = parseio->parse_data + parseio->parse_dsize + 1; - parseio->parse_lformat = 0; - parseio->parse_badformat = 0; - parseio->parse_ioflags = PARSE_IO_CS7; /* usual unix default */ - parseio->parse_flags = 0; /* true samples */ - parseio->parse_index = 0; - parseio->parse_ldsize = 0; - - return 1; -} - -/*ARGSUSED*/ -void -parse_ioend(parseio) - register parse_t *parseio; -{ - parseprintf(DD_PARSE, ("parse_ioend\n")); - - if (parseio->parse_pdata) - FREE(parseio->parse_pdata, parseio->parse_plen); - - if (parseio->parse_data) - FREE(parseio->parse_data, parseio->parse_dsize * 2 + 2); -} - -/*ARGSUSED*/ -int -parse_ioread(parseio, ch, ctime) - register parse_t *parseio; - register unsigned char ch; - register timestamp_t *ctime; -{ - register unsigned updated = CVT_NONE; - register unsigned short low, high; - register unsigned index, mask; - - /* - * within STREAMS CSx (x < 8) chars still have the upper bits set - * so we normalize the characters by masking unecessary bits off. - */ - switch (parseio->parse_ioflags & PARSE_IO_CSIZE) - { - case PARSE_IO_CS5: - ch &= 0x1F; - break; - - case PARSE_IO_CS6: - ch &= 0x3F; - break; - - case PARSE_IO_CS7: - ch &= 0x7F; - break; - - case PARSE_IO_CS8: - break; - } - - parseprintf(DD_PARSE, ("parse_ioread(0x%x, char=0x%x, ..., ...)\n", (unsigned int)parseio, ch & 0xFF)); - - if (parseio->parse_flags & PARSE_FIXED_FMT) - { - if (!clockformats[parseio->parse_lformat]->convert) - { - parseprintf(DD_PARSE, ("parse_ioread: input dropped.\n")); - return CVT_NONE; - } - - if (clockformats[parseio->parse_lformat]->input) - { - if (clockformats[parseio->parse_lformat]->input(parseio, ch, ctime)) - updated = timepacket(parseio); /* got a datagram - process */ - - low = high = 0; /* all done - just post processing */ - } - else - { - low = parseio->parse_lformat; - high = low + 1; /* scan just one format */ - } - } - else - { - low = 0; - high = nformats; /* scan all non fixed formats */ - } - - if (low != high) - { - index = ch >> 3; - mask = 1 << (ch & 0x7); - - if ((parseio->parse_syncflags & SYNC_CHAR) && - (parseio->parse_syncsym[index] & mask)) - { - register clockformat_t *fmt; - register unsigned short i; - /* - * got a sync event - call sync routine - */ - - for (i = low; i < high; i++) - { - fmt = clockformats[i]; - - if ((fmt->flags & SYNC_CHAR) && - (fmt->syncsym == ch)) - { - parseprintf(DD_PARSE, ("parse_ioread: SYNC_CHAR event\n")); - if (fmt->syncevt) - fmt->syncevt(parseio, ctime, fmt->data, SYNC_CHAR); - } - } - } - - if ((((parseio->parse_syncflags & SYNC_START) && - (parseio->parse_startsym[index] & mask)) || - (parseio->parse_index == 0)) || - ((parseio->parse_syncflags & SYNC_TIMEOUT) && - timedout(parseio, ctime))) - { - register unsigned short i; - /* - * packet start - re-fill buffer - */ - if (parseio->parse_index) - { - /* - * filled buffer - thus not end character found - * do processing now - */ - parseio->parse_data[parseio->parse_index] = '\0'; - - updated = timepacket(parseio); - bcopy(parseio->parse_data, parseio->parse_ldata, parseio->parse_index+1); - parseio->parse_ldsize = parseio->parse_index+1; - if (parseio->parse_syncflags & SYNC_TIMEOUT) - parseio->parse_dtime.parse_stime = *ctime; - } - - /* - * could be a sync event - call sync routine if needed - */ - if (parseio->parse_syncflags & SYNC_START) - for (i = low; i < high; i++) - { - register clockformat_t *fmt = clockformats[i]; - - if ((parseio->parse_index == 0) || - ((fmt->flags & SYNC_START) && (fmt->startsym == ch))) - { - parseprintf(DD_PARSE, ("parse_ioread: SYNC_START event\n")); - if (fmt->syncevt) - fmt->syncevt(parseio, ctime, fmt->data, SYNC_START); - } - } - parseio->parse_index = 1; - parseio->parse_data[0] = ch; - parseprintf(DD_PARSE, ("parse: parse_ioread: buffer start\n")); - } - else - { - register unsigned short i; - - if (parseio->parse_index < parseio->parse_dsize) - { - /* - * collect into buffer - */ - parseprintf(DD_PARSE, ("parse: parse_ioread: buffer[%d] = 0x%x\n", parseio->parse_index, ch)); - parseio->parse_data[parseio->parse_index++] = ch; - } - - if ((parseio->parse_endsym[index] & mask) || - (parseio->parse_index >= parseio->parse_dsize)) - { - /* - * packet end - process buffer - */ - if (parseio->parse_syncflags & SYNC_END) - for (i = low; i < high; i++) - { - register clockformat_t *fmt = clockformats[i]; - - if ((fmt->flags & SYNC_END) && (fmt->endsym == ch)) - { - parseprintf(DD_PARSE, ("parse_ioread: SYNC_END event\n")); - if (fmt->syncevt) - fmt->syncevt(parseio, ctime, fmt->data, SYNC_END); - } - } - parseio->parse_data[parseio->parse_index] = '\0'; - updated = timepacket(parseio); - bcopy(parseio->parse_data, parseio->parse_ldata, parseio->parse_index+1); - parseio->parse_ldsize = parseio->parse_index+1; - parseio->parse_index = 0; - parseprintf(DD_PARSE, ("parse: parse_ioread: buffer end\n")); - } - } - } - - if ((updated == CVT_NONE) && - (parseio->parse_flags & PARSE_FIXED_FMT) && - (parseio->parse_syncflags & SYNC_SYNTHESIZE) && - ((parseio->parse_dtime.parse_status & CVT_MASK) == CVT_OK) && - clockformats[parseio->parse_lformat]->synth) - { - updated = clockformats[parseio->parse_lformat]->synth(parseio, ctime); - } - - /* - * remember last character time - */ - parseio->parse_lastchar = *ctime; - -#ifdef DEBUG - if ((updated & CVT_MASK) != CVT_NONE) - { - parseprintf(DD_PARSE, ("parse_ioread: time sample accumulated (status=0x%x)\n", updated)); - } -#endif - - parseio->parse_dtime.parse_status = updated; - - return (updated & CVT_MASK) != CVT_NONE; -} - -/* - * parse_iopps - * - * take status line indication and derive synchronisation information - * from it. - * It can also be used to decode a serial serial data format (such as the - * ONE, ZERO, MINUTE sync data stream from DCF77) - */ -/*ARGSUSED*/ -int -parse_iopps(parseio, status, ptime) - register parse_t *parseio; - register int status; - register timestamp_t *ptime; -{ - register unsigned updated = CVT_NONE; - - /* - * PPS pulse information will only be delivered to ONE clock format - * this is either the last successful conversion module with a ppssync - * routine, or a fixed format with a ppssync routine - */ - parseprintf(DD_PARSE, ("parse_iopps: STATUS %s\n", (status == SYNC_ONE) ? "ONE" : "ZERO")); - - if (((parseio->parse_flags & PARSE_FIXED_FMT) || - ((parseio->parse_dtime.parse_status & CVT_MASK) == CVT_OK)) && - clockformats[parseio->parse_lformat]->syncpps && - (status & clockformats[parseio->parse_lformat]->flags)) - { - updated = clockformats[parseio->parse_lformat]->syncpps(parseio, status == SYNC_ONE, ptime); - parseprintf(DD_PARSE, ("parse_iopps: updated = 0x%x\n", updated)); - } - else - { - parseprintf(DD_PARSE, ("parse_iopps: STATUS dropped\n")); - } - - return (updated & CVT_MASK) != CVT_NONE; -} - -/* - * parse_iodone - * - * clean up internal status for new round - */ -/*ARGSUSED*/ -void -parse_iodone(parseio) - register parse_t *parseio; -{ - /* - * we need to clean up certain flags for the next round - */ - parseprintf(DD_PARSE, ("parse_iodone: DONE\n")); - parseio->parse_dtime.parse_state = 0; /* no problems with ISRs */ -} - -/*---------- conversion implementation --------------------*/ - -/* - * convert a struct clock to UTC since Jan, 1st 1970 0:00 (the UNIX EPOCH) - */ -#define dysize(x) (((x) % 4) ? 365 : \ - (((x) % 100) ? 366 : \ - (((x) % 400) ? 365 : 366))) - -time_t -parse_to_unixtime(clock, cvtrtc) - register clocktime_t *clock; - register u_long *cvtrtc; -{ -#define SETRTC(_X_) { if (cvtrtc) *cvtrtc = (_X_); } - static int days_of_month[] = - { - 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 - }; - register int i; - time_t t; - - if (clock->utctime) - return clock->utctime; /* if the conversion routine gets it right away - why not */ - - if (clock->year < 100) - clock->year += 1900; - - if (clock->year < 1970) - clock->year += 100; /* XXX this will do it till <2070 */ - - if (clock->year < 0) - { - SETRTC(CVT_FAIL|CVT_BADDATE); - return -1; - } - - /* - * sorry, slow section here - but it's not time critical anyway - */ - t = (clock->year - 1970) * 365; - t += (clock->year >> 2) - (1970 >> 2); - t -= clock->year / 100 - 1970 / 100; - t += clock->year / 400 - 1970 / 400; - - /* month */ - if (clock->month <= 0 || clock->month > 12) - { - SETRTC(CVT_FAIL|CVT_BADDATE); - return -1; /* bad month */ - } - /* adjust leap year */ - if (clock->month < 3 && dysize(clock->year) == 366) - t--; - - for (i = 1; i < clock->month; i++) - { - t += days_of_month[i]; - } - /* day */ - if (clock->day < 1 || ((clock->month == 2 && dysize(clock->year) == 366) ? - clock->day > 29 : clock->day > days_of_month[clock->month])) - { - SETRTC(CVT_FAIL|CVT_BADDATE); - return -1; /* bad day */ - } - - t += clock->day - 1; - /* hour */ - if (clock->hour < 0 || clock->hour >= 24) - { - SETRTC(CVT_FAIL|CVT_BADTIME); - return -1; /* bad hour */ - } - - t = TIMES24(t) + clock->hour; - - /* min */ - if (clock->minute < 0 || clock->minute > 59) - { - SETRTC(CVT_FAIL|CVT_BADTIME); - return -1; /* bad min */ - } - - t = TIMES60(t) + clock->minute; - /* sec */ - - if (clock->second < 0 || clock->second > 60) /* allow for LEAPs */ - { - SETRTC(CVT_FAIL|CVT_BADTIME); - return -1; /* bad sec */ - } - - t = TIMES60(t) + clock->second; - - t += clock->utcoffset; /* warp to UTC */ - - /* done */ - - clock->utctime = t; /* documentray only */ - - return t; -} - -/*--------------- format conversion -----------------------------------*/ - -int -Stoi(s, zp, cnt) - char *s; - long *zp; - int cnt; -{ - char *b = s; - int f,z,v; - char c; - - f=z=v=0; - - while(*s == ' ') - s++; - - if (*s == '-') - { - s++; - v = 1; - } - else - if (*s == '+') - s++; - - for(;;) - { - c = *s++; - if (c == '\0' || c < '0' || c > '9' || (cnt && ((s-b) > cnt))) - { - if (f == 0) - { - return(-1); - } - if (v) - z = -z; - *zp = z; - return(0); - } - z = (z << 3) + (z << 1) + ( c - '0' ); - f=1; - } -} - - -int -Strok(s, m) - char *s; - char *m; -{ - if (!s || !m) - return 0; - - while(*s && *m) - { - if ((*m == ' ') ? 1 : (*s == *m)) - { - s++; - m++; - } - else - { - return 0; - } - } - return !*m; -} - -u_long -updatetimeinfo(parseio, t, usec, flags) - register parse_t *parseio; - register time_t t; - register u_long usec; - register u_long flags; -{ - register long usecoff; - register long mean; - long delta[PARSE_DELTA]; - -#ifdef PARSEKERNEL - usecoff = (t - parseio->parse_dtime.parse_stime.tv.tv_sec) * 1000000 - - parseio->parse_dtime.parse_stime.tv.tv_usec + usec; -#else - extern long tstouslo[]; - extern long tstousmid[]; - extern long tstoushi[]; - - TSFTOTVU(parseio->parse_dtime.parse_stime.fp.l_uf, usecoff); - usecoff = -usecoff; - usecoff += (t - parseio->parse_dtime.parse_stime.fp.l_ui + JAN_1970) * 1000000 - + usec; -#endif - - /* - * filtering (median) if requested - */ - if (parseio->parse_flags & PARSE_STAT_FILTER) - { - register int n, i, s, k; - - parseio->parse_delta[parseio->parse_dindex] = usecoff; - - parseio->parse_dindex = (parseio->parse_dindex + 1) % PARSE_DELTA; - - /* - * sort always - thus every sample gets its data - */ - bcopy((caddr_t)parseio->parse_delta, (caddr_t)delta, sizeof(delta)); - - for (s = 0; s < PARSE_DELTA; s++) - for (k = s+1; k < PARSE_DELTA; k++) - { /* Yes - it's slow sort */ - if (delta[s] > delta[k]) - { - register long tmp; - - tmp = delta[k]; - delta[k] = delta[s]; - delta[s] = tmp; - } - } - - i = 0; - n = PARSE_DELTA; - - /* - * you know this median loop if you have read the other code - */ - while ((n - i) > 8) - { - register long top = delta[n-1]; - register long mid = delta[(n+i)>>1]; - register long low = delta[i]; - - if ((top - mid) > (mid - low)) - { - /* - * cut off high end - */ - n--; - } - else - { - /* - * cut off low end - */ - i++; - } - } - - parseio->parse_dtime.parse_usecdisp = delta[n-1] - delta[i]; - - if (parseio->parse_flags & PARSE_STAT_AVG) - { - /* - * take the average of the median samples as this clock - * is a little bumpy - */ - mean = 0; - - while (i < n) - { - mean += delta[i++]; - } - - mean >>= 3; - } - else - { - mean = delta[(n+i)>>1]; - } - - parseio->parse_dtime.parse_usecerror = mean; - } - else - { - parseio->parse_dtime.parse_usecerror = usecoff; - parseio->parse_dtime.parse_usecdisp = 0; - } - - parseprintf(DD_PARSE,("parse: updatetimeinfo: T=%x+%d usec, useccoff=%d, usecerror=%d, usecdisp=%d\n", - (int)t, (int)usec, (int)usecoff, (int)parseio->parse_dtime.parse_usecerror, - (int)parseio->parse_dtime.parse_usecdisp)); - - -#ifdef PARSEKERNEL - { - int s = splhigh(); -#endif - - parseio->parse_lstate = parseio->parse_dtime.parse_state | flags | PARSEB_TIMECODE; - - parseio->parse_dtime.parse_state = parseio->parse_lstate; - -#ifdef PARSEKERNEL - (void)splx(s); - } -#endif - - return CVT_OK; /* everything fine and dandy... */ -} - - -/* - * syn_simple - * - * handle a sync time stamp - */ -/*ARGSUSED*/ -void -syn_simple(parseio, ts, format, why) - register parse_t *parseio; - register timestamp_t *ts; - register struct format *format; - register u_long why; -{ - parseio->parse_dtime.parse_stime = *ts; -} - -/* - * pps_simple - * - * handle a pps time stamp - */ -/*ARGSUSED*/ -u_long -pps_simple(parseio, status, ptime) - register parse_t *parseio; - register int status; - register timestamp_t *ptime; -{ - parseio->parse_dtime.parse_ptime = *ptime; - parseio->parse_dtime.parse_state |= PARSEB_PPS|PARSEB_S_PPS; - - return CVT_NONE; -} - -/* - * timepacket - * - * process a data packet - */ -static u_long -timepacket(parseio) - register parse_t *parseio; -{ - register int k; - register unsigned short format; - register time_t t; - register u_long cvtsum = 0;/* accumulated CVT_FAIL errors */ - u_long cvtrtc; /* current conversion result */ - clocktime_t clock; - - bzero(&clock, sizeof clock); - format = parseio->parse_lformat; - - k = 0; - - if (parseio->parse_flags & PARSE_FIXED_FMT) - { - switch ((cvtrtc = clockformats[format]->convert ? clockformats[format]->convert(parseio->parse_data, parseio->parse_index, clockformats[format]->data, &clock, parseio->parse_pdata) : CVT_NONE) & CVT_MASK) - { - case CVT_FAIL: - parseio->parse_badformat++; - cvtsum = cvtrtc & ~CVT_MASK; - - /* - * may be too often ... but is nice to know when it happens - */ -#ifdef PARSEKERNEL - printf("parse: \"%s\" failed to convert\n", clockformats[format]->name); -#else - syslog(LOG_WARNING, "parse: \"%s\" failed to convert\n", clockformats[format]->name); -#endif - break; - - case CVT_NONE: - /* - * too bad - pretend bad format - */ - parseio->parse_badformat++; - cvtsum = CVT_BADFMT; - break; - - case CVT_OK: - k = 1; - break; - - case CVT_SKIP: - k = 2; - break; - - default: - /* shouldn't happen */ -#ifdef PARSEKERNEL - printf("parse: INTERNAL error: bad return code of convert routine \"%s\"\n", clockformats[format]->name); -#else - syslog(LOG_WARNING, "parse: INTERNAL error: bad return code of convert routine \"%s\"\n", clockformats[format]->name); -#endif - return CVT_FAIL|cvtrtc; - } - } - else - { - /* - * find correct conversion routine - * and convert time packet - * RR search starting at last successful conversion routine - */ - - if (nformats) /* very careful ... */ - { - do - { - switch ((cvtrtc = (clockformats[format]->convert && !(clockformats[format]->flags & CVT_FIXEDONLY)) ? - clockformats[format]->convert(parseio->parse_data, parseio->parse_index, clockformats[format]->data, &clock, parseio->parse_pdata) : - CVT_NONE) & CVT_MASK) - { - case CVT_FAIL: - parseio->parse_badformat++; - cvtsum |= cvtrtc & ~CVT_MASK; - - /* - * may be too often ... but is nice to know when it happens - */ -#ifdef PARSEKERNEL - printf("parse: \"%s\" failed to convert\n", clockformats[format]->name); -#else - syslog(LOG_WARNING, "parse: \"%s\" failed to convert\n", clockformats[format]->name); -#endif - /*FALLTHROUGH*/ - case CVT_NONE: - format++; - break; - - case CVT_OK: - k = 1; - break; - - default: - /* shouldn't happen */ -#ifdef PARSEKERNEL - printf("parse: INTERNAL error: bad return code of convert routine \"%s\"\n", clockformats[format]->name); -#else - syslog(LOG_WARNING, "parse: INTERNAL error: bad return code of convert routine \"%s\"\n", clockformats[format]->name); -#endif - return CVT_BADFMT; - } - if (format >= nformats) - format = 0; - } - while (!k && (format != parseio->parse_lformat)); - } - } - - if (!k) - { -#ifdef PARSEKERNEL - printf("parse: time format \"%s\" not convertable\n", parseio->parse_data); -#else - syslog(LOG_WARNING, "parse: time format \"%s\" not convertable\n", parseio->parse_data); -#endif - return CVT_FAIL|cvtsum; - } - - if (k == 2) return CVT_OK; - - if ((t = parse_to_unixtime(&clock, &cvtrtc)) == -1) - { -#ifdef PARSEKERNEL - printf("parse: bad time format \"%s\"\n", parseio->parse_data); -#else - syslog(LOG_WARNING,"parse: bad time format \"%s\"\n", parseio->parse_data); -#endif - return CVT_FAIL|cvtrtc; - } - - parseio->parse_lformat = format; - - /* - * time stamp - */ -#ifdef PARSEKERNEL - parseio->parse_dtime.parse_time.tv.tv_sec = t; - parseio->parse_dtime.parse_time.tv.tv_usec = clock.usecond; -#else - parseio->parse_dtime.parse_time.fp.l_ui = t + JAN_1970; - TVUTOTSF(clock.usecond, parseio->parse_dtime.parse_time.fp.l_uf); -#endif - - parseio->parse_dtime.parse_format = format; - - return updatetimeinfo(parseio, t, clock.usecond, clock.flags); -} - - -/* - * control operations - */ -/*ARGSUSED*/ -int -parse_getstat(dct, parse) - parsectl_t *dct; - parse_t *parse; -{ - dct->parsestatus.flags = parse->parse_flags & PARSE_STAT_FLAGS; - return 1; -} - - -/*ARGSUSED*/ -int -parse_setstat(dct, parse) - parsectl_t *dct; - parse_t *parse; -{ - parse->parse_flags = (parse->parse_flags & ~PARSE_STAT_FLAGS) | dct->parsestatus.flags; - return 1; -} - - -/*ARGSUSED*/ -int -parse_timecode(dct, parse) - parsectl_t *dct; - parse_t *parse; -{ - dct->parsegettc.parse_state = parse->parse_lstate; - dct->parsegettc.parse_format = parse->parse_lformat; - /* - * move out current bad packet count - * user program is expected to sum these up - * this is not a problem, as "parse" module are - * exclusive open only - */ - dct->parsegettc.parse_badformat = parse->parse_badformat; - parse->parse_badformat = 0; - - if (parse->parse_ldsize <= PARSE_TCMAX) - { - dct->parsegettc.parse_count = parse->parse_ldsize; - bcopy(parse->parse_ldata, dct->parsegettc.parse_buffer, dct->parsegettc.parse_count); - return 1; - } - else - { - return 0; - } -} - - -/*ARGSUSED*/ -int -parse_setfmt(dct, parse) - parsectl_t *dct; - parse_t *parse; -{ - if (dct->parseformat.parse_count <= PARSE_TCMAX) - { - if (dct->parseformat.parse_count) - { - register unsigned short i; - - for (i = 0; i < nformats; i++) - { - if (!Strcmp(dct->parseformat.parse_buffer, clockformats[i]->name)) - { - parse->parse_lformat = i; - parse->parse_flags |= PARSE_FIXED_FMT; /* set fixed format indication */ - return setup_bitmaps(parse, i, i+1); - } - } - - return 0; - } - else - { - parse->parse_flags &= ~PARSE_FIXED_FMT; /* clear fixed format indication */ - return setup_bitmaps(parse, 0, nformats); - } - } - else - { - return 0; - } -} - -/*ARGSUSED*/ -int -parse_getfmt(dct, parse) - parsectl_t *dct; - parse_t *parse; -{ - if (dct->parseformat.parse_format < nformats && - Strlen(clockformats[dct->parseformat.parse_format]->name) <= PARSE_TCMAX) - { - dct->parseformat.parse_count = Strlen(clockformats[dct->parseformat.parse_format]->name)+1; - bcopy(clockformats[dct->parseformat.parse_format]->name, dct->parseformat.parse_buffer, dct->parseformat.parse_count); - return 1; - } - else - { - return 0; - } -} - -/*ARGSUSED*/ -int -parse_setcs(dct, parse) - parsectl_t *dct; - parse_t *parse; -{ - parse->parse_ioflags &= ~PARSE_IO_CSIZE; - parse->parse_ioflags |= dct->parsesetcs.parse_cs & PARSE_IO_CSIZE; - return 1; -} - -#endif /* defined(REFCLOCK) && defined(PARSE) */ - -/* - * History: - * - * parse.c,v - * Revision 3.27 1994/06/01 08:18:33 kardel - * more debug info - * - * Revision 3.26 1994/05/30 10:20:07 kardel - * LONG cleanup - * - * Revision 3.25 1994/05/12 12:49:12 kardel - * printf fmt/arg cleanup - * - * Revision 3.24 1994/03/27 15:01:36 kardel - * reorder include file to cope with PTX - * - * Revision 3.23 1994/03/25 13:09:02 kardel - * considering FIXEDONLY entries only in FIXEDONLY mode - * - * Revision 3.22 1994/02/25 12:34:49 kardel - * allow for converter generated utc times - * - * Revision 3.21 1994/02/02 17:45:30 kardel - * rcs ids fixed - * - * Revision 3.19 1994/01/25 19:05:20 kardel - * 94/01/23 reconcilation - * - * Revision 3.18 1994/01/23 17:21:59 kardel - * 1994 reconcilation - * - * Revision 3.17 1993/11/11 11:20:29 kardel - * declaration fixes - * - * Revision 3.16 1993/11/06 22:26:07 duwe - * Linux cleanup after config change - * - * Revision 3.15 1993/11/04 11:14:18 kardel - * ansi/K&R traps - * - * Revision 3.14 1993/11/04 10:03:28 kardel - * disarmed ansiism - * - * Revision 3.13 1993/11/01 20:14:13 kardel - * useless comparision removed - * - * Revision 3.12 1993/11/01 20:00:22 kardel - * parse Solaris support (initial version) - * - * Revision 3.11 1993/10/30 09:41:25 kardel - * minor optimizations - * - * Revision 3.10 1993/10/22 14:27:51 kardel - * Oct. 22nd 1993 reconcilation - * - * Revision 3.9 1993/10/05 23:15:09 kardel - * more STREAM protection - * - * Revision 3.8 1993/09/27 21:08:00 kardel - * utcoffset now in seconds - * - * Revision 3.7 1993/09/26 23:40:16 kardel - * new parse driver logic - * - * Revision 3.6 1993/09/07 10:12:46 kardel - * September 7th reconcilation - 3.2 (alpha) - * - * Revision 3.5 1993/09/01 21:44:48 kardel - * conditional cleanup - * - * Revision 3.4 1993/08/27 00:29:39 kardel - * compilation cleanup - * - * Revision 3.3 1993/08/24 22:27:13 kardel - * cleaned up AUTOCONF DCF77 mess 8-) - wasn't too bad - * - * Revision 3.2 1993/07/09 11:37:11 kardel - * Initial restructured version + GPS support - * - * Revision 3.1 1993/07/06 10:00:08 kardel - * DCF77 driver goes generic... - * - */ diff --git a/usr.sbin/xntpd/parse/parse_conf.c b/usr.sbin/xntpd/parse/parse_conf.c deleted file mode 100644 index cc931e371257..000000000000 --- a/usr.sbin/xntpd/parse/parse_conf.c +++ /dev/null @@ -1,133 +0,0 @@ -#if defined(REFCLOCK) && (defined(PARSE) || defined(PARSEPPS)) -/* - * /src/NTP/REPOSITORY/v3/parse/parse_conf.c,v 3.15 1994/02/02 17:45:32 kardel Exp - * - * parse_conf.c,v 3.15 1994/02/02 17:45:32 kardel Exp - * - * Parser configuration module for reference clocks - * - * STREAM define switches between two personalities of the module - * if STREAM is defined this module can be used with dcf77sync.c as - * a STREAMS kernel module. In this case the time stamps will be - * a struct timeval. - * when STREAM is not defined NTP time stamps will be used. - * - * Copyright (c) 1992,1993,1994 - * Frank Kardel Friedrich-Alexander Universitaet Erlangen-Nuernberg - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#include "sys/types.h" -#include "sys/time.h" -#include "sys/errno.h" -#include "ntp_fp.h" -#include "ntp_unixtime.h" -#include "ntp_calendar.h" - -#include "parse.h" - -#ifdef CLOCK_SCHMID -extern clockformat_t clock_schmid; -#endif - -#ifdef CLOCK_DCF7000 -extern clockformat_t clock_dcf7000; -#endif - -#ifdef CLOCK_MEINBERG -extern clockformat_t clock_meinberg[]; -#endif - -#ifdef CLOCK_RAWDCF -extern clockformat_t clock_rawdcf; -#endif - -#ifdef CLOCK_TRIMTAIP -extern clockformat_t clock_trimtaip; -#endif - -#ifdef CLOCK_TRIMTSIP -extern clockformat_t clock_trimtsip; -#endif - -/* - * format definitions - */ -clockformat_t *clockformats[] = -{ -#ifdef CLOCK_MEINBERG - &clock_meinberg[0], - &clock_meinberg[1], - &clock_meinberg[2], -#endif -#ifdef CLOCK_DCF7000 - &clock_dcf7000, -#endif -#ifdef CLOCK_SCHMID - &clock_schmid, -#endif -#ifdef CLOCK_RAWDCF - &clock_rawdcf, -#endif -#ifdef CLOCK_TRIMTAIP - &clock_trimtaip, -#endif -#ifdef CLOCK_TRIMTSIP - &clock_trimtsip, -#endif -0}; - -unsigned short nformats = sizeof(clockformats) / sizeof(clockformats[0]) - 1; -#endif /* REFCLOCK PARSE */ - -/* - * History: - * - * parse_conf.c,v - * Revision 3.15 1994/02/02 17:45:32 kardel - * rcs ids fixed - * - * Revision 3.13 1994/01/25 19:05:23 kardel - * 94/01/23 reconcilation - * - * Revision 3.12 1994/01/23 17:22:02 kardel - * 1994 reconcilation - * - * Revision 3.11 1993/11/01 20:00:24 kardel - * parse Solaris support (initial version) - * - * Revision 3.10 1993/10/09 15:01:37 kardel - * file structure unified - * - * Revision 3.9 1993/09/26 23:40:19 kardel - * new parse driver logic - * - * Revision 3.8 1993/09/02 23:20:57 kardel - * dragon extiction - * - * Revision 3.7 1993/09/01 21:44:52 kardel - * conditional cleanup - * - * Revision 3.6 1993/09/01 11:25:09 kardel - * patch accident 8-( - * - * Revision 3.5 1993/08/31 22:31:14 kardel - * SINIX-M SysVR4 integration - * - * Revision 3.4 1993/08/27 00:29:42 kardel - * compilation cleanup - * - * Revision 3.3 1993/07/14 09:04:45 kardel - * only when REFCLOCK && PARSE is defined - * - * Revision 3.2 1993/07/09 11:37:13 kardel - * Initial restructured version + GPS support - * - * Revision 3.1 1993/07/06 10:00:11 kardel - * DCF77 driver goes generic... - * - */ diff --git a/usr.sbin/xntpd/parse/parsesolaris.c b/usr.sbin/xntpd/parse/parsesolaris.c deleted file mode 100644 index a67f0bf03d72..000000000000 --- a/usr.sbin/xntpd/parse/parsesolaris.c +++ /dev/null @@ -1,1249 +0,0 @@ -/* - * /src/NTP/REPOSITORY/v3/parse/parsesolaris.c,v 3.16 1994/05/30 09:57:40 kardel Exp - * - * parsesolaris.c,v 3.16 1994/05/30 09:57:40 kardel Exp - * - * STREAMS module for reference clocks - * (SunOS5.x - not fully tested - buyer beware ! - OS KILLERS may still be - * lurking in the code!) - * - * Copyright (c) 1993,1994 - * derived work from parsestreams.c ((c) 1991-1993, Frank Kardel) and - * dcf77sync.c((c) Frank Kardel) - * Frank Kardel, Friedrich-Alexander Universitaet Erlangen-Nuernberg - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#ifndef lint -static char rcsid[] = "parsesolaris.c,v 3.16 1994/05/30 09:57:40 kardel Exp"; -#endif - -/* - * Well, the man spec says we have to do this junk - the - * header files tell a different story (i like that one more) - */ -#define SAFE_WR(q) (((q)->q_flag & QREADR) ? WR((q)) : (q)) -#define SAFE_RD(q) (((q)->q_flag & QREADR) ? (q) : RD((q))) - -/* - * needed to cope with Solaris 2.3 header file chaos - */ -#include <sys/types.h> -/* - * the Solaris 2.2 include list - */ -#include <sys/conf.h> -#include <sys/errno.h> -#include <sys/time.h> -#include <sys/termios.h> -#include <sys/stream.h> -#include <sys/strtty.h> -#include <sys/stropts.h> -#include <sys/modctl.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> -#include <sys/cpu.h> - -#define STREAM /* that's what we are here for */ - -#define HAVE_NO_NICE /* for the NTP headerfiles */ -#include "ntp_fp.h" -#include "parse.h" -#include "sys/parsestreams.h" - -static unsigned int parsebusy = 0; - -/*--------------- loadable driver section -----------------------------*/ - -static struct streamtab parseinfo; - -static struct fmodsw fmod_templ = -{ - "parse", /* module name */ - &parseinfo, /* module information */ - D_NEW|D_MP|D_MTQPAIR, /* exclusive for q pair */ - /* lock ptr */ -}; - -extern struct mod_ops mod_strmodops; - -static struct modlstrmod modlstrmod = -{ - &mod_strmodops, /* a STREAMS module */ - "PARSE - NTP reference", /* name this baby - keep room for revision number */ - &fmod_templ -}; - -static struct modlinkage modlinkage = -{ - MODREV_1, - &modlstrmod, - NULL -}; - -/* - * strings support usually not in kernel - */ -static int Strlen(s) - register char *s; -{ - register int c; - - c = 0; - if (s) - { - while (*s++) - { - c++; - } - } - return c; -} - -static void Strncpy(t, s, c) - register char *t; - register char *s; - register int c; -{ - if (s && t) - { - while ((c-- > 0) && (*t++ = *s++)) - ; - } -} - -int Strcmp(s, t) - register char *s; - register char *t; -{ - register int c = 0; - - if (!s || !t || (s == t)) - { - return 0; - } - - while (!(c = *s++ - *t++) && *s && *t) - /* empty loop */; - - return c; -} - -/* - * module management routines - */ -/*ARGSUSED*/ -int _init(void) -{ - static char revision[] = "3.16"; - char *s, *S, *t; - - /* - * copy RCS revision into Drv_name - * - * are we forcing RCS here to do things it was not built for ? - */ - s = revision; - if (*s == '$') - { - /* - * skip "$Revision: " - * if present. - not necessary on a -kv co (cvs export) - */ - while (*s && (*s != ' ')) - { - s++; - } - if (*s == ' ') s++; - } - - t = modlstrmod.strmod_linkinfo; - while (*t && (*t != ' ')) - { - t++; - } - if (*t == ' ') t++; - - S = s; - while (*S && (((*S >= '0') && (*S <= '9')) || (*S == '.'))) - { - S++; - } - - if (*s && *t && (S > s)) - { - if (Strlen(t) >= (S - s)) - { - (void) Strncpy(t, s, S - s); - } - } - return (mod_install(&modlinkage)); -} - -/*ARGSUSED*/ -int _info(struct modinfo *modinfop) -{ - return (mod_info(&modlinkage, modinfop)); -} - -/*ARGSUSED*/ -int _fini(void) -{ - if (parsebusy > 0) - { - printf("_fini[%s]: STREAMS module has still %d instances active.\n", modlstrmod.strmod_linkinfo, parsebusy); - return (EBUSY); - } - else - return (mod_remove(&modlinkage)); -} - -/*--------------- stream module definition ----------------------------*/ - -static int parseopen(), parseclose(), parsewput(), parserput(), parsersvc(); - -static struct module_info driverinfo = -{ - 0, /* module ID number */ - fmod_templ.f_name, /* module name - why repeated here ? compat ?*/ - 0, /* minimum accepted packet size */ - INFPSZ, /* maximum accepted packet size */ - 1, /* high water mark - flow control */ - 0 /* low water mark - flow control */ -}; - -static struct qinit rinit = /* read queue definition */ -{ - parserput, /* put procedure */ - parsersvc, /* service procedure */ - parseopen, /* open procedure */ - parseclose, /* close procedure */ - NULL, /* admin procedure - NOT USED FOR NOW */ - &driverinfo, /* information structure */ - NULL /* statistics */ -}; - -static struct qinit winit = /* write queue definition */ -{ - parsewput, /* put procedure */ - NULL, /* service procedure */ - NULL, /* open procedure */ - NULL, /* close procedure */ - NULL, /* admin procedure - NOT USED FOR NOW */ - &driverinfo, /* information structure */ - NULL /* statistics */ -}; - -static struct streamtab parseinfo = /* stream info element for parse driver */ -{ - &rinit, /* read queue */ - &winit, /* write queue */ - NULL, /* read mux */ - NULL /* write mux */ -}; - -/*--------------- driver data structures ----------------------------*/ - -/* - * we usually have an inverted signal - but you - * can change this to suit your needs - */ -int cd_invert = 1; /* invert status of CD line - PPS support via CD input */ - -int parsedebug = ~0; - -extern void uniqtime(); - -/*--------------- module implementation -----------------------------*/ - -#define TIMEVAL_USADD(_X_, _US_) do {\ - (_X_)->tv_usec += (_US_);\ - if ((_X_)->tv_usec >= 1000000)\ - {\ - (_X_)->tv_sec++;\ - (_X_)->tv_usec -= 1000000;\ - }\ - } while (0) - -#if defined(sun4c) && defined(DEBUG_CD) -#include <sun4c/cpu.h> -#include <sun4c/auxio.h> -#define SET_LED(_X_) (((cpu & CPU_ARCH) == SUN4C_ARCH) ? *(u_char *)AUXIO_REG = AUX_MBO|AUX_EJECT|((_X_)?AUX_LED:0) : 0) -#else -#define SET_LED(_X_) -#endif - -static int init_linemon(); -static void close_linemon(); - -/* - * keep here MACHINE AND OS AND ENVIRONMENT DEPENDENT - * timing constants - * - * FOR ABSOLUTE PRECISION YOU NEED TO MEASURE THE TIMING - * SKEW BETWEEN THE HW-PPS SIGNAL AND KERNEL uniqtime() - * YOURSELF. - * - * YOU MUST BE QUALIFIED APPROPRIATELY FOR THESE TYPE - * OF HW MANIPULATION ! - * - * you need an oscilloscope and the permission for HW work - * in order to figure out these timing constants/variables - */ - -static unsigned long xsdelay = 10; /* assume an SS2 */ -static unsigned long stdelay = 350; - -struct delays -{ - unsigned char mask; /* what to check for */ - unsigned char type; /* what to match */ - unsigned long xsdelay; /* external status direct delay in us */ - unsigned long stdelay; /* STREAMS message delay (M_[UN]HANGUP) */ -} isr_delays[] = -{ - /* - * WARNING: must still be measured - currently taken from Craig Leres ppsdev - */ -#ifdef sun4c - {CPU_ARCH|CPU_MACH, CPU_SUN4C_50, 10, 350}, - {CPU_ARCH|CPU_MACH, CPU_SUN4C_65, 15, 700}, - {CPU_ARCH|CPU_MACH, CPU_SUN4C_75, 10, 350}, -#endif -#ifdef sun4m - {CPU_ARCH|CPU_MACH, CPU_SUN4M_50, 8, 250}, - {CPU_ARCH|CPU_MACH, CPU_SUN4M_690, 8, 250}, -#endif - {0,} -}; - -void setup_delays() -{ - register int i; - - if (cputype & OBP_ARCH) - { - printf("parse: WARNING: PPS kernel fudge factors no yet determinable (no dev tree walk yet) - assuming SS2 (Sun4/75)\n", cputype); - return; - } - - for (i = 0; isr_delays[i].mask; i++) - { - if ((cputype & isr_delays[i].mask) == isr_delays[i].type) - { - xsdelay = isr_delays[i].xsdelay; - stdelay = isr_delays[i].stdelay; - return; - } - } - printf("parse: WARNING: PPS kernel fudge factors unknown for this machine (Type 0x%x) - assuming SS2 (Sun4/75)\n", cputype); -} - -#define M_PARSE 0x0001 -#define M_NOPARSE 0x0002 - -static int -setup_stream(queue_t *q, int mode) -{ - register mblk_t *mp; - - parseprintf(DD_OPEN,("parse: SETUP_STREAM - setting up stream for q=%x\n", q)); - - mp = allocb(sizeof(struct stroptions), BPRI_MED); - if (mp) - { - struct stroptions *str = (struct stroptions *)mp->b_wptr; - - str->so_flags = SO_READOPT|SO_HIWAT|SO_LOWAT; - str->so_readopt = (mode == M_PARSE) ? RMSGD : RNORM; - str->so_hiwat = (mode == M_PARSE) ? sizeof(parsetime_t) : 256; - str->so_lowat = 0; - mp->b_datap->db_type = M_SETOPTS; - mp->b_wptr += sizeof(struct stroptions); - if (!q) - panic("NULL q - strange"); - putnext(q, mp); - return putctl1(SAFE_WR(q)->q_next, M_CTL, (mode == M_PARSE) ? MC_SERVICEIMM : - MC_SERVICEDEF); - } - else - { - parseprintf(DD_OPEN,("parse: setup_stream - FAILED - no MEMORY for allocb\n")); - return 0; - } -} - -/*ARGSUSED*/ -static int parseopen(queue_t *q, dev_t *dev, int flag, int sflag, cred_t *credp) -{ - register mblk_t *mp; - register parsestream_t *parse; - static int notice = 0; - - parseprintf(DD_OPEN,("parse: OPEN - q=%x\n", q)); - - if (sflag != MODOPEN) - { /* open only for modules */ - parseprintf(DD_OPEN,("parse: OPEN - FAILED - not MODOPEN\n")); - return EIO; - } - - if (q->q_ptr != (caddr_t)NULL) - { - parseprintf(DD_OPEN,("parse: OPEN - FAILED - EXCLUSIVE ONLY\n")); - return EBUSY; - } - - parsebusy++; - - q->q_ptr = (caddr_t)kmem_alloc(sizeof(parsestream_t), KM_SLEEP); - if (q->q_ptr == (caddr_t)0) - { - return ENOMEM; - } - - parseprintf(DD_OPEN,("parse: OPEN - parse area q=%x, q->q_ptr=%x\n", q, q->q_ptr)); - SAFE_WR(q)->q_ptr = q->q_ptr; - parseprintf(DD_OPEN,("parse: OPEN - WQ parse area q=%x, q->q_ptr=%x\n", SAFE_WR(q), SAFE_WR(q)->q_ptr)); - - parse = (parsestream_t *) q->q_ptr; - bzero((caddr_t)parse, sizeof(*parse)); - parse->parse_queue = q; - parse->parse_status = PARSE_ENABLE; - parse->parse_ppsclockev.tv.tv_sec = 0; - parse->parse_ppsclockev.tv.tv_usec = 0; - parse->parse_ppsclockev.serial = 0; - - qprocson(q); - - parseprintf(DD_OPEN,("parse: OPEN - initializing io subsystem q=%x\n", q)); - - if (!parse_ioinit(&parse->parse_io)) - { - /* - * ok guys - beat it - */ - qprocsoff(q); - - kmem_free((caddr_t)parse, sizeof(parsestream_t)); - - parsebusy--; - - return EIO; - } - - parseprintf(DD_OPEN,("parse: OPEN - initializing stream q=%x\n", q)); - - if (setup_stream(q, M_PARSE)) - { - (void) init_linemon(q); /* hook up PPS ISR routines if possible */ - setup_delays(); - parseprintf(DD_OPEN,("parse: OPEN - SUCCEEDED\n")); - - /* - * I know that you know the delete key, but you didn't write this - * code, did you ? - So, keep the message in here. - */ - if (!notice) - { - printf("%s: Copyright (c) 1991-1994, Frank Kardel\n", modlstrmod.strmod_linkinfo); - notice = 1; - } - - return 0; - } - else - { - qprocsoff(q); - - kmem_free((caddr_t)parse, sizeof(parsestream_t)); - - parsebusy--; - - return EIO; - } -} - -/*ARGSUSED*/ -static int parseclose(queue_t *q, int flags) -{ - register parsestream_t *parse = (parsestream_t *)q->q_ptr; - register unsigned long s; - - parseprintf(DD_CLOSE,("parse: CLOSE\n")); - - qprocsoff(q); - - s = splhigh(); - - if (parse->parse_dqueue) - close_linemon(parse->parse_dqueue, q); - parse->parse_dqueue = (queue_t *)0; - - (void) splx(s); - - parse_ioend(&parse->parse_io); - - kmem_free((caddr_t)parse, sizeof(parsestream_t)); - - q->q_ptr = (caddr_t)NULL; - SAFE_WR(q)->q_ptr = (caddr_t)NULL; - - parsebusy--; -} - -/* - * move unrecognized stuff upward - */ -static parsersvc(queue_t *q) -{ - mblk_t *mp; - - while (mp = getq(q)) - { - if (canput(q->q_next) || (mp->b_datap->db_type > QPCTL)) - { - putnext(q, mp); - parseprintf(DD_RSVC,("parse: RSVC - putnext\n")); - } - else - { - putbq(q, mp); - parseprintf(DD_RSVC,("parse: RSVC - flow control wait\n")); - break; - } - } -} - -/* - * do ioctls and - * send stuff down - dont care about - * flow control - */ -static int parsewput(queue_t *q, mblk_t *mp) -{ - register int ok = 1; - register mblk_t *datap; - register struct iocblk *iocp; - parsestream_t *parse = (parsestream_t *)q->q_ptr; - - parseprintf(DD_WPUT,("parse: parsewput\n")); - - switch (mp->b_datap->db_type) - { - default: - putnext(q, mp); - break; - - case M_IOCTL: - iocp = (struct iocblk *)mp->b_rptr; - switch (iocp->ioc_cmd) - { - default: - parseprintf(DD_WPUT,("parse: parsewput - forward M_IOCTL\n")); - putnext(q, mp); - break; - - case CIOGETEV: - /* - * taken from Craig Leres ppsclock module (and modified) - */ - datap = allocb(sizeof(struct ppsclockev), BPRI_MED); - if (datap == NULL || mp->b_cont) - { - mp->b_datap->db_type = M_IOCNAK; - iocp->ioc_error = (datap == NULL) ? ENOMEM : EINVAL; - if (datap != NULL) - freeb(datap); - qreply(q, mp); - break; - } - - mp->b_cont = datap; - *(struct ppsclockev *)datap->b_wptr = parse->parse_ppsclockev; - datap->b_wptr += - sizeof(struct ppsclockev) / sizeof(*datap->b_wptr); - mp->b_datap->db_type = M_IOCACK; - iocp->ioc_count = sizeof(struct ppsclockev); - qreply(q, mp); - break; - - case PARSEIOC_ENABLE: - case PARSEIOC_DISABLE: - { - parse->parse_status = (parse->parse_status & ~PARSE_ENABLE) | - (iocp->ioc_cmd == PARSEIOC_ENABLE) ? - PARSE_ENABLE : 0; - if (!setup_stream(SAFE_RD(q), (parse->parse_status & PARSE_ENABLE) ? - M_PARSE : M_NOPARSE)) - { - mp->b_datap->db_type = M_IOCNAK; - } - else - { - mp->b_datap->db_type = M_IOCACK; - } - qreply(q, mp); - break; - } - - case PARSEIOC_SETSTAT: - case PARSEIOC_GETSTAT: - case PARSEIOC_TIMECODE: - case PARSEIOC_SETFMT: - case PARSEIOC_GETFMT: - case PARSEIOC_SETCS: - if (iocp->ioc_count == sizeof(parsectl_t)) - { - parsectl_t *dct = (parsectl_t *)mp->b_cont->b_rptr; - - switch (iocp->ioc_cmd) - { - case PARSEIOC_GETSTAT: - parseprintf(DD_WPUT,("parse: parsewput - PARSEIOC_GETSTAT\n")); - ok = parse_getstat(dct, &parse->parse_io); - break; - - case PARSEIOC_SETSTAT: - parseprintf(DD_WPUT,("parse: parsewput - PARSEIOC_SETSTAT\n")); - ok = parse_setstat(dct, &parse->parse_io); - break; - - case PARSEIOC_TIMECODE: - parseprintf(DD_WPUT,("parse: parsewput - PARSEIOC_TIMECODE\n")); - ok = parse_timecode(dct, &parse->parse_io); - break; - - case PARSEIOC_SETFMT: - parseprintf(DD_WPUT,("parse: parsewput - PARSEIOC_SETFMT\n")); - ok = parse_setfmt(dct, &parse->parse_io); - break; - - case PARSEIOC_GETFMT: - parseprintf(DD_WPUT,("parse: parsewput - PARSEIOC_GETFMT\n")); - ok = parse_getfmt(dct, &parse->parse_io); - break; - - case PARSEIOC_SETCS: - parseprintf(DD_WPUT,("parse: parsewput - PARSEIOC_SETCS\n")); - ok = parse_setcs(dct, &parse->parse_io); - break; - } - mp->b_datap->db_type = ok ? M_IOCACK : M_IOCNAK; - } - else - { - mp->b_datap->db_type = M_IOCNAK; - } - parseprintf(DD_WPUT,("parse: parsewput qreply - %s\n", (mp->b_datap->db_type == M_IOCNAK) ? "M_IOCNAK" : "M_IOCACK")); - qreply(q, mp); - break; - } - } -} - -/* - * read characters from streams buffers - */ -static unsigned long rdchar(mblk_t **mp) -{ - while (*mp != (mblk_t *)NULL) - { - if ((*mp)->b_wptr - (*mp)->b_rptr) - { - return (unsigned long)(*(unsigned char *)((*mp)->b_rptr++)); - } - else - { - register mblk_t *mmp = *mp; - - *mp = (*mp)->b_cont; - freeb(mmp); - } - } - return ~0; -} - -/* - * convert incoming data - */ -static int parserput(queue_t *q, mblk_t *imp) -{ - register unsigned char type; - mblk_t *mp = imp; - - switch (type = mp->b_datap->db_type) - { - default: - /* - * anything we don't know will be put on queue - * the service routine will move it to the next one - */ - parseprintf(DD_RPUT,("parse: parserput - forward type 0x%x\n", type)); - - if (canput(q->q_next) || (mp->b_datap->db_type > QPCTL)) - { - putnext(q, mp); - } - else - putq(q, mp); - break; - - case M_BREAK: - case M_DATA: - { - register parsestream_t * parse = (parsestream_t *)q->q_ptr; - register mblk_t *nmp; - register unsigned long ch; - timestamp_t ctime; - - /* - * get time on packet delivery - */ - uniqtime(&ctime.tv); - - if (!(parse->parse_status & PARSE_ENABLE)) - { - parseprintf(DD_RPUT,("parse: parserput - parser disabled - forward type 0x%x\n", type)); - if (canput(q->q_next) || (mp->b_datap->db_type > QPCTL)) - { - putnext(q, mp); - } - else - putq(q, mp); - } - else - { -#if 0 - parseprintf(DD_RPUT,("parse: parserput - M_%s\n", (type == M_DATA) ? "DATA" : "BREAK")); -#endif - if (type == M_DATA) - { - /* - * parse packet looking for start an end characters - */ - while (mp != (mblk_t *)NULL) - { - ch = rdchar(&mp); - if (ch != ~0 && parse_ioread(&parse->parse_io, (char)ch, &ctime)) - { - /* - * up up and away (hopefully ...) - * don't press it if resources are tight or nobody wants it - */ - nmp = (mblk_t *)NULL; - if (canput(parse->parse_queue->q_next) && (nmp = allocb(sizeof(parsetime_t), BPRI_MED))) - { - bcopy((caddr_t)&parse->parse_io.parse_dtime, (caddr_t)nmp->b_rptr, sizeof(parsetime_t)); - nmp->b_wptr += sizeof(parsetime_t); - putnext(parse->parse_queue, nmp); - } - else - if (nmp) freemsg(nmp); - parse_iodone(&parse->parse_io); - } - } - } - else - { - if (parse_ioread(&parse->parse_io, (char)0, &ctime)) - { - /* - * up up and away (hopefully ...) - * don't press it if resources are tight or nobody wants it - */ - nmp = (mblk_t *)NULL; - if (canput(parse->parse_queue->q_next) && (nmp = allocb(sizeof(parsetime_t), BPRI_MED))) - { - bcopy((caddr_t)&parse->parse_io.parse_dtime, (caddr_t)nmp->b_rptr, sizeof(parsetime_t)); - nmp->b_wptr += sizeof(parsetime_t); - putnext(parse->parse_queue, nmp); - } - else - if (nmp) freemsg(nmp); - parse_iodone(&parse->parse_io); - } - freemsg(mp); - } - break; - } - } - - /* - * CD PPS support for non direct ISR hack - */ - case M_HANGUP: - case M_UNHANGUP: - { - register parsestream_t * parse = (parsestream_t *)q->q_ptr; - timestamp_t ctime; - register mblk_t *nmp; - register int status = cd_invert ^ (type == M_HANGUP); - - SET_LED(status); - - uniqtime(&ctime.tv); - - TIMEVAL_USADD(&ctime.tv, stdelay); - - parseprintf(DD_RPUT,("parse: parserput - M_%sHANGUP\n", (type == M_HANGUP) ? "" : "UN")); - - if ((parse->parse_status & PARSE_ENABLE) && - parse_iopps(&parse->parse_io, status ? SYNC_ONE : SYNC_ZERO, &ctime)) - { - nmp = (mblk_t *)NULL; - if (canput(parse->parse_queue->q_next) && (nmp = allocb(sizeof(parsetime_t), BPRI_MED))) - { - bcopy((caddr_t)&parse->parse_io.parse_dtime, (caddr_t)nmp->b_rptr, sizeof(parsetime_t)); - nmp->b_wptr += sizeof(parsetime_t); - putnext(parse->parse_queue, nmp); - } - else - if (nmp) freemsg(nmp); - parse_iodone(&parse->parse_io); - freemsg(mp); - } - else - if (canput(q->q_next) || (mp->b_datap->db_type > QPCTL)) - { - putnext(q, mp); - } - else - putq(q, mp); - - if (status) - { - parse->parse_ppsclockev.tv = ctime.tv; - ++(parse->parse_ppsclockev.serial); - } - } - } -} - -static int init_zs_linemon(); /* handle line monitor for "zs" driver */ -static void close_zs_linemon(); -static void zs_xsisr(); /* zs external status interupt handler */ - -/*-------------------- CD isr status monitor ---------------*/ - -static int init_linemon(queue_t *q) -{ - register queue_t *dq; - - dq = SAFE_WR(q); - /* - * we ARE doing very bad things down here (basically stealing ISR - * hooks) - * - * so we chase down the STREAMS stack searching for the driver - * and if this is a known driver we insert our ISR routine for - * status changes in to the ExternalStatus handling hook - */ - while (dq->q_next) - { - dq = dq->q_next; /* skip down to driver */ - } - - /* - * find appropriate driver dependent routine - */ - if (dq->q_qinfo && dq->q_qinfo->qi_minfo) - { - register char *dname = dq->q_qinfo->qi_minfo->mi_idname; - - parseprintf(DD_INSTALL, ("init_linemon: driver is \"%s\"\n", dname)); - -#ifdef sun - if (dname && !Strcmp(dname, "zs")) - { - return init_zs_linemon(dq, q); - } - else -#endif - { - parseprintf(DD_INSTALL, ("init_linemon: driver \"%s\" not suitable for CD monitoring\n", dname)); - return 0; - } - } - parseprintf(DD_INSTALL, ("init_linemon: cannot find driver\n")); - return 0; -} - -static void close_linemon(queue_t *q, queue_t *my_q) -{ - /* - * find appropriate driver dependent routine - */ - if (q->q_qinfo && q->q_qinfo->qi_minfo) - { - register char *dname = q->q_qinfo->qi_minfo->mi_idname; - -#ifdef sun - if (dname && !Strcmp(dname, "zs")) - { - close_zs_linemon(q, my_q); - return; - } - parseprintf(DD_INSTALL, ("close_linemon: cannot find driver close routine for \"%s\"\n", dname)); -#endif - } - parseprintf(DD_INSTALL, ("close_linemon: cannot find driver name\n")); -} - -#ifdef sun -#include <sys/tty.h> -#include <sys/zsdev.h> -#include <sys/ser_async.h> -#include <sys/ser_zscc.h> - -/* - * there should be some docs telling how to get to - * sz:zs_usec_delay and zs:initzsops() - */ -#define zs_usec_delay 5 - -struct savedzsops -{ - struct zsops zsops; - struct zsops *oldzsops; -}; - -static struct zsops *emergencyzs; - -static int init_zs_linemon(queue_t *q, queue_t *my_q) -{ - register struct zscom *zs; - register struct savedzsops *szs; - register parsestream_t *parsestream = (parsestream_t *)my_q->q_ptr; - /* - * we expect the zsaline pointer in the q_data pointer - * from there on we insert our on EXTERNAL/STATUS ISR routine - * into the interrupt path, before the standard handler - */ - zs = ((struct asyncline *)q->q_ptr)->za_common; - if (!zs) - { - /* - * well - not found on startup - just say no (shouldn't happen though) - */ - return 0; - } - else - { - unsigned long s; - - /* - * we do a direct replacement, in case others fiddle also - * if somebody else grabs our hook and we disconnect - * we are in DEEP trouble - panic is likely to be next, sorry - */ - szs = (struct savedzsops *) kmem_alloc(sizeof(struct savedzsops), KM_SLEEP); - - if (szs == (struct savedzsops *)0) - { - parseprintf(DD_INSTALL, ("init_zs_linemon: CD monitor NOT installed - no memory\n")); - - return 0; - } - else - { - parsestream->parse_data = (void *)szs; - - mutex_enter(zs->zs_excl); - - parsestream->parse_dqueue = q; /* remember driver */ - - szs->zsops = *zs->zs_ops; - szs->zsops.zsop_xsint = (void (*)())zs_xsisr; /* place our bastard */ - szs->oldzsops = zs->zs_ops; - emergencyzs = zs->zs_ops; - - zs->zs_ops = &szs->zsops; /* hook it up */ - /* - * XXX: this is usually done via zsopinit() - * - have yet to find a way to call that routine - */ - zs->zs_xsint = (void (*)())zs_xsisr; - - mutex_exit(zs->zs_excl); - - parseprintf(DD_INSTALL, ("init_zs_linemon: CD monitor installed\n")); - - return 1; - } - } -} - -/* - * unregister our ISR routine - must call under splhigh() - */ -static void close_zs_linemon(queue_t *q, queue_t *my_q) -{ - register struct zscom *zs; - register parsestream_t *parsestream = (parsestream_t *)my_q->q_ptr; - - zs = ((struct asyncline *)q->q_ptr)->za_common; - if (!zs) - { - /* - * well - not found on startup - just say no (shouldn't happen though) - */ - return; - } - else - { - register struct savedzsops *szs = (struct savedzsops *)parsestream->parse_data; - - mutex_enter(zs->zs_excl); - - zs->zs_ops = szs->oldzsops; /* reset to previous handler functions */ - /* - * XXX: revert xsint (usually done via zsopinit() - have still to find - * a way to call that bugger - */ - zs->zs_xsint = zs->zs_ops->zsop_xsint; - - mutex_exit(zs->zs_excl); - - kmem_free((caddr_t)szs, sizeof (struct savedzsops)); - - parseprintf(DD_INSTALL, ("close_zs_linemon: CD monitor deleted\n")); - return; - } -} - -#define ZSRR0_IGNORE (ZSRR0_CD|ZSRR0_SYNC|ZSRR0_CTS) - -#define MAXDEPTH 50 /* maximum allowed stream crawl */ - -/* - * take external status interrupt (only CD interests us) - */ -static void zs_xsisr(struct zscom *zs) -{ - register struct asyncline *za = (struct asyncline *)zs->zs_priv; - register queue_t *q; - register unsigned char zsstatus; - register int loopcheck; - register unsigned char cdstate; - register char *dname; - - /* - * pick up current state - */ - zsstatus = SCC_READ0(); - - if (za->za_rr0 ^ (cdstate = zsstatus & ZSRR0_CD)) - { - timestamp_t cdevent; - register int status; - - /* - * CONDITIONAL external measurement support - */ - SET_LED(cdstate); /* - * inconsistent with upper SET_LED, but this - * is for oscilloscope business anyway and we - * are just interested in edge delays in the - * lower us range - */ - - /* - * time stamp - */ - uniqtime(&cdevent.tv); - - TIMEVAL_USADD(&cdevent.tv, xsdelay); - - q = za->za_ttycommon.t_readq; - - /* - * logical state - */ - status = cd_invert ? cdstate == 0 : cdstate != 0; - - /* - * ok - now the hard part - find ourself - */ - loopcheck = MAXDEPTH; - - while (q) - { - if (q->q_qinfo && q->q_qinfo->qi_minfo) - { - dname = q->q_qinfo->qi_minfo->mi_idname; - - if (!Strcmp(dname, parseinfo.st_rdinit->qi_minfo->mi_idname)) - { - /* - * back home - phew (hopping along stream queues might - * prove dangerous to your health) - */ - - if ((((parsestream_t *)q->q_ptr)->parse_status & PARSE_ENABLE) && - parse_iopps(&((parsestream_t *)q->q_ptr)->parse_io, status ? SYNC_ONE : SYNC_ZERO, &cdevent)) - { - /* - * XXX - currently we do not pass up the message, as - * we should. - * for a correct behaviour wee need to block out - * processing until parse_iodone has been posted via - * a softcall-ed routine which does the message pass-up - * right now PPS information relies on input being - * received - */ - parse_iodone(&((parsestream_t *)q->q_ptr)->parse_io); - } - - if (status) - { - ((parsestream_t *)q->q_ptr)->parse_ppsclockev.tv = cdevent.tv; - ++(((parsestream_t *)q->q_ptr)->parse_ppsclockev.serial); - } - - parseprintf(DD_ISR, ("zs_xsisr: CD event %s has been posted for \"%s\"\n", status ? "ONE" : "ZERO", dname)); - break; - } - } - - q = q->q_next; - - if (!loopcheck--) - { - panic("zs_xsisr: STREAMS Queue corrupted - CD event"); - } - } - - /* - * only pretend that CD and ignored transistion (SYNC,CTS) - * have been handled - */ - za->za_rr0 = (za->za_rr0 & ~ZSRR0_IGNORE) | (zsstatus & ZSRR0_IGNORE); - - if (((za->za_rr0 ^ zsstatus) & ~ZSRR0_IGNORE) == 0) - { - /* - * all done - kill status indication and return - */ - SCC_WRITE0(ZSWR0_RESET_STATUS); /* might kill other conditions here */ - return; - } - } - - parseprintf(DD_ISR, ("zs_xsisr: non CD event 0x%x for \"%s\"\n", - (za->za_rr0 ^ zsstatus) & ~ZSRR0_CD,dname)); - /* - * we are now gathered here to process some unusual external status - * interrupts. - * any CD events have also been handled and shouldn't be processed - * by the original routine (unless we have a VERY busy port pin) - * some initializations are done here, which could have been done before for - * both code paths but have been avioded for minimum path length to - * the uniq_time routine - */ - dname = (char *) 0; - q = za->za_ttycommon.t_readq; - - loopcheck = MAXDEPTH; - - /* - * the real thing for everything else ... - */ - while (q) - { - if (q->q_qinfo && q->q_qinfo->qi_minfo) - { - dname = q->q_qinfo->qi_minfo->mi_idname; - if (!Strcmp(dname, parseinfo.st_rdinit->qi_minfo->mi_idname)) - { - register void (*zsisr)(); - - /* - * back home - phew (hopping along stream queues might - * prove dangerous to your health) - */ - if (zsisr = ((struct savedzsops *)((parsestream_t *)q->q_ptr)->parse_data)->oldzsops->zsop_xsint) - zsisr(zs); - else - panic("zs_xsisr: unable to locate original ISR"); - - parseprintf(DD_ISR, ("zs_xsisr: non CD event was processed for \"%s\"\n", dname)); - /* - * now back to our program ... - */ - return; - } - } - - q = q->q_next; - - if (!loopcheck--) - { - panic("zs_xsisr: STREAMS Queue corrupted - non CD event"); - } - } - - /* - * last resort - shouldn't even come here as it indicates - * corrupted TTY structures - */ - printf("zs_zsisr: looking for \"%s\" - found \"%s\" - taking EMERGENCY path\n", parseinfo.st_rdinit->qi_minfo->mi_idname, dname ? dname : "-NIL-"); - - if (emergencyzs && emergencyzs->zsop_xsint) - emergencyzs->zsop_xsint(zs); - else - panic("zs_xsisr: no emergency ISR handler"); -} -#endif /* sun */ - -/* - * History: - * - * parsesolaris.c,v - * Revision 3.16 1994/05/30 09:57:40 kardel - * kmem_alloc checking - * - * Revision 3.15 1994/02/15 22:20:51 kardel - * rcsid fixed - * - * Revision 3.14 1994/02/15 22:06:04 kardel - * added qprocsx & flags for MT capability - * - * Revision 3.13 1994/02/13 19:16:47 kardel - * updated verbose Copyright message - * - * Revision 3.12 1994/02/02 17:45:35 kardel - * rcs ids fixed - * - * Revision 3.9 1994/01/25 19:05:26 kardel - * 94/01/23 reconcilation - * - * Revision 3.8 1994/01/23 17:22:04 kardel - * 1994 reconcilation - * - * Revision 3.7 1993/12/15 18:24:41 kardel - * Now also ignoring state changes on ZSRR0_{SYNC,CTS} to avoid zs driver bugs (Solaris 2.3) - * - * Revision 3.6 1993/12/15 12:48:53 kardel - * fixed message loss on M_*HANHUP messages - * - * Revision 3.5 1993/12/14 21:05:12 kardel - * PPS working now for SunOS 5.x zs external status hook - * - * Revision 3.4 1993/11/13 11:13:17 kardel - * Solaris 2.3 additional includes - * - * Revision 3.3 1993/11/11 11:20:33 kardel - * declaration fixes - * - * Revision 3.2 1993/11/05 15:40:25 kardel - * shut up nice feature detection - * - * Revision 3.1 1993/11/01 20:00:29 kardel - * parse Solaris support (initial version) - * - */ diff --git a/usr.sbin/xntpd/parse/parsestreams.c b/usr.sbin/xntpd/parse/parsestreams.c deleted file mode 100644 index 990f2b325f77..000000000000 --- a/usr.sbin/xntpd/parse/parsestreams.c +++ /dev/null @@ -1,1363 +0,0 @@ -/* - * /src/NTP/REPOSITORY/v3/parse/parsestreams.c,v 3.22 1994/06/01 10:41:16 kardel Exp - * - * parsestreams.c,v 3.22 1994/06/01 10:41:16 kardel Exp - * - * STREAMS module for reference clocks - * (SunOS4.x) - * - * Copyright (c) 1989,1990,1991,1992,1993,1994 - * Frank Kardel Friedrich-Alexander Universitaet Erlangen-Nuernberg - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#ifndef lint -static char rcsid[] = "parsestreams.c,v 3.22 1994/06/01 10:41:16 kardel Exp"; -#endif - -#include "sys/types.h" -#include "sys/conf.h" -#include "sys/buf.h" -#include "sys/param.h" -#include "sys/sysmacros.h" -#include "sys/errno.h" -#include "sys/time.h" -#include "sundev/mbvar.h" -#include "sun/autoconf.h" -#include "sys/stream.h" -#include "sys/stropts.h" -#include "sys/dir.h" -#include "sys/signal.h" -#include "sys/termios.h" -#include "sys/termio.h" -#include "sys/ttold.h" -#include "sys/user.h" -#include "sys/errno.h" -#include "sys/tty.h" -#include "machine/cpu.h" - -#ifdef VDDRV -#include "sun/vddrv.h" -#endif - -/* - * no protypes here ! - */ -#define P(x) () - -/* - * use microtime instead of uniqtime if advised to - */ -#ifdef MICROTIME -#define uniqtime microtime -#endif - -#define HAVE_NO_NICE /* for the NTP headerfiles */ -#include "ntp_fp.h" -#include "parse.h" -#include "sys/parsestreams.h" - -#ifdef VDDRV -static unsigned int parsebusy = 0; - -/*--------------- loadable driver section -----------------------------*/ - -extern struct streamtab parseinfo; - -struct vdldrv parsesync_vd = -{ - VDMAGIC_PSEUDO, /* nothing like a real driver - a STREAMS module */ - "PARSE ", /* name this baby - keep room for revision number */ -}; - -/* - * strings support usually not in kernel - */ -static int strlen(s) - register char *s; -{ - register int c; - - c = 0; - if (s) - { - while (*s++) - { - c++; - } - } - return c; -} - -static void strncpy(t, s, c) - register char *t; - register char *s; - register int c; -{ - if (s && t) - { - while ((c-- > 0) && (*t++ = *s++)) - ; - } -} - -static int strcmp(s, t) - register char *s; - register char *t; -{ - register int c = 0; - - if (!s || !t || (s == t)) - { - return 0; - } - - while (!(c = *s++ - *t++) && *s && *t) - /* empty loop */; - - return c; -} - -static int strncmp(s, t, n) - register char *s; - register char *t; - register int n; -{ - register int c = 0; - - if (!s || !t || (s == t)) - { - return 0; - } - - while (n-- && !(c = *s++ - *t++) && *s && *t) - /* empty loop */; - - return c; -} - -/* - * driver init routine - * since no mechanism gets us into and out of the fmodsw, we have to - * do it ourselves - */ -/*ARGSUSED*/ -int xxxinit(fc, vdp, vdi, vds) - unsigned int fc; - struct vddrv *vdp; - addr_t vdi; - struct vdstat *vds; -{ - extern struct fmodsw fmodsw[]; - extern int fmodcnt; - - struct fmodsw *fm = fmodsw; - struct fmodsw *fmend = &fmodsw[fmodcnt]; - struct fmodsw *ifm = (struct fmodsw *)0; - char *mname = parseinfo.st_rdinit->qi_minfo->mi_idname; - - switch (fc) - { - case VDLOAD: - vdp->vdd_vdtab = (struct vdlinkage *)&parsesync_vd; - /* - * now, jog along fmodsw scanning for an empty slot - * and deposit our name there - */ - while (fm <= fmend) - { - if (!strncmp(fm->f_name, mname, FMNAMESZ)) - { - printf("vddrinit[%s]: STREAMS module already loaded.\n", mname); - return(EBUSY); - } - else - if ((ifm == (struct fmodsw *)0) && - (fm->f_name[0] == '\0') && (fm->f_str == (struct streamtab *)0)) - { - /* - * got one - so move in - */ - ifm = fm; - break; - } - fm++; - } - - if (ifm == (struct fmodsw *)0) - { - printf("vddrinit[%s]: no slot free for STREAMS module\n", mname); - return (ENOSPC); - } - else - { - static char revision[] = "3.22"; - char *s, *S, *t; - - strncpy(ifm->f_name, mname, FMNAMESZ); - ifm->f_name[FMNAMESZ] = '\0'; - ifm->f_str = &parseinfo; - /* - * copy RCS revision into Drv_name - * - * are we forcing RCS here to do things it was not built for ? - */ - s = revision; - if (*s == '$') - { - /* - * skip "$Revision: " - * if present. - not necessary on a -kv co (cvs export) - */ - while (*s && (*s != ' ')) - { - s++; - } - if (*s == ' ') s++; - } - - t = parsesync_vd.Drv_name; - while (*t && (*t != ' ')) - { - t++; - } - if (*t == ' ') t++; - - S = s; - while (*S && (((*S >= '0') && (*S <= '9')) || (*S == '.'))) - { - S++; - } - - if (*s && *t && (S > s)) - { - if (strlen(t) >= (S - s)) - { - (void) strncpy(t, s, S - s); - } - } - return (0); - } - break; - - case VDUNLOAD: - if (parsebusy > 0) - { - printf("vddrinit[%s]: STREAMS module has still %d instances active.\n", mname, parsebusy); - return (EBUSY); - } - else - { - while (fm <= fmend) - { - if (!strncmp(fm->f_name, mname, FMNAMESZ)) - { - /* - * got it - kill entry - */ - fm->f_name[0] = '\0'; - fm->f_str = (struct streamtab *)0; - fm++; - - break; - } - fm++; - } - if (fm > fmend) - { - printf("vddrinit[%s]: cannot find entry for STREAMS module\n", mname); - return (ENXIO); - } - else - return (0); - } - - - case VDSTAT: - return (0); - - default: - return (EIO); - - } - return EIO; -} - -#endif - -/*--------------- stream module definition ----------------------------*/ - -static int parseopen(), parseclose(), parsewput(), parserput(), parsersvc(); - -static struct module_info driverinfo = -{ - 0, /* module ID number */ - "parse", /* module name */ - 0, /* minimum accepted packet size */ - INFPSZ, /* maximum accepted packet size */ - 1, /* high water mark - flow control */ - 0 /* low water mark - flow control */ -}; - -static struct qinit rinit = /* read queue definition */ -{ - parserput, /* put procedure */ - parsersvc, /* service procedure */ - parseopen, /* open procedure */ - parseclose, /* close procedure */ - NULL, /* admin procedure - NOT USED FOR NOW */ - &driverinfo, /* information structure */ - NULL /* statistics */ -}; - -static struct qinit winit = /* write queue definition */ -{ - parsewput, /* put procedure */ - NULL, /* service procedure */ - NULL, /* open procedure */ - NULL, /* close procedure */ - NULL, /* admin procedure - NOT USED FOR NOW */ - &driverinfo, /* information structure */ - NULL /* statistics */ -}; - -struct streamtab parseinfo = /* stream info element for dpr driver */ -{ - &rinit, /* read queue */ - &winit, /* write queue */ - NULL, /* read mux */ - NULL, /* write mux */ - NULL /* module auto push */ -}; - -/*--------------- driver data structures ----------------------------*/ - -/* - * we usually have an inverted signal - but you - * can change this to suit your needs - */ -int cd_invert = 1; /* invert status of CD line - PPS support via CD input */ - -int parsedebug = ~0; - -extern void uniqtime(); - -/*--------------- module implementation -----------------------------*/ - -#define TIMEVAL_USADD(_X_, _US_) {\ - (_X_)->tv_usec += (_US_);\ - if ((_X_)->tv_usec >= 1000000)\ - {\ - (_X_)->tv_sec++;\ - (_X_)->tv_usec -= 1000000;\ - }\ - } while (0) - -#if defined(sun4c) && defined(DEBUG_CD) -#include <sun4c/cpu.h> -#include <sun4c/auxio.h> -#define SET_LED(_X_) (((cpu & CPU_ARCH) == SUN4C_ARCH) ? *(u_char *)AUXIO_REG = AUX_MBO|AUX_EJECT|((_X_)?AUX_LED:0) : 0) -#else -#define SET_LED(_X_) -#endif - -static int init_linemon(); -static void close_linemon(); - -/* - * keep here MACHINE AND OS AND ENVIRONMENT DEPENDENT - * timing constants - * - * FOR ABSOLUTE PRECISION YOU NEED TO MEASURE THE TIMING - * SKEW BETWEEN THE HW-PPS SIGNAL AND KERNEL uniqtime() - * YOURSELF. - * - * YOU MUST BE QUALIFIED APPROPRIATELY FOR THESE TYPE - * OF HW MANIPULATION ! - * - * you need an oscilloscope and the permission for HW work - * in order to figure out these timing constants/variables - */ -#ifdef sun -static unsigned long xsdelay = 10; /* assume an SS2 */ -static unsigned long stdelay = 350; - -struct delays -{ - unsigned char mask; /* what to check for */ - unsigned char type; /* what to match */ - unsigned long xsdelay; /* external status direct delay in us */ - unsigned long stdelay; /* STREAMS message delay (M_[UN]HANGUP) */ -} isr_delays[] = -{ - /* - * WARNING: must still be measured - currently taken from Craig Leres ppsdev - */ -#ifdef sun4c - {CPU_ARCH|CPU_MACH, CPU_SUN4C_50, 10, 350}, - {CPU_ARCH|CPU_MACH, CPU_SUN4C_65, 15, 700}, - {CPU_ARCH|CPU_MACH, CPU_SUN4C_75, 10, 350}, -#endif -#ifdef sun4m - {CPU_ARCH|CPU_MACH, CPU_SUN4M_50, 8, 250}, - {CPU_ARCH|CPU_MACH, CPU_SUN4M_690, 8, 250}, -#endif - {0,} -}; - -void setup_delays() -{ - register int i; - - for (i = 0; isr_delays[i].mask; i++) - { - if ((cpu & isr_delays[i].mask) == isr_delays[i].type) - { - xsdelay = isr_delays[i].xsdelay; - stdelay = isr_delays[i].stdelay; - return; - } - } - printf("parse: WARNING: PPS kernel fudge factors unknown for this machine (Type 0x%x) - assuming SS2 (Sun4/75)\n", cpu); -} -#else -#define setup_delays() /* empty - no need for clobbering kernel with this */ -static unsigned long xsdelay = 0; /* assume nothing */ -static unsigned long stdelay = 0; -#endif - -#define M_PARSE 0x0001 -#define M_NOPARSE 0x0002 - -static int -setup_stream(q, mode) - queue_t *q; - int mode; -{ - mblk_t *mp; - - mp = allocb(sizeof(struct stroptions), BPRI_MED); - if (mp) - { - struct stroptions *str = (struct stroptions *)mp->b_rptr; - - str->so_flags = SO_READOPT|SO_HIWAT|SO_LOWAT; - str->so_readopt = (mode == M_PARSE) ? RMSGD : RNORM; - str->so_hiwat = (mode == M_PARSE) ? sizeof(parsetime_t) : 256; - str->so_lowat = 0; - mp->b_datap->db_type = M_SETOPTS; - mp->b_wptr += sizeof(struct stroptions); - putnext(q, mp); - return putctl1(WR(q)->q_next, M_CTL, (mode == M_PARSE) ? MC_SERVICEIMM : - MC_SERVICEDEF); - } - else - { - parseprintf(DD_OPEN,("parse: setup_stream - FAILED - no MEMORY for allocb\n")); - return 0; - } -} - -/*ARGSUSED*/ -static int parseopen(q, dev, flag, sflag) - queue_t *q; - dev_t dev; - int flag; - int sflag; -{ - register mblk_t *mp; - register parsestream_t *parse; - static int notice = 0; - - parseprintf(DD_OPEN,("parse: OPEN\n")); - - if (sflag != MODOPEN) - { /* open only for modules */ - parseprintf(DD_OPEN,("parse: OPEN - FAILED - not MODOPEN\n")); - return OPENFAIL; - } - - if (q->q_ptr != (caddr_t)NULL) - { - u.u_error = EBUSY; - parseprintf(DD_OPEN,("parse: OPEN - FAILED - EXCLUSIVE ONLY\n")); - return OPENFAIL; - } - -#ifdef VDDRV - parsebusy++; -#endif - - q->q_ptr = (caddr_t)kmem_alloc(sizeof(parsestream_t)); - if (q->q_ptr == (caddr_t)0) - { - parseprintf(DD_OPEN,("parse: OPEN - FAILED - no memory\n")); - return OPENFAIL; - } - WR(q)->q_ptr = q->q_ptr; - - parse = (parsestream_t *) q->q_ptr; - bzero((caddr_t)parse, sizeof(*parse)); - parse->parse_queue = q; - parse->parse_status = PARSE_ENABLE; - parse->parse_ppsclockev.tv.tv_sec = 0; - parse->parse_ppsclockev.tv.tv_usec = 0; - parse->parse_ppsclockev.serial = 0; - - if (!parse_ioinit(&parse->parse_io)) - { - /* - * ok guys - beat it - */ - kmem_free((caddr_t)parse, sizeof(parsestream_t)); -#ifdef VDDRV - parsebusy--; -#endif - return OPENFAIL; - } - - if (setup_stream(q, M_PARSE)) - { - (void) init_linemon(q); /* hook up PPS ISR routines if possible */ - setup_delays(); - parseprintf(DD_OPEN,("parse: OPEN - SUCCEEDED\n")); - - /* - * I know that you know the delete key, but you didn't write this - * code, did you ? - So, keep the message in here. - */ - if (!notice) - { - printf("%s: Copyright (c) 1991-1994, Frank Kardel\n", parsesync_vd.Drv_name); - notice = 1; - } - - return 1; - } - else - { - kmem_free((caddr_t)parse, sizeof(parsestream_t)); - -#ifdef VDDRV - parsebusy--; -#endif - return OPENFAIL; - } -} - -/*ARGSUSED*/ -static int parseclose(q, flags) - queue_t *q; - int flags; -{ - register parsestream_t *parse = (parsestream_t *)q->q_ptr; - register unsigned long s; - - parseprintf(DD_CLOSE,("parse: CLOSE\n")); - - s = splhigh(); - - if (parse->parse_dqueue) - close_linemon(parse->parse_dqueue, q); - parse->parse_dqueue = (queue_t *)0; - - (void) splx(s); - - parse_ioend(&parse->parse_io); - - kmem_free((caddr_t)parse, sizeof(parsestream_t)); - - q->q_ptr = (caddr_t)NULL; - WR(q)->q_ptr = (caddr_t)NULL; - -#ifdef VDDRV - parsebusy--; -#endif -} - -/* - * move unrecognized stuff upward - */ -static parsersvc(q) - queue_t *q; -{ - mblk_t *mp; - - while (mp = getq(q)) - { - if (canput(q->q_next) || (mp->b_datap->db_type > QPCTL)) - { - putnext(q, mp); - parseprintf(DD_RSVC,("parse: RSVC - putnext\n")); - } - else - { - putbq(q, mp); - parseprintf(DD_RSVC,("parse: RSVC - flow control wait\n")); - break; - } - } -} - -/* - * do ioctls and - * send stuff down - dont care about - * flow control - */ -static int parsewput(q, mp) - queue_t *q; - register mblk_t *mp; -{ - register int ok = 1; - register mblk_t *datap; - register struct iocblk *iocp; - parsestream_t *parse = (parsestream_t *)q->q_ptr; - - parseprintf(DD_WPUT,("parse: parsewput\n")); - - switch (mp->b_datap->db_type) - { - default: - putnext(q, mp); - break; - - case M_IOCTL: - iocp = (struct iocblk *)mp->b_rptr; - switch (iocp->ioc_cmd) - { - default: - parseprintf(DD_WPUT,("parse: parsewput - forward M_IOCTL\n")); - putnext(q, mp); - break; - - case CIOGETEV: - /* - * taken from Craig Leres ppsclock module (and modified) - */ - datap = allocb(sizeof(struct ppsclockev), BPRI_MED); - if (datap == NULL || mp->b_cont) - { - mp->b_datap->db_type = M_IOCNAK; - iocp->ioc_error = (datap == NULL) ? ENOMEM : EINVAL; - if (datap != NULL) - freeb(datap); - qreply(q, mp); - break; - } - - mp->b_cont = datap; - *(struct ppsclockev *)datap->b_wptr = parse->parse_ppsclockev; - datap->b_wptr += - sizeof(struct ppsclockev) / sizeof(*datap->b_wptr); - mp->b_datap->db_type = M_IOCACK; - iocp->ioc_count = sizeof(struct ppsclockev); - qreply(q, mp); - break; - - case PARSEIOC_ENABLE: - case PARSEIOC_DISABLE: - { - parse->parse_status = (parse->parse_status & ~PARSE_ENABLE) | - (iocp->ioc_cmd == PARSEIOC_ENABLE) ? - PARSE_ENABLE : 0; - if (!setup_stream(RD(q), (parse->parse_status & PARSE_ENABLE) ? - M_PARSE : M_NOPARSE)) - { - mp->b_datap->db_type = M_IOCNAK; - } - else - { - mp->b_datap->db_type = M_IOCACK; - } - qreply(q, mp); - break; - } - - case PARSEIOC_SETSTAT: - case PARSEIOC_GETSTAT: - case PARSEIOC_TIMECODE: - case PARSEIOC_SETFMT: - case PARSEIOC_GETFMT: - case PARSEIOC_SETCS: - if (iocp->ioc_count == sizeof(parsectl_t)) - { - parsectl_t *dct = (parsectl_t *)mp->b_cont->b_rptr; - - switch (iocp->ioc_cmd) - { - case PARSEIOC_GETSTAT: - parseprintf(DD_WPUT,("parse: parsewput - PARSEIOC_GETSTAT\n")); - ok = parse_getstat(dct, &parse->parse_io); - break; - - case PARSEIOC_SETSTAT: - parseprintf(DD_WPUT,("parse: parsewput - PARSEIOC_SETSTAT\n")); - ok = parse_setstat(dct, &parse->parse_io); - break; - - case PARSEIOC_TIMECODE: - parseprintf(DD_WPUT,("parse: parsewput - PARSEIOC_TIMECODE\n")); - ok = parse_timecode(dct, &parse->parse_io); - break; - - case PARSEIOC_SETFMT: - parseprintf(DD_WPUT,("parse: parsewput - PARSEIOC_SETFMT\n")); - ok = parse_setfmt(dct, &parse->parse_io); - break; - - case PARSEIOC_GETFMT: - parseprintf(DD_WPUT,("parse: parsewput - PARSEIOC_GETFMT\n")); - ok = parse_getfmt(dct, &parse->parse_io); - break; - - case PARSEIOC_SETCS: - parseprintf(DD_WPUT,("parse: parsewput - PARSEIOC_SETCS\n")); - ok = parse_setcs(dct, &parse->parse_io); - break; - } - mp->b_datap->db_type = ok ? M_IOCACK : M_IOCNAK; - } - else - { - mp->b_datap->db_type = M_IOCNAK; - } - parseprintf(DD_WPUT,("parse: parsewput qreply - %s\n", (mp->b_datap->db_type == M_IOCNAK) ? "M_IOCNAK" : "M_IOCACK")); - qreply(q, mp); - break; - } - } -} - -/* - * read characters from streams buffers - */ -static unsigned long rdchar(mp) - register mblk_t **mp; -{ - while (*mp != (mblk_t *)NULL) - { - if ((*mp)->b_wptr - (*mp)->b_rptr) - { - return (unsigned long)(*(unsigned char *)((*mp)->b_rptr++)); - } - else - { - register mblk_t *mmp = *mp; - - *mp = (*mp)->b_cont; - freeb(mmp); - } - } - return ~0; -} - -/* - * convert incoming data - */ -static int parserput(q, mp) - queue_t *q; - mblk_t *mp; -{ - unsigned char type; - - switch (type = mp->b_datap->db_type) - { - default: - /* - * anything we don't know will be put on queue - * the service routine will move it to the next one - */ - parseprintf(DD_RPUT,("parse: parserput - forward type 0x%x\n", type)); - if (canput(q->q_next) || (mp->b_datap->db_type > QPCTL)) - { - putnext(q, mp); - } - else - putq(q, mp); - break; - - case M_BREAK: - case M_DATA: - { - register parsestream_t * parse = (parsestream_t *)q->q_ptr; - register mblk_t *nmp; - register unsigned long ch; - timestamp_t ctime; - - /* - * get time on packet delivery - */ - uniqtime(&ctime.tv); - - if (!(parse->parse_status & PARSE_ENABLE)) - { - parseprintf(DD_RPUT,("parse: parserput - parser disabled - forward type 0x%x\n", type)); - if (canput(q->q_next) || (mp->b_datap->db_type > QPCTL)) - { - putnext(q, mp); - } - else - putq(q, mp); - } - else - { - parseprintf(DD_RPUT,("parse: parserput - M_%s\n", (type == M_DATA) ? "DATA" : "BREAK")); - - if (type == M_DATA) - { - /* - * parse packet looking for start an end characters - */ - while (mp != (mblk_t *)NULL) - { - ch = rdchar(&mp); - if (ch != ~0 && parse_ioread(&parse->parse_io, (char)ch, &ctime)) - { - /* - * up up and away (hopefully ...) - * don't press it if resources are tight or nobody wants it - */ - nmp = (mblk_t *)NULL; - if (canput(parse->parse_queue->q_next) && (nmp = allocb(sizeof(parsetime_t), BPRI_MED))) - { - bcopy((caddr_t)&parse->parse_io.parse_dtime, (caddr_t)nmp->b_rptr, sizeof(parsetime_t)); - nmp->b_wptr += sizeof(parsetime_t); - putnext(parse->parse_queue, nmp); - } - else - if (nmp) freemsg(nmp); - parse_iodone(&parse->parse_io); - } - } - } - else - { - if (parse_ioread(&parse->parse_io, (char)0, &ctime)) - { - /* - * up up and away (hopefully ...) - * don't press it if resources are tight or nobody wants it - */ - nmp = (mblk_t *)NULL; - if (canput(parse->parse_queue->q_next) && (nmp = allocb(sizeof(parsetime_t), BPRI_MED))) - { - bcopy((caddr_t)&parse->parse_io.parse_dtime, (caddr_t)nmp->b_rptr, sizeof(parsetime_t)); - nmp->b_wptr += sizeof(parsetime_t); - putnext(parse->parse_queue, nmp); - } - else - if (nmp) freemsg(nmp); - parse_iodone(&parse->parse_io); - } - freemsg(mp); - } - break; - } - } - - /* - * CD PPS support for non direct ISR hack - */ - case M_HANGUP: - case M_UNHANGUP: - { - register parsestream_t * parse = (parsestream_t *)q->q_ptr; - timestamp_t ctime; - register mblk_t *nmp; - register int status = cd_invert ^ (type == M_HANGUP); - - SET_LED(status); - - uniqtime(&ctime.tv); - - TIMEVAL_USADD(&ctime.tv, stdelay); - - parseprintf(DD_RPUT,("parse: parserput - M_%sHANGUP\n", (type == M_HANGUP) ? "" : "UN")); - - if ((parse->parse_status & PARSE_ENABLE) && - parse_iopps(&parse->parse_io, status ? SYNC_ONE : SYNC_ZERO, &ctime)) - { - nmp = (mblk_t *)NULL; - if (canput(parse->parse_queue->q_next) && (nmp = allocb(sizeof(parsetime_t), BPRI_MED))) - { - bcopy((caddr_t)&parse->parse_io.parse_dtime, (caddr_t)nmp->b_rptr, sizeof(parsetime_t)); - nmp->b_wptr += sizeof(parsetime_t); - putnext(parse->parse_queue, nmp); - } - else - if (nmp) freemsg(nmp); - parse_iodone(&parse->parse_io); - freemsg(mp); - } - else - if (canput(q->q_next) || (mp->b_datap->db_type > QPCTL)) - { - putnext(q, mp); - } - else - putq(q, mp); - - if (status) - { - parse->parse_ppsclockev.tv = ctime.tv; - ++(parse->parse_ppsclockev.serial); - } - } - } -} - -static int init_zs_linemon(); /* handle line monitor for "zs" driver */ -static void close_zs_linemon(); -static void zs_xsisr(); /* zs external status interupt handler */ - -/*-------------------- CD isr status monitor ---------------*/ - -static int init_linemon(q) - register queue_t *q; -{ - register queue_t *dq; - - dq = WR(q); - /* - * we ARE doing very bad things down here (basically stealing ISR - * hooks) - * - * so we chase down the STREAMS stack searching for the driver - * and if this is a known driver we insert our ISR routine for - * status changes in to the ExternalStatus handling hook - */ - while (dq->q_next) - { - dq = dq->q_next; /* skip down to driver */ - } - - /* - * find appropriate driver dependent routine - */ - if (dq->q_qinfo && dq->q_qinfo->qi_minfo) - { - register char *dname = dq->q_qinfo->qi_minfo->mi_idname; - - parseprintf(DD_INSTALL, ("init_linemon: driver is \"%s\"\n", dname)); - -#ifdef sun - if (dname && !strcmp(dname, "zs")) - { - return init_zs_linemon(dq, q); - } - else -#endif - { - parseprintf(DD_INSTALL, ("init_linemon: driver \"%s\" not suitable for CD monitoring\n", dname)); - return 0; - } - } - parseprintf(DD_INSTALL, ("init_linemon: cannot find driver\n")); - return 0; -} - -static void close_linemon(q, my_q) - register queue_t *q; - register queue_t *my_q; -{ - /* - * find appropriate driver dependent routine - */ - if (q->q_qinfo && q->q_qinfo->qi_minfo) - { - register char *dname = q->q_qinfo->qi_minfo->mi_idname; - -#ifdef sun - if (dname && !strcmp(dname, "zs")) - { - close_zs_linemon(q, my_q); - return; - } - parseprintf(DD_INSTALL, ("close_linemon: cannot find driver close routine for \"%s\"\n", dname)); -#endif - } - parseprintf(DD_INSTALL, ("close_linemon: cannot find driver name\n")); -} - -#ifdef sun -#include <sundev/zsreg.h> -#include <sundev/zscom.h> -#include <sundev/zsvar.h> - -struct savedzsops -{ - struct zsops zsops; - struct zsops *oldzsops; -}; - -struct zsops *emergencyzs; - -static int init_zs_linemon(q, my_q) - register queue_t *q; - register queue_t *my_q; -{ - register struct zscom *zs; - register struct savedzsops *szs; - register parsestream_t *parsestream = (parsestream_t *)my_q->q_ptr; - /* - * we expect the zsaline pointer in the q_data pointer - * from there on we insert our on EXTERNAL/STATUS ISR routine - * into the interrupt path, before the standard handler - */ - zs = ((struct zsaline *)q->q_ptr)->za_common; - if (!zs) - { - /* - * well - not found on startup - just say no (shouldn't happen though) - */ - return 0; - } - else - { - unsigned long s; - - /* - * we do a direct replacement, in case others fiddle also - * if somebody else grabs our hook and we disconnect - * we are in DEEP trouble - panic is likely to be next, sorry - */ - szs = (struct savedzsops *) kmem_alloc(sizeof(struct savedzsops)); - - if (szs == (struct savedzsops *)0) - { - parseprintf(DD_INSTALL, ("init_zs_linemon: CD monitor NOT installed - no memory\n")); - - return 0; - } - else - { - parsestream->parse_data = (void *)szs; - - s = splhigh(); - - parsestream->parse_dqueue = q; /* remember driver */ - - szs->zsops = *zs->zs_ops; - szs->zsops.zsop_xsint = (int (*)())zs_xsisr; /* place our bastard */ - szs->oldzsops = zs->zs_ops; - emergencyzs = zs->zs_ops; - - zsopinit(zs, &szs->zsops); /* hook it up */ - - (void) splx(s); - - parseprintf(DD_INSTALL, ("init_zs_linemon: CD monitor installed\n")); - - return 1; - } - } -} - -/* - * unregister our ISR routine - must call under splhigh() - */ -static void close_zs_linemon(q, my_q) - register queue_t *q; - register queue_t *my_q; -{ - register struct zscom *zs; - register parsestream_t *parsestream = (parsestream_t *)my_q->q_ptr; - - zs = ((struct zsaline *)q->q_ptr)->za_common; - if (!zs) - { - /* - * well - not found on startup - just say no (shouldn't happen though) - */ - return; - } - else - { - register struct savedzsops *szs = (struct savedzsops *)parsestream->parse_data; - - zsopinit(zs, szs->oldzsops); /* reset to previous handler functions */ - - kmem_free((caddr_t)szs, sizeof (struct savedzsops)); - - parseprintf(DD_INSTALL, ("close_zs_linemon: CD monitor deleted\n")); - return; - } -} - -#define MAXDEPTH 50 /* maximum allowed stream crawl */ - -#ifdef PPS_SYNC -extern hardpps(); -extern struct timeval time; -#endif - -/* - * take external status interrupt (only CD interests us) - */ -static void zs_xsisr(zs) - register struct zscom *zs; -{ - register struct zsaline *za = (struct zsaline *)zs->zs_priv; - register struct zscc_device *zsaddr = zs->zs_addr; - register queue_t *q; - register unsigned char zsstatus; - register int loopcheck; - register char *dname; -#ifdef PPS_SYNC - register int s; - register long usec; -#endif - - /* - * pick up current state - */ - zsstatus = zsaddr->zscc_control; - - if ((za->za_rr0 ^ zsstatus) & (ZSRR0_CD|ZSRR0_SYNC)) - { - timestamp_t cdevent; - register int status; - - /* - * CONDITIONAL external measurement support - */ - SET_LED(zsstatus & (ZSRR0_CD|ZSRR0_SYNC)); /* - * inconsistent with upper SET_LED, but this - * is for oscilloscope business anyway and we - * are just interested in edge delays in the - * lower us range - */ -#ifdef PPS_SYNC - s = splclock(); - usec = time.tv_usec; -#endif - /* - * time stamp - */ - uniqtime(&cdevent.tv); - -#ifdef PPS_SYNC - splx(s); -#endif - - /* - * logical state - */ - status = cd_invert ? (zsstatus & ZSRR0_SYNC) == 0 : (zsstatus & ZSRR0_SYNC) != 0; - -#ifdef PPS_SYNC - if (status) - { - usec = cdevent.tv.tv_usec - usec; - if (usec < 0) - usec += 1000000; - - hardpps(&cdevent.tv, usec); - } -#endif - - TIMEVAL_USADD(&cdevent.tv, xsdelay); - - q = za->za_ttycommon.t_readq; - - /* - * ok - now the hard part - find ourself - */ - loopcheck = MAXDEPTH; - - while (q) - { - if (q->q_qinfo && q->q_qinfo->qi_minfo) - { - dname = q->q_qinfo->qi_minfo->mi_idname; - - if (!strcmp(dname, parseinfo.st_rdinit->qi_minfo->mi_idname)) - { - /* - * back home - phew (hopping along stream queues might - * prove dangerous to your health) - */ - - if ((((parsestream_t *)q->q_ptr)->parse_status & PARSE_ENABLE) && - parse_iopps(&((parsestream_t *)q->q_ptr)->parse_io, status ? SYNC_ONE : SYNC_ZERO, &cdevent)) - { - /* - * XXX - currently we do not pass up the message, as - * we should. - * for a correct behaviour wee need to block out - * processing until parse_iodone has been posted via - * a softcall-ed routine which does the message pass-up - * right now PPS information relies on input being - * received - */ - parse_iodone(&((parsestream_t *)q->q_ptr)->parse_io); - } - - if (status) - { - ((parsestream_t *)q->q_ptr)->parse_ppsclockev.tv = cdevent.tv; - ++(((parsestream_t *)q->q_ptr)->parse_ppsclockev.serial); - } - - parseprintf(DD_ISR, ("zs_xsisr: CD event %s has been posted for \"%s\"\n", status ? "ONE" : "ZERO", dname)); - break; - } - } - - q = q->q_next; - - if (!loopcheck--) - { - panic("zs_xsisr: STREAMS Queue corrupted - CD event"); - } - } - - /* - * only pretend that CD has been handled - */ - za->za_rr0 = za->za_rr0 & ~(ZSRR0_CD|ZSRR0_SYNC) | zsstatus & (ZSRR0_CD|ZSRR0_SYNC); - ZSDELAY(2); - - if (!((za->za_rr0 ^ zsstatus) & ~(ZSRR0_CD|ZSRR0_SYNC))) - { - /* - * all done - kill status indication and return - */ - zsaddr->zscc_control = ZSWR0_RESET_STATUS; /* might kill other conditions here */ - return; - } - } - - /* - * we are now gathered here to process some unusual external status - * interrupts. - * any CD events have also been handled and shouldn't be processed - * by the original routine (unless we have a VERY busy port pin) - * some initializations are done here, which could have been done before for - * both code paths but have been avioded for minimum path length to - * the uniq_time routine - */ - dname = (char *) 0; - q = za->za_ttycommon.t_readq; - - loopcheck = MAXDEPTH; - - /* - * the real thing for everything else ... - */ - while (q) - { - if (q->q_qinfo && q->q_qinfo->qi_minfo) - { - dname = q->q_qinfo->qi_minfo->mi_idname; - if (!strcmp(dname, parseinfo.st_rdinit->qi_minfo->mi_idname)) - { - register int (*zsisr)(); - - /* - * back home - phew (hopping along stream queues might - * prove dangerous to your health) - */ - if (zsisr = ((struct savedzsops *)((parsestream_t *)q->q_ptr)->parse_data)->oldzsops->zsop_xsint) - (void)zsisr(zs); - else - panic("zs_xsisr: unable to locate original ISR"); - - parseprintf(DD_ISR, ("zs_xsisr: non CD event was processed for \"%s\"\n", dname)); - /* - * now back to our program ... - */ - return; - } - } - - q = q->q_next; - - if (!loopcheck--) - { - panic("zs_xsisr: STREAMS Queue corrupted - non CD event"); - } - } - - /* - * last resort - shouldn't even come here as it indicates - * corrupted TTY structures - */ - printf("zs_zsisr: looking for \"%s\" - found \"%s\" - taking EMERGENCY path\n", parseinfo.st_rdinit->qi_minfo->mi_idname, dname ? dname : "-NIL-"); - - if (emergencyzs && emergencyzs->zsop_xsint) - emergencyzs->zsop_xsint(zs); - else - panic("zs_xsisr: no emergency ISR handler"); -} -#endif /* sun */ - -/* - * History: - * - * parsestreams.c,v - * Revision 3.22 1994/06/01 10:41:16 kardel - * CD seems to happen on ZSRR0_SYNC - * - * Revision 3.21 1994/06/01 08:18:57 kardel - * look at CD only - * - * Revision 3.20 1994/05/30 09:57:43 kardel - * kmem_alloc checking - * - * Revision 3.19 1994/02/24 16:33:54 kardel - * CD events can olso be posted on sync flag - * - * Revision 3.18 1994/02/24 14:12:58 kardel - * initial PPS_SYNC support version - * - * Revision 3.17 1994/02/20 15:18:02 kardel - * rcs id cleanup - * - * Revision 3.16 1994/02/15 22:39:50 kardel - * memory leak on open failure closed - * - * Revision 3.15 1994/02/13 19:16:50 kardel - * updated verbose Copyright message - * - * Revision 3.14 1994/02/02 17:45:38 kardel - * rcs ids fixed - * - * Revision 3.12 1994/01/25 19:05:30 kardel - * 94/01/23 reconcilation - * - * Revision 3.11 1994/01/23 17:22:07 kardel - * 1994 reconcilation - * - * Revision 3.10 1993/12/15 12:48:58 kardel - * fixed message loss on M_*HANHUP messages - * - * Revision 3.9 1993/11/05 15:34:55 kardel - * shut up nice feature detection - * - * Revision 3.8 1993/10/22 14:27:56 kardel - * Oct. 22nd 1993 reconcilation - * - * Revision 3.7 1993/10/10 18:13:53 kardel - * Makefile reorganisation, file relocation - * - * Revision 3.6 1993/10/09 15:01:18 kardel - * file structure unified - * - * Revision 3.5 1993/10/04 07:59:31 kardel - * Well, at least we should know that a the tv_usec field should be in the range 0..999999 - * - * Revision 3.4 1993/09/26 23:41:33 kardel - * new parse driver logic - * - * Revision 3.3 1993/09/11 00:38:34 kardel - * LINEMON must also cover M_[UN]HANGUP handling - * - * Revision 3.2 1993/07/06 10:02:56 kardel - * DCF77 driver goes generic... - * - */ diff --git a/usr.sbin/xntpd/parse/util/Makefile b/usr.sbin/xntpd/parse/util/Makefile deleted file mode 100644 index 496b70e3f58d..000000000000 --- a/usr.sbin/xntpd/parse/util/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -# -# $FreeBSD$ -# - -CFLAGS+= -I${.CURDIR}/../../include -CFLAGS+= -DNTP_POSIX_SOURCE -DUSE_PROTOTYPES -CFLAGS+= -DSYS_FREEBSD -DBOEDER -DHAVE_TERMIOS -DHAVE_BSD_NICE - -.if exists(${.OBJDIR}/../../lib) -LDADD+= -L${.OBJDIR}/../../lib -DPADD+= -L${.OBJDIR}/../../lib/libntp.a -.else -LDADD+= -L${.CURDIR}/../../lib -DPADD+= -L${.CURDIR}/../../lib/libntp.a -.endif - -LDADD+= -lntp -BINDIR= /usr/sbin -PROG= dcfd - -SRCS= dcfd.c -NOMAN= - -.include <bsd.prog.mk> diff --git a/usr.sbin/xntpd/parse/util/Makefile.tmpl b/usr.sbin/xntpd/parse/util/Makefile.tmpl deleted file mode 100644 index aa0b26225952..000000000000 --- a/usr.sbin/xntpd/parse/util/Makefile.tmpl +++ /dev/null @@ -1,49 +0,0 @@ -# -# /src/NTP/REPOSITORY/v3/parse/util/Makefile.tmpl,v 3.12 1994/01/25 19:05:39 kardel Exp -# -COMPILER= cc -DEFS= -DEFS_OPT= -DEFS_LOCAL= -CLOCKDEFS= -INCL= -COPTS= -O -INSTALL= install -BINDIR= -# -CFLAGS= $(COPTS) $(DEFS) $(DEFS_LOCAL) $(INCL) -I../../include -CC= $(COMPILER) -TOP=../../ -# -EXECS=parsetest testdcf dcfd - -all: - @echo $(DEFS) $(DEFS_LOCAL) $(CLOCKDEFS) | \ - awk '/-DSTREAM/ && /-DPARSE/ && /-DCLOCK_RAWDCF/ && ( /-DSYS_SUNOS/ || /-DSYS_SOLARIS/ ) { makeit = 1 } \ - END { if (makeit) \ - { print "$(MAKE) $(MFLAGS) MFLAGS=\"$(MFLAGS)\" parsetest"; } \ - }' | \ - sh - @echo $(DEFS) $(DEFS_LOCAL) $(CLOCKDEFS) | \ - awk '/-DPARSE/ && /-DCLOCK_RAWDCF/ && ( /-DSYS_SUNOS/ || /-DSYS_SOLARIS/ ) { makeit = 1 } \ - END { if (makeit) \ - { print "$(MAKE) $(MFLAGS) MFLAGS=\"$(MFLAGS)\" testdcf"; } \ - }' | \ - sh - @echo $(DEFS) $(DEFS_LOCAL) $(CLOCKDEFS) | \ - awk '/-DPARSE/ && /-DCLOCK_RAWDCF/ && ( /-DSYS_SUNOS/ || /-DSYS_SOLARIS/ ) { makeit = 1 } \ - END { if (makeit) \ - { print "$(MAKE) $(MFLAGS) MFLAGS=\"$(MFLAGS)\" dcfd"; } \ - }' | \ - sh - -clean: - -@rm -f $(EXECS) *.o - -distclean: clean - -@rm -f *.orig *.rej .version Makefile - -install: - @echo "--- DCF77 utilities should be installed manually" - @#[ -f testdcf ] && $(INSTALL) -c -m 0755 testdcf $(BINDIR) || true - @#[ -f dcfd ] && $(INSTALL) -c -m 0755 dcfd $(BINDIR) || true diff --git a/usr.sbin/xntpd/parse/util/README b/usr.sbin/xntpd/parse/util/README deleted file mode 100644 index e1c80d49e3c8..000000000000 --- a/usr.sbin/xntpd/parse/util/README +++ /dev/null @@ -1,19 +0,0 @@ -This directory contains some DCF77 related programs. -They have not yet fully been ported to other architectures then Sun with -SunOS 4.x. So if you want to try them you are on your own - a little -porting may be necessary. - -parsetest: simple parse streams module test -testdcf: simple DCF77 raw impulse test program via 50Baud RS232 -dcfd: simple DCF77 raw impulse receiver with NTP loopfilter - mechanics for synchronisation (allows DCF77 synchronisation - without network code in a nutshell) - -Frank Kardel - ----------------- - -1995-03-20 Dcfd has been ported to FreeBSD 2.0, it works with a - Boeder Receiver connected to a 50Baud RS232. - -Vincenzo Capuano diff --git a/usr.sbin/xntpd/parse/util/dcfd.c b/usr.sbin/xntpd/parse/util/dcfd.c deleted file mode 100644 index 0acfa72a1b9d..000000000000 --- a/usr.sbin/xntpd/parse/util/dcfd.c +++ /dev/null @@ -1,1643 +0,0 @@ -/* - * /src/NTP/REPOSITORY/v3/parse/util/dcfd.c,v 3.18 1994/05/12 12:49:23 kardel Exp - * - * dcfd.c,v 3.18 1994/05/12 12:49:23 kardel Exp - * - * Ported to FreeBSD 2.0 1995/03/20 by Vincenzo Capuano - * - * DCF77 100/200ms pulse synchronisation daemon program (via 50Baud serial line) - * - * Features: - * DCF77 decoding - * NTP loopfilter logic for local clock - * interactive display for debugging - * - * Lacks: - * Leap second handling (at that level you should switch to xntp3 - really!) - * - * Copyright (c) 1993,1994 - * Frank Kardel, Friedrich-Alexander Universitaet Erlangen-Nuernberg - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * This program may not be sold or used for profit without prior - * written consent of the author. - */ - -#include <unistd.h> -#include <stdio.h> -#include <fcntl.h> -#include <sys/types.h> -#include <sys/time.h> -#include <sys/signal.h> -#include <sys/errno.h> -#include <syslog.h> - -/* - * NTP compilation environment - */ -#ifdef USE_PROTOTYPES -#include "ntp_stdlib.h" -#include <signal.h> -#include <stdio.h> -#endif - -#ifdef SYS_LINUX -#include "ntp_timex.h" -#endif - -/* - * select which terminal handling to use (currently only SysV variants) - */ -#if defined(HAVE_TERMIOS) || defined(STREAM) -#include <termios.h> -#define TTY_GETATTR(_FD_, _ARG_) tcgetattr((_FD_), (_ARG_)) -#define TTY_SETATTR(_FD_, _ARG_) tcsetattr((_FD_), TCSANOW, (_ARG_)) -#endif - -#if defined(HAVE_TERMIO) || defined(HAVE_SYSV_TTYS) -#include <termio.h> -#define TTY_GETATTR(_FD_, _ARG_) ioctl((_FD_), TCGETA, (_ARG_)) -#define TTY_SETATTR(_FD_, _ARG_) ioctl((_FD_), TCSETAW, (_ARG_)) -#endif - -#ifndef TTY_GETATTR -MUST DEFINE ONE OF "HAVE_TERMIOS" or "HAVE_TERMIO" -#endif - -#ifndef dysize -#define dysize(_x_) (((_x_) % 4) ? 365 : (((_x_) % 100) ? 366 : ((_x_) % 400 ? 365 : 366 ))) -#endif - -#define timernormalize(_a_) \ - if ((_a_)->tv_usec >= 1000000) \ - { \ - (_a_)->tv_sec += (_a_)->tv_usec / 1000000; \ - (_a_)->tv_usec = (_a_)->tv_usec % 1000000; \ - } \ - if ((_a_)->tv_usec < 0) \ - { \ - (_a_)->tv_sec -= 1 + -(_a_)->tv_usec / 1000000; \ - (_a_)->tv_usec = 1000000 - (-(_a_)->tv_usec % 1000000); \ - } - -#define timeradd(_a_, _b_) \ - (_a_)->tv_sec += (_b_)->tv_sec; \ - (_a_)->tv_usec += (_b_)->tv_usec; \ - timernormalize((_a_)) - -#define timersub(_a_, _b_) \ - (_a_)->tv_sec -= (_b_)->tv_sec; \ - (_a_)->tv_usec -= (_b_)->tv_usec; \ - timernormalize((_a_)) - -/* - * debug macros - */ -#define PRINTF if (interactive) printf -#define LPRINTF if (interactive && loop_filter_debug) printf - -#ifdef DEBUG -#define dprintf(_x_) PRINTF _x_ -#else -#define dprintf(_x_) -#endif - -extern int errno; - -/* - * display received data (avoids also detaching from tty) - */ -static int interactive = 0; - -/* - * display loopfilter (clock control) variables - */ -static int loop_filter_debug = 0; - -/* - * do not set/adjust system time - */ -static int no_set = 0; - -/* - * time that passes between start of DCF impulse and time stamping (fine - * adjustment) in microseconds (receiver/OS dependent) - */ -#define DEFAULT_DELAY 230000 /* rough estimate */ - -/* - * The two states we can be in - eithe we receive nothing - * usable or we have the correct time - */ -#define NO_SYNC 0x01 -#define SYNC 0x02 - -static int sync_state = NO_SYNC; -static time_t last_sync; - -static unsigned long ticks = 0; - -static char pat[] = "-\\|/"; - -#define LINES (24-2) /* error lines after which the two headlines are repeated */ - -#define MAX_UNSYNC (10*60) /* allow synchronisation loss for 10 minutes */ -#define NOTICE_INTERVAL (20*60) /* mention missing synchronisation every 20 minutes */ - -/* - * clock adjustment PLL - see NTP protocol spec (RFC1305) for details - */ - -#define USECSCALE 10 -#define TIMECONSTANT 2 -#define ADJINTERVAL 0 -#define FREQ_WEIGHT 18 -#define PHASE_WEIGHT 7 -#define MAX_DRIFT 0x3FFFFFFF - -#define R_SHIFT(_X_, _Y_) (((_X_) < 0) ? -(-(_X_) >> (_Y_)) : ((_X_) >> (_Y_))) - -static struct timeval max_adj_offset = { 0, 128000 }; - -static long clock_adjust = 0; /* current adjustment value (usec * 2^USECSCALE) */ -static long drift_comp = 0; /* accumulated drift value (usec / ADJINTERVAL) */ -static long adjustments = 0; -static char skip_adjust = 1; /* discard first adjustment (bad samples) */ - -/* - * DCF77 state flags - */ -#define DCFB_ANNOUNCE 0x0001 /* switch time zone warning (DST switch) */ -#define DCFB_DST 0x0002 /* DST in effect */ -#define DCFB_LEAP 0x0004 /* LEAP warning (1 hour prior to occurence) */ -#define DCFB_ALTERNATE 0x0008 /* alternate antenna used */ - -struct clocktime /* clock time broken up from time code */ -{ - long wday; /* Day of week: 1: Monday - 7: Sunday */ - long day; - long month; - long year; - long hour; - long minute; - long second; - long usecond; - long utcoffset; /* in minutes */ - long flags; /* current clock status (DCF77 state flags) */ -}; - -typedef struct clocktime clocktime_t; - -/* - * (usually) quick constant multiplications - */ -#define TIMES10(_X_) (((_X_) << 3) + ((_X_) << 1)) /* *8 + *2 */ -#define TIMES24(_X_) (((_X_) << 4) + ((_X_) << 3)) /* *16 + *8 */ -#define TIMES60(_X_) ((((_X_) << 4) - (_X_)) << 2) /* *(16 - 1) *4 */ -/* - * generic abs() function - */ -#define abs(_x_) (((_x_) < 0) ? -(_x_) : (_x_)) - -/* - * conversion related return/error codes - */ -#define CVT_MASK 0x0000000F /* conversion exit code */ -#define CVT_NONE 0x00000001 /* format not applicable */ -#define CVT_FAIL 0x00000002 /* conversion failed - error code returned */ -#define CVT_OK 0x00000004 /* conversion succeeded */ -#define CVT_BADFMT 0x00000010 /* general format error - (unparsable) */ -#define CVT_BADDATE 0x00000020 /* invalid date */ -#define CVT_BADTIME 0x00000040 /* invalid time */ - -/* - * DCF77 raw time code - * - * From "Zur Zeit", Physikalisch-Technische Bundesanstalt (PTB), Braunschweig - * und Berlin, Maerz 1989 - * - * Timecode transmission: - * AM: - * time marks are send every second except for the second before the - * next minute mark - * time marks consist of a reduction of transmitter power to 25% - * of the nominal level - * the falling edge is the time indication (on time) - * time marks of a 100ms duration constitute a logical 0 - * time marks of a 200ms duration constitute a logical 1 - * FM: - * see the spec. (basically a (non-)inverted psuedo random phase shift) - * - * Encoding: - * Second Contents - * 0 - 10 AM: free, FM: 0 - * 11 - 14 free - * 15 R - alternate antenna - * 16 A1 - expect zone change (1 hour before) - * 17 - 18 Z1,Z2 - time zone - * 0 0 illegal - * 0 1 MEZ (MET) - * 1 0 MESZ (MED, MET DST) - * 1 1 illegal - * 19 A2 - expect leap insertion/deletion (1 hour before) - * 20 S - start of time code (1) - * 21 - 24 M1 - BCD (lsb first) Minutes - * 25 - 27 M10 - BCD (lsb first) 10 Minutes - * 28 P1 - Minute Parity (even) - * 29 - 32 H1 - BCD (lsb first) Hours - * 33 - 34 H10 - BCD (lsb first) 10 Hours - * 35 P2 - Hour Parity (even) - * 36 - 39 D1 - BCD (lsb first) Days - * 40 - 41 D10 - BCD (lsb first) 10 Days - * 42 - 44 DW - BCD (lsb first) day of week (1: Monday -> 7: Sunday) - * 45 - 49 MO - BCD (lsb first) Month - * 50 MO0 - 10 Months - * 51 - 53 Y1 - BCD (lsb first) Years - * 54 - 57 Y10 - BCD (lsb first) 10 Years - * 58 P3 - Date Parity (even) - * 59 - usually missing (minute indication), except for leap insertion - */ - -/*----------------------------------------------------------------------- - * conversion table to map DCF77 bit stream into data fields. - * Encoding: - * Each field of the DCF77 code is described with two adjacent entries in - * this table. The first entry specifies the offset into the DCF77 data stream - * while the length is given as the difference between the start index and - * the start index of the following field. - */ -static struct rawdcfcode -{ - char offset; /* start bit */ -} rawdcfcode[] = -{ - { 0 }, { 15 }, { 16 }, { 17 }, { 19 }, { 20 }, { 21 }, { 25 }, { 28 }, { 29 }, - { 33 }, { 35 }, { 36 }, { 40 }, { 42 }, { 45 }, { 49 }, { 50 }, { 54 }, { 58 }, { 59 } -}; - -/*----------------------------------------------------------------------- - * symbolic names for the fields of DCF77 describes in "rawdcfcode". - * see comment above for the structure of the DCF77 data - */ -#define DCF_M 0 -#define DCF_R 1 -#define DCF_A1 2 -#define DCF_Z 3 -#define DCF_A2 4 -#define DCF_S 5 -#define DCF_M1 6 -#define DCF_M10 7 -#define DCF_P1 8 -#define DCF_H1 9 -#define DCF_H10 10 -#define DCF_P2 11 -#define DCF_D1 12 -#define DCF_D10 13 -#define DCF_DW 14 -#define DCF_MO 15 -#define DCF_MO0 16 -#define DCF_Y1 17 -#define DCF_Y10 18 -#define DCF_P3 19 - -/*----------------------------------------------------------------------- - * parity field table (same encoding as rawdcfcode) - * This table describes the sections of the DCF77 code that are - * parity protected - */ -static struct partab -{ - char offset; /* start bit of parity field */ -} partab[] = -{ - { 21 }, { 29 }, { 36 }, { 59 } -}; - -/*----------------------------------------------------------------------- - * offsets for parity field descriptions - */ -#define DCF_P_P1 0 -#define DCF_P_P2 1 -#define DCF_P_P3 2 - -/*----------------------------------------------------------------------- - * legal values for time zone information - */ -#define DCF_Z_MET 0x2 -#define DCF_Z_MED 0x1 - -/*----------------------------------------------------------------------- - * symbolic representation if the DCF77 data stream - */ -static struct dcfparam -{ - unsigned char onebits[60]; - unsigned char zerobits[60]; -} dcfparam = -{ - "###############RADMLS1248124P124812P1248121241248112481248P", /* 'ONE' representation */ - "--------------------s-------p------p----------------------p" /* 'ZERO' representation */ -}; - -/*----------------------------------------------------------------------- - * extract a bitfield from DCF77 datastream - * All numeric field are LSB first. - * buf holds a pointer to a DCF77 data buffer in symbolic - * representation - * idx holds the index to the field description in rawdcfcode - */ -static unsigned long ext_bf(buf, idx) - register unsigned char *buf; - register int idx; -{ - register unsigned long sum = 0; - register int i, first; - - first = rawdcfcode[idx].offset; - - for (i = rawdcfcode[idx+1].offset - 1; i >= first; i--) - { - sum <<= 1; - sum |= (buf[i] != dcfparam.zerobits[i]); - } - return sum; -} - -/*----------------------------------------------------------------------- - * check even parity integrity for a bitfield - * - * buf holds a pointer to a DCF77 data buffer in symbolic - * representation - * idx holds the index to the field description in partab - */ -static unsigned pcheck(buf, idx) - register unsigned char *buf; - register int idx; -{ - register int i,last; - register unsigned psum = 1; - - last = partab[idx+1].offset; - - for (i = partab[idx].offset; i < last; i++) - psum ^= (buf[i] != dcfparam.zerobits[i]); - - return psum; -} - -/*----------------------------------------------------------------------- - * convert a DCF77 data buffer into wall clock time + flags - * - * buffer holds a pointer to a DCF77 data buffer in symbolic - * representation - * size describes the length of DCF77 information in bits (represented - * as chars in symbolic notation - * clock points to a wall clock time description of the DCF77 data (result) - */ -static unsigned long convert_rawdcf(buffer, size, clock) - register unsigned char *buffer; - register int size; - register clocktime_t *clock; -{ - if (size < 57) - { - PRINTF("%-30s", "*** INCOMPLETE"); - return CVT_NONE; - } - - /* - * check Start and Parity bits - */ - if ((ext_bf(buffer, DCF_S) == 1) && - pcheck(buffer, DCF_P_P1) && - pcheck(buffer, DCF_P_P2) && - pcheck(buffer, DCF_P_P3)) - { - /* - * buffer OK - extract all fields and build wall clock time from them - */ - - clock->flags = 0; - clock->usecond= 0; - clock->second = 0; - clock->minute = ext_bf(buffer, DCF_M10); - clock->minute = TIMES10(clock->minute) + ext_bf(buffer, DCF_M1); - clock->hour = ext_bf(buffer, DCF_H10); - clock->hour = TIMES10(clock->hour) + ext_bf(buffer, DCF_H1); - clock->day = ext_bf(buffer, DCF_D10); - clock->day = TIMES10(clock->day) + ext_bf(buffer, DCF_D1); - clock->month = ext_bf(buffer, DCF_MO0); - clock->month = TIMES10(clock->month) + ext_bf(buffer, DCF_MO); - clock->year = ext_bf(buffer, DCF_Y10); - clock->year = TIMES10(clock->year) + ext_bf(buffer, DCF_Y1); - clock->wday = ext_bf(buffer, DCF_DW); - - /* - * determine offset to UTC by examining the time zone - */ - switch (ext_bf(buffer, DCF_Z)) - { - case DCF_Z_MET: - clock->utcoffset = -60; - break; - - case DCF_Z_MED: - clock->flags |= DCFB_DST; - clock->utcoffset = -120; - break; - - default: - PRINTF("%-30s", "*** BAD TIME ZONE"); - return CVT_FAIL|CVT_BADFMT; - } - - /* - * extract various warnings from DCF77 - */ - if (ext_bf(buffer, DCF_A1)) - clock->flags |= DCFB_ANNOUNCE; - - if (ext_bf(buffer, DCF_A2)) - clock->flags |= DCFB_LEAP; - - if (ext_bf(buffer, DCF_R)) - clock->flags |= DCFB_ALTERNATE; - - return CVT_OK; - } - else - { - /* - * bad format - not for us - */ - PRINTF("%-30s", "*** BAD FORMAT (invalid/parity)"); - return CVT_FAIL|CVT_BADFMT; - } -} - -/*----------------------------------------------------------------------- - * raw dcf input routine - fix up 50 baud - * characters for 1/0 decision - */ -static unsigned long cvt_rawdcf(buffer, size, clock) - register unsigned char *buffer; - register int size; - register clocktime_t *clock; -{ - register unsigned char *s = buffer; - register unsigned char *e = buffer + size; - register unsigned char *b = dcfparam.onebits; - register unsigned char *c = dcfparam.zerobits; - register unsigned rtc = CVT_NONE; - register unsigned int i, lowmax, highmax, cutoff, span; -#define BITS 9 - unsigned char histbuf[BITS]; - /* - * the input buffer contains characters with runs of consecutive - * bits set. These set bits are an indication of the DCF77 pulse - * length. We assume that we receive the pulse at 50 Baud. Thus - * a 100ms pulse would generate a 4 bit train (20ms per bit and - * start bit) - * a 200ms pulse would create all zeroes (and probably a frame error) - * - * The basic idea is that on corret reception we must have two - * maxima in the pulse length distribution histogram. (one for - * the zero representing pulses and one for the one representing - * pulses) - * There will always be ones in the datastream, thus we have to see - * two maxima. - * The best point to cut for a 1/0 decision is the minimum between those - * between the maxima. The following code tries to find this cutoff point. - */ - - /* - * clear histogram buffer - */ - for (i = 0; i < BITS; i++) - { - histbuf[i] = 0; - } - - cutoff = 0; - lowmax = 0; - - /* - * convert sequences of set bits into bits counts updating - * the histogram alongway - */ - while (s < e) - { - register unsigned int ch = *s ^ 0xFF; - /* - * check integrity and update histogramm - */ - if (!((ch+1) & ch) || !*s) - { - /* - * character ok - */ - for (i = 0; ch; i++) - { - ch >>= 1; - } - - *s = i; - histbuf[i]++; - cutoff += i; - lowmax++; - } - else - { - /* - * invalid character (no consecutive bit sequence) - */ - dprintf(("parse: cvt_rawdcf: character check for 0x%x@%d FAILED\n", *s, s - buffer)); - *s = ~0; - rtc = CVT_FAIL|CVT_BADFMT; - } - s++; - } - - /* - * first cutoff estimate (average bit count - must be between both - * maxima) - */ - if (lowmax) - { - cutoff /= lowmax; - } - else - { - cutoff = 4; /* doesn't really matter - it'll fail anyway, but gives error output */ - } - - dprintf(("parse: cvt_rawdcf: average bit count: %d\n", cutoff)); - - lowmax = 0; /* weighted sum */ - highmax = 0; /* bitcount */ - - /* - * collect weighted sum of lower bits (left of initial guess) - */ - dprintf(("parse: cvt_rawdcf: histogram:")); - for (i = 0; i <= cutoff; i++) - { - lowmax += histbuf[i] * i; - highmax += histbuf[i]; - dprintf((" %d", histbuf[i])); - } - dprintf((" <M>")); - - /* - * round up - */ - lowmax += highmax / 2; - - /* - * calculate lower bit maximum (weighted sum / bit count) - * - * avoid divide by zero - */ - if (highmax) - { - lowmax /= highmax; - } - else - { - lowmax = 0; - } - - highmax = 0; /* weighted sum of upper bits counts */ - cutoff = 0; /* bitcount */ - - /* - * collect weighted sum of lower bits (right of initial guess) - */ - for (; i < BITS; i++) - { - highmax+=histbuf[i] * i; - cutoff +=histbuf[i]; - dprintf((" %d", histbuf[i])); - } - dprintf(("\n")); - - /* - * determine upper maximum (weighted sum / bit count) - */ - if (cutoff) - { - highmax /= cutoff; - } - else - { - highmax = BITS-1; - } - - /* - * following now holds: - * lowmax <= cutoff(initial guess) <= highmax - * best cutoff is the minimum nearest to higher bits - */ - - /* - * find the minimum between lowmax and highmax (detecting - * possibly a minimum span) - */ - span = cutoff = lowmax; - for (i = lowmax; i <= highmax; i++) - { - if (histbuf[cutoff] > histbuf[i]) - { - /* - * got a new minimum move beginning of minimum (cutoff) and - * end of minimum (span) there - */ - cutoff = span = i; - } - else - if (histbuf[cutoff] == histbuf[i]) - { - /* - * minimum not better yet - but it spans more than - * one bit value - follow it - */ - span = i; - } - } - - /* - * cutoff point for 1/0 decision is the middle of the minimum section - * in the histogram - */ - cutoff = (cutoff + span) / 2; - - dprintf(("parse: cvt_rawdcf: lower maximum %d, higher maximum %d, cutoff %d\n", lowmax, highmax, cutoff)); - - /* - * convert the bit counts to symbolic 1/0 information for data conversion - */ - s = buffer; - while ((s < e) && *c && *b) - { - if (*s == (unsigned char)~0) - { - /* - * invalid character - */ - *s = '?'; - } - else - { - /* - * symbolic 1/0 representation - */ - *s = (*s >= cutoff) ? *b : *c; - } - s++; - b++; - c++; - } - - /* - * if everything went well so far return the result of the symbolic - * conversion routine else just the accumulated errors - */ - if (rtc != CVT_NONE) - { - PRINTF("%-30s", "*** BAD DATA"); - } - - return (rtc == CVT_NONE) ? convert_rawdcf(buffer, size, clock) : rtc; -} - -/*----------------------------------------------------------------------- - * convert a wall clock time description of DCF77 to a Unix time (seconds - * since 1.1. 1970 UTC) - */ -time_t -dcf_to_unixtime(clock, cvtrtc) - register clocktime_t *clock; - register unsigned long *cvtrtc; -{ -#define SETRTC(_X_) { if (cvtrtc) *cvtrtc = (_X_); } - static int days_of_month[] = - { - 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 - }; - register int i; - time_t t; - - /* - * map 2 digit years to 19xx (DCF77 is a 20th century item) - */ - if (clock->year < 100) - clock->year += 1900; - - /* - * assume that we convert timecode within the unix/UTC epoch - - * prolonges validity of 2 digit years - */ - if (clock->year < 1994) - clock->year += 100; /* XXX this will do it till <2094 */ - - /* - * must have been a really negative year code - drop it - */ - if (clock->year < 0) - { - SETRTC(CVT_FAIL|CVT_BADDATE); - return -1; - } - - /* - * sorry, slow section here - but it's not time critical anyway - */ - - /* - * calculate days since 1970 (watching leap years) - */ - t = (clock->year - 1970) * 365; - t += (clock->year >> 2) - (1970 >> 2); - t -= clock->year / 100 - 1970 / 100; - t += clock->year / 400 - 1970 / 400; - - /* month */ - if (clock->month <= 0 || clock->month > 12) - { - SETRTC(CVT_FAIL|CVT_BADDATE); - return -1; /* bad month */ - } - /* adjust current leap year */ - if (clock->month >= 3 && dysize(clock->year) == 366) - t++; - - /* - * collect days from months excluding the current one - */ - for (i = 1; i < clock->month; i++) - { - t += days_of_month[i]; - } - /* day */ - if (clock->day < 1 || ((clock->month == 2 && dysize(clock->year) == 366) ? - clock->day > 29 : clock->day > days_of_month[clock->month])) - { - SETRTC(CVT_FAIL|CVT_BADDATE); - return -1; /* bad day */ - } - - /* - * collect days from date excluding the current one - */ - t += clock->day - 1; - - /* hour */ - if (clock->hour < 0 || clock->hour >= 24) - { - SETRTC(CVT_FAIL|CVT_BADTIME); - return -1; /* bad hour */ - } - - /* - * calculate hours from 1. 1. 1970 - */ - t = TIMES24(t) + clock->hour; - - /* min */ - if (clock->minute < 0 || clock->minute > 59) - { - SETRTC(CVT_FAIL|CVT_BADTIME); - return -1; /* bad min */ - } - - /* - * calculate minutes from 1. 1. 1970 - */ - t = TIMES60(t) + clock->minute; - /* sec */ - - /* - * calculate UTC in minutes - */ - t += clock->utcoffset; - - if (clock->second < 0 || clock->second > 60) /* allow for LEAPs */ - { - SETRTC(CVT_FAIL|CVT_BADTIME); - return -1; /* bad sec */ - } - - /* - * calculate UTC in seconds - phew ! - */ - t = TIMES60(t) + clock->second; - /* done */ - return t; -} - -/*----------------------------------------------------------------------- - * cheap half baked 1/0 decision - for interactive operation only - */ -static char type(c) -unsigned char c; -{ - c ^= 0xFF; - return (c > 0xF); -} - -/*----------------------------------------------------------------------- - * week day representation - */ -static char *wday[8] = -{ - "??", - "Mo", - "Tu", - "We", - "Th", - "Fr", - "Sa", - "Su" -}; - -/*----------------------------------------------------------------------- - * generate a string representation for a timeval - */ -static char * pr_timeval(val) - struct timeval *val; -{ - static char buf[20]; - - if (val->tv_sec == 0) - sprintf(buf, "%c0.%06ld", (val->tv_usec < 0) ? '-' : '+', (long int)abs(val->tv_usec)); - else - sprintf(buf, "%ld.%06ld", (long int)val->tv_sec, (long int)abs(val->tv_usec)); - return buf; -} - -/*----------------------------------------------------------------------- - * correct the current time by an offset by setting the time rigorously - */ -static void set_time(offset) - struct timeval *offset; -{ - struct timeval the_time; - - if (no_set) - return; - - LPRINTF("set_time: %s ", pr_timeval(offset)); - syslog(LOG_NOTICE, "setting time (offset %s)", pr_timeval(offset)); - - if (gettimeofday(&the_time, 0L) == -1) - { - perror("gettimeofday()"); - } - else - { - timeradd(&the_time, offset); - if (settimeofday(&the_time, 0L) == -1) - { - perror("settimeofday()"); - } - } -} - -/*----------------------------------------------------------------------- - * slew the time by a given offset - */ -static void adj_time(offset) - register long offset; -{ - struct timeval time_offset; - - if (no_set) - return; - - time_offset.tv_sec = offset / 1000000; - time_offset.tv_usec = offset % 1000000; - - LPRINTF("adj_time: %ld us ", (long int)offset); - if (adjtime(&time_offset, 0L) == -1) - perror("adjtime()"); -} - -/*----------------------------------------------------------------------- - * read in a possibly previously written drift value - */ -static void read_drift(drift_file) - char *drift_file; -{ - FILE *df; - - df = fopen(drift_file, "r"); - if (df != NULL) - { - int idrift, fdrift; - - fscanf(df, "%4d.%03d", &idrift, &fdrift); - fclose(df); - LPRINTF("read_drift: %d.%03d ppm ", idrift, fdrift); - - drift_comp = idrift << USECSCALE; - fdrift = (fdrift << USECSCALE) / 1000; - drift_comp += fdrift & (1<<USECSCALE); - LPRINTF("read_drift: drift_comp %ld ", (long int)drift_comp); - } -} - -/*----------------------------------------------------------------------- - * write out the current drift value - */ -static void update_drift(drift_file, offset, reftime) - char *drift_file; - long offset; - time_t reftime; -{ - FILE *df; - - df = fopen(drift_file, "w"); - if (df != NULL) - { - int idrift = R_SHIFT(drift_comp, USECSCALE); - int fdrift = drift_comp & ((1<<USECSCALE)-1); - - LPRINTF("update_drift: drift_comp %ld ", (long int)drift_comp); - fdrift = (fdrift * 1000) / (1<<USECSCALE); - fprintf(df, "%4d.%03d %c%ld.%06ld %.24s\n", idrift, fdrift, - (offset < 0) ? '-' : '+', (long int)(abs(offset) / 1000000), - (long int)(abs(offset) % 1000000), asctime(localtime(&reftime))); - fclose(df); - LPRINTF("update_drift: %d.%03d ppm ", idrift, fdrift); - } -} - -/*----------------------------------------------------------------------- - * process adjustments derived from the DCF77 observation - * (controls clock PLL) - */ -static void adjust_clock(offset, drift_file, reftime) - struct timeval *offset; - char *drift_file; - time_t reftime; -{ - struct timeval toffset; - register long usecoffset; - int tmp; - - if (no_set) - return; - - if (skip_adjust) - { - skip_adjust = 0; - return; - } - - toffset = *offset; - toffset.tv_sec = abs(toffset.tv_sec); - toffset.tv_usec = abs(toffset.tv_usec); - if (timercmp(&toffset, &max_adj_offset, >)) - { - /* - * hopeless - set the clock - and clear the timing - */ - set_time(offset); - clock_adjust = 0; - skip_adjust = 1; - return; - } - - usecoffset = offset->tv_sec * 1000000 + offset->tv_usec; - - clock_adjust = R_SHIFT(usecoffset, TIMECONSTANT); /* adjustment to make for next period */ - - tmp = 0; - while (adjustments > (1 << tmp)) - tmp++; - adjustments = 0; - if (tmp > FREQ_WEIGHT) - tmp = FREQ_WEIGHT; - - drift_comp += R_SHIFT(usecoffset << USECSCALE, TIMECONSTANT+TIMECONSTANT+FREQ_WEIGHT-tmp); - - if (drift_comp > MAX_DRIFT) /* clamp into interval */ - drift_comp = MAX_DRIFT; - else - if (drift_comp < -MAX_DRIFT) - drift_comp = -MAX_DRIFT; - - update_drift(drift_file, usecoffset, reftime); - LPRINTF("clock_adjust: %s, clock_adjust %ld, drift_comp %ld(%ld) ", - pr_timeval(offset),(long int) R_SHIFT(clock_adjust, USECSCALE), - (long int)R_SHIFT(drift_comp, USECSCALE), (long int)drift_comp); -} - -/*----------------------------------------------------------------------- - * adjust the clock by a small mount to simulate frequency correction - */ -static void periodic_adjust() -{ - register long adjustment; - - adjustments++; - - adjustment = R_SHIFT(clock_adjust, PHASE_WEIGHT); - - clock_adjust -= adjustment; - - adjustment += R_SHIFT(drift_comp, USECSCALE+ADJINTERVAL); - - adj_time(adjustment); -} - -/*----------------------------------------------------------------------- - * control synchronisation status (warnings) and do periodic adjusts - * (frequency control simulation) - */ -static void tick() -{ - static unsigned long last_notice = 0; - -#ifndef SV_ONSTACK - (void)signal(SIGALRM, tick); -#endif - - periodic_adjust(); - - ticks += 1<<ADJINTERVAL; - - if ((ticks - last_sync) > MAX_UNSYNC) - { - /* - * not getting time for a while - */ - if (sync_state == SYNC) - { - /* - * completely lost information - */ - sync_state = NO_SYNC; - syslog(LOG_INFO, "DCF77 reception lost (timeout)"); - last_notice = ticks; - } - else - /* - * in NO_SYNC state - look whether its time to speak up again - */ - if ((ticks - last_notice) > NOTICE_INTERVAL) - { - syslog(LOG_NOTICE, "still not synchronized to DCF77 - check receiver/signal"); - last_notice = ticks; - } - } - -#ifndef ITIMER_REAL - (void) alarm(1<<ADJINTERVAL); -#endif -} - -/*----------------------------------------------------------------------- - * break association from terminal to avoid catching terminal - * or process group related signals (-> daemon operation) - */ -static void detach() -{ - int s; - - if (fork()) - exit(0); - - for (s = 0; s < 3; s++) - (void) close(s); - (void) open("/", 0); - (void) dup2(0, 1); - (void) dup2(0, 2); - -#if defined(NTP_POSIX_SOURCE) || defined(_POSIX_) - (void) setsid(); -#else /* _POSIX_ */ -#ifndef BSD - (void) setpgrp(); -#else /* BSD */ - (void) setpgrp(0, getpid()); -#endif /* BSD */ -#endif /* _POSIX_ */ -#if defined(hpux) - if (fork()) - exit(0); -#endif /* hpux */ -} - -/*----------------------------------------------------------------------- - * list possible arguments and options - */ -static void usage(program) - char *program; -{ - fprintf(stderr, "usage: %s [-f] [-l] [-t] [-i] [-o] [-d <drift_file>] <device>\n", program); - fprintf(stderr, "\t-n do not change time\n"); - fprintf(stderr, "\t-i interactive\n"); - fprintf(stderr, "\t-t trace (print all datagrams)\n"); - fprintf(stderr, "\t-f print all databits (includes PTB private data)\n"); - fprintf(stderr, "\t-l print loop filter debug information\n"); - fprintf(stderr, "\t-o print offet average for current minute\n"); - fprintf(stderr, "\t-d <drift_file> specify alternate drift file\n"); - fprintf(stderr, "\t-D <input delay>specify delay from input edge to processing in micro seconds\n"); -} - -/*----------------------------------------------------------------------- - * main loop - argument interpreter / setup / main loop - */ -int -main(argc, argv) - int argc; - char **argv; -{ - unsigned char c; - char **a = argv; - int ac = argc; - char *file = NULL; - char *drift_file = "/etc/dcfd.drift"; - int fd; - int offset = 15; - int offsets = 0; - int delay = DEFAULT_DELAY; /* average delay from input edge to time stamping */ - int trace = 0; - int errs = 0; - - /* - * process arguments - */ - while (--ac) - { - char *arg = *++a; - if (*arg == '-') - while ((c = *++arg)) - switch (c) - { - case 't': - trace = 1; - interactive = 1; - break; - - case 'f': - offset = 0; - interactive = 1; - break; - - case 'l': - loop_filter_debug = 1; - offsets = 1; - interactive = 1; - break; - - case 'n': - no_set = 1; - break; - - case 'o': - offsets = 1; - interactive = 1; - break; - - case 'i': - interactive = 1; - break; - - case 'D': - if (ac > 1) - { - delay = atoi(*++a); - ac--; - } - else - { - fprintf(stderr, "%s: -D requires integer argument\n", argv[0]); - errs=1; - } - break; - - case 'd': - if (ac > 1) - { - drift_file = *++a; - ac--; - } - else - { - fprintf(stderr, "%s: -d requires file name argument\n", argv[0]); - errs=1; - } - break; - - default: - fprintf(stderr, "%s: unknown option -%c\n", argv[0], c); - errs=1; - break; - } - else - if (file == NULL) - file = arg; - else - { - fprintf(stderr, "%s: device specified twice\n", argv[0]); - errs=1; - } - } - - if (errs) - { - usage(argv[0]); - exit(1); - } - else - if (file == NULL) - { - fprintf(stderr, "%s: device not specified\n", argv[0]); - usage(argv[0]); - exit(1); - } - - errs = LINES+1; - - /* - * get access to DCF77 tty port - */ -#if defined(SYS_FREEBSD) && defined(BOEDER) - fd = open(file, O_RDONLY | O_NONBLOCK); -#else - fd = open(file, O_RDONLY); -#endif - if (fd == -1) - { - perror(file); - exit(1); - } - else - { - int i, rrc; - struct timeval t, tt, tlast; - struct timeval timeout; - struct timeval phase; - struct timeval time_offset; - char pbuf[61]; /* printable version */ - char buf[61]; /* raw data */ - clocktime_t clock; /* wall clock time */ - time_t utc_time = 0; - time_t last_utc_time = 0; - long usecerror = 0; - long lasterror = 0; -#if defined(HAVE_TERMIOS) || defined(STREAM) - struct termios term; -#endif -#if defined(HAVE_TERMIO) || defined(HAVE_SYSV_TTYS) - struct termio term; -#endif - int rtc = CVT_NONE; - - timeout.tv_sec = 1; - timeout.tv_usec = 500000; - - phase.tv_sec = 0; - phase.tv_usec = delay; - - /* - * setup TTY (50 Baud, Read, 8Bit, No Hangup, 1 character IO) - */ - if (TTY_GETATTR(fd, &term) == -1) - { - perror("tcgetattr"); - exit(1); - } - - memset(term.c_cc, 0, sizeof(term.c_cc)); - term.c_cc[VMIN] = 1; -#if defined(SYS_FREEBSD) - term.c_cflag = CS8|CREAD|CLOCAL|PARENB; - term.c_iflag = 0; -#else - term.c_cflag = B50|CS8|CREAD|CLOCAL|PARENB; - term.c_iflag = IGNPAR; -#endif - term.c_oflag = 0; - term.c_lflag = 0; - -#if defined(SYS_FREEBSD) - if (cfsetspeed(&term, B50) == -1) - perror("cfsetspeed"); -#endif - if (TTY_SETATTR(fd, &term) == -1) - { - perror("tcsetattr"); - exit(1); - } - - /* - * loose terminal if in daemon operation - */ - if (!interactive) - detach(); - - /* - * get syslog() initialized - */ -#ifdef LOG_DAEMON - openlog("dcfd", LOG_PID, LOG_DAEMON); -#else - openlog("dcfd", LOG_PID); -#endif - - /* - * setup periodic operations (state control / frequency control) - */ -#ifdef SV_ONSTACK - { - struct sigvec vec; - - vec.sv_handler = tick; - vec.sv_mask = 0; - vec.sv_flags = 0; - - if (sigvec(SIGALRM, &vec, (struct sigvec *)0) == -1) - { - syslog(LOG_ERR, "sigvec(SIGALRM): %m"); - exit(1); - } - } -#else - (void) signal(SIGALRM, tick); -#endif - -#ifdef ITIMER_REAL - { - struct itimerval it; - - it.it_interval.tv_sec = 1<<ADJINTERVAL; - it.it_interval.tv_usec = 0; - it.it_value.tv_sec = 1<<ADJINTERVAL; - it.it_value.tv_usec = 0; - - if (setitimer(ITIMER_REAL, &it, (struct itimerval *)0) == -1) - { - syslog(LOG_ERR, "setitimer: %m"); - exit(1); - } - } -#else - (void) alarm(1<<ADJINTERVAL); -#endif -#if defined(SYS_FREEBSD) && defined(CONRAD) - if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK) == -1) - perror("F_SETFL"); - - { - int i; - - if (ioctl(fd, TIOCMGET, &i) == -1) - perror("TIOCMGET"); - i |= TIOCM_DTR; - i &= ~TIOCM_RTS; - if (ioctl(fd, TIOCMSET, &i) == -1) - perror("TIOCMSET"); - } -#endif -#if defined(SYS_FREEBSD) && defined(BOEDER) - if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK) == -1) - perror("F_SETFL"); - - if (ioctl(fd, TIOCCDTR, 0) == -1) - perror("TIOCCDTR"); -#endif - - PRINTF(" DCF77 monitor - Copyright 1993,1994, Frank Kardel\n\n"); - syslog(LOG_NOTICE, "Starting on %s", file); - - pbuf[60] = '\0'; - for ( i = 0; i < 60; i++) - pbuf[i] = '.'; - - read_drift(drift_file); - - /* - * what time is it now (for interval measurement) - */ - gettimeofday(&tlast, 0L); - i = 0; - /* - * loop until input trouble ... - */ - do - { - /* - * get an impulse - */ - while ((rrc = read(fd, &c, 1)) == 1) - { - gettimeofday(&t, 0L); - tt = t; - timersub(&t, &tlast); - - if (errs > LINES) - { - PRINTF(" %s", &"PTB private....RADMLSMin....PHour..PMDay..DayMonthYear....P\n"[offset]); - PRINTF(" %s", &"---------------RADMLS1248124P124812P1248121241248112481248P\n"[offset]); - errs = 0; - } - - /* - * timeout -> possible minute mark -> interpretation - */ - if (timercmp(&t, &timeout, >)) - { - PRINTF("%c %.*s ", pat[i % (sizeof(pat)-1)], 59 - offset, &pbuf[offset]); - - if ((rtc = cvt_rawdcf(buf, i, &clock)) != CVT_OK) - { - /* - * this data was bad - well - forget synchronisation for now - */ - PRINTF("\n"); - if (sync_state == SYNC) - { - sync_state = NO_SYNC; - syslog(LOG_INFO, "DCF77 reception lost (bad data)"); - } - errs++; - } - else - if (trace) - { - PRINTF("\r %.*s ", 59 - offset, &buf[offset]); - } - - - buf[0] = c; - - /* - * collect first character - */ - if (((c^0xFF)+1) & (c^0xFF)) - pbuf[0] = '?'; - else - pbuf[0] = type(c) ? '#' : '-'; - - for ( i = 1; i < 60; i++) - pbuf[i] = '.'; - - i = 0; - } - else - { - /* - * collect character - */ - buf[i] = c; - - /* - * initial guess (usually correct) - */ - if (((c^0xFF)+1) & (c^0xFF)) - pbuf[i] = '?'; - else - pbuf[i] = type(c) ? '#' : '-'; - - PRINTF("%c %.*s ", pat[i % (sizeof(pat)-1)], 59 - offset, &pbuf[offset]); - } - - if (i == 0 && rtc == CVT_OK) - { - /* - * we got a good time code here - try to convert it to - * UTC - */ - if ((utc_time = dcf_to_unixtime(&clock, &rtc)) == -1) - { - PRINTF("*** BAD CONVERSION\n"); - } - - if (utc_time != (last_utc_time + 60)) - { - /* - * well, two successive sucessful telegrams are not 60 seconds - * apart - */ - PRINTF("*** NO MINUTE INC\n"); - if (sync_state == SYNC) - { - sync_state = NO_SYNC; - syslog(LOG_INFO, "DCF77 reception lost (data mismatch)"); - } - errs++; - rtc = CVT_FAIL|CVT_BADTIME|CVT_BADDATE; - } - else - usecerror = 0; - - last_utc_time = utc_time; - } - - if (rtc == CVT_OK) - { - if (i == 0) - { - /* - * valid time code - determine offset and - * note regained reception - */ - last_sync = ticks; - if (sync_state == NO_SYNC) - { - syslog(LOG_INFO, "receiving DCF77"); - } - else - { - /* - * we had at least one minute SYNC - thus - * last error is valid - */ -#if defined(BOEDER) - if (abs(utc_time - tt.tv_sec) > 10) - { - time_offset.tv_sec = utc_time - tt.tv_sec; - time_offset.tv_usec = 0; - } - else - { - time_offset.tv_sec = lasterror / 1000000; - time_offset.tv_usec = lasterror % 1000000; - } -#else - time_offset.tv_sec = lasterror / 1000000; - time_offset.tv_usec = lasterror % 1000000; -#endif - adjust_clock(&time_offset, drift_file, utc_time); - } - sync_state = SYNC; - } - - time_offset.tv_sec = utc_time + i; - time_offset.tv_usec = 0; - - timeradd(&time_offset, &phase); - - usecerror += (time_offset.tv_sec - tt.tv_sec) * 1000000 + time_offset.tv_usec - -tt.tv_usec; - - /* - * output interpreted DCF77 data. DCF77 gives us a YY year - * but dcf_to_unixtime() adds the century, so print YYYY. - */ - PRINTF(offsets ? "%s, %2d:%02d:%02d, %d.%02d.%4d, <%s%s%s%s> (%c%d.%06ds)" : - "%s, %2d:%02d:%02d, %d.%02d.%02d, <%s%s%s%s>", - wday[clock.wday], - clock.hour, clock.minute, i, clock.day, clock.month, - clock.year, - (clock.flags & DCFB_ALTERNATE) ? "R" : "_", - (clock.flags & DCFB_ANNOUNCE) ? "A" : "_", - (clock.flags & DCFB_DST) ? "D" : "_", - (clock.flags & DCFB_LEAP) ? "L" : "_", - (lasterror < 0) ? '-' : '+', abs(lasterror) / 1000000, abs(lasterror) % 1000000 - ); - - if (trace && (i == 0)) - { - PRINTF("\n"); - errs++; - } - lasterror = usecerror / (i+1); - } - else - { - lasterror = 0; /* we cannot calculate phase errors on bad reception */ - } - - PRINTF("\r"); - - if (i < 60) - { - i++; - } - - tlast = tt; - - if (interactive) - fflush(stdout); - } - } while ((rrc == -1) && (errno == EINTR)); - - /* - * lost IO - sorry guys - */ - syslog(LOG_ERR, "TERMINATING - cannot read from device %s (%m)", file); - - (void)close(fd); - } - - closelog(); - - return 0; -} diff --git a/usr.sbin/xntpd/parse/util/parsetest.c b/usr.sbin/xntpd/parse/util/parsetest.c deleted file mode 100644 index 24bdfa6cd67c..000000000000 --- a/usr.sbin/xntpd/parse/util/parsetest.c +++ /dev/null @@ -1,272 +0,0 @@ -/* - * /src/NTP/REPOSITORY/v3/parse/util/parsetest.c,v 3.14 1994/05/12 12:49:27 kardel Exp - * - * parsetest.c,v 3.14 1994/05/12 12:49:27 kardel Exp - * - * Copyright (c) 1989,1990,1991,1992,1993,1994 - * Frank Kardel Friedrich-Alexander Universitaet Erlangen-Nuernberg - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * $Log: parsetest.c,v $ - * Revision 3.14 1994/05/12 12:49:27 kardel - * printf fmt/arg cleanup - * - * Revision 3.14 1994/05/11 09:25:43 kardel - * 3.3r + printf fmt/arg fixes - * - * Revision 3.13 1994/02/20 13:04:46 kardel - * parse add/delete second support - * - * Revision 3.12 1994/02/02 17:45:51 kardel - * rcs ids fixed - * - */ - -#ifndef STREAM -ONLY STREAM OPERATION SUPPORTED -#endif - -#define PARSESTREAM /* there is no other choice - TEST HACK */ - -#include <unistd.h> -#include <fcntl.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/errno.h> -#include <sys/time.h> -#include <sys/stream.h> -#include <sys/stropts.h> -#include <sys/errno.h> -#include <fcntl.h> - -#define P(X) () - -#include "ntp_fp.h" -#ifdef USE_PROTOTYPES -#include "ntp_stdlib.h" -#endif -#include "parse.h" - -static char *strstatus(buffer, state) - char *buffer; - unsigned LONG state; -{ - static struct bits - { - unsigned LONG bit; - char *name; - } flagstrings[] = - { - { PARSEB_ANNOUNCE, "DST SWITCH WARNING" }, - { PARSEB_POWERUP, "NOT SYNCHRONIZED" }, - { PARSEB_NOSYNC, "TIME CODE NOT CONFIRMED" }, - { PARSEB_DST, "DST" }, - { PARSEB_UTC, "UTC DISPLAY" }, - { PARSEB_LEAPADD, "LEAP ADDITION WARNING" }, - { PARSEB_LEAPDEL, "LEAP DELETION WARNING" }, - { PARSEB_LEAPSECOND, "LEAP SECOND" }, - { PARSEB_ALTERNATE,"ALTERNATE ANTENNA" }, - { PARSEB_TIMECODE, "TIME CODE" }, - { PARSEB_PPS, "PPS" }, - { PARSEB_POSITION, "POSITION" }, - { 0 } - }; - - static struct sbits - { - unsigned LONG bit; - char *name; - } sflagstrings[] = - { - { PARSEB_S_LEAP, "LEAP INDICATION" }, - { PARSEB_S_PPS, "PPS SIGNAL" }, - { PARSEB_S_ANTENNA, "ANTENNA" }, - { PARSEB_S_POSITION, "POSITION" }, - { 0 } - }; - int i; - - *buffer = '\0'; - - i = 0; - while (flagstrings[i].bit) - { - if (flagstrings[i].bit & state) - { - if (buffer[0]) - strcat(buffer, "; "); - strcat(buffer, flagstrings[i].name); - } - i++; - } - - if (state & (PARSEB_S_LEAP|PARSEB_S_ANTENNA|PARSEB_S_PPS|PARSEB_S_POSITION)) - { - register char *s, *t; - - if (buffer[0]) - strcat(buffer, "; "); - - strcat(buffer, "("); - - t = s = buffer + strlen(buffer); - - i = 0; - while (sflagstrings[i].bit) - { - if (sflagstrings[i].bit & state) - { - if (t != s) - { - strcpy(t, "; "); - t += 2; - } - - strcpy(t, sflagstrings[i].name); - t += strlen(t); - } - i++; - } - strcpy(t, ")"); - } - return buffer; -} - -/*-------------------------------------------------- - * convert a status flag field to a string - */ -static char *parsestatus(state, buffer) - unsigned LONG state; - char *buffer; -{ - static struct bits - { - unsigned LONG bit; - char *name; - } flagstrings[] = - { - { CVT_OK, "CONVERSION SUCCESSFUL" }, - { CVT_NONE, "NO CONVERSION" }, - { CVT_FAIL, "CONVERSION FAILED" }, - { CVT_BADFMT, "ILLEGAL FORMAT" }, - { CVT_BADDATE, "DATE ILLEGAL" }, - { CVT_BADTIME, "TIME ILLEGAL" }, - { 0 } - }; - int i; - - *buffer = '\0'; - - i = 0; - while (flagstrings[i].bit) - { - if (flagstrings[i].bit & state) - { - if (buffer[0]) - strcat(buffer, "; "); - strcat(buffer, flagstrings[i].name); - } - i++; - } - - return buffer; -} - -int -main(argc, argv) - int argc; - char **argv; -{ - if (argc != 2) - { - fprintf(stderr,"usage: %s <parse-device>\n", argv[0]); - exit(1); - } - else - { - int fd; - - fd = open(argv[1], O_RDWR); - if (fd == -1) - { - perror(argv[1]); - exit(1); - } - else - { - parsectl_t dct; - parsetime_t parsetime; - struct strioctl strioc; - - printf("parsetest.c,v 3.11 1994/01/23 19:00:01 kardel Exp\n"); - - while (ioctl(fd, I_POP, 0) == 0) - ; - - if (ioctl(fd, I_PUSH, "parse") == -1) - { - perror("ioctl(I_PUSH,\"parse\")"); - exit(1); - } - - strioc.ic_cmd = PARSEIOC_GETSTAT; - strioc.ic_timout = 0; - strioc.ic_dp = (char *)&dct; - strioc.ic_len = sizeof(parsectl_t); - - if (ioctl(fd, I_STR, &strioc) == -1) - { - perror("ioctl(fd, I_STR(PARSEIOC_GETSTAT))"); - exit(1); - } - printf("parse status: %04lx\n", (unsigned long)dct.parsestatus.flags); - - dct.parsestatus.flags |= PARSE_STAT_FILTER; - strioc.ic_cmd = PARSEIOC_SETSTAT; - - if (ioctl(fd, I_STR, &strioc) == -1) - { - perror("ioctl(fd, I_STR(PARSEIOC_SETSTAT))"); - exit(1); - } - printf("PARSE clock FILTERMODE\n"); - - if (ioctl(fd, I_STR, &strioc) == -1) - { - perror("ioctl(fd, I_STR(PARSEIOC_GETSTAT))"); - exit(1); - } - printf("parse status: %04lx\n", (unsigned long)dct.parsestatus.flags); - - while (read(fd, &parsetime, sizeof(parsetime)) == sizeof(parsetime)) - { - char tmp[200], tmp1[200], tmp2[60]; - - strncpy(tmp, asctime(localtime(&parsetime.parse_time.tv.tv_sec)), 30); - strncpy(tmp1,asctime(localtime(&parsetime.parse_stime.tv.tv_sec)), 30); - strncpy(tmp2,asctime(localtime(&parsetime.parse_ptime.tv.tv_sec)), 30); - tmp[24] = '\0'; - tmp1[24] = '\0'; - tmp2[24] = '\0'; - - printf("%s (+%06ldus) %s PPS: %s (+%06ldus), ", tmp1, (long int)parsetime.parse_stime.tv.tv_usec, tmp, tmp2, - (long int)parsetime.parse_ptime.tv.tv_usec); - - strstatus(tmp, parsetime.parse_state); - printf("state: 0x%lx (%s) error: %ldus, dispersion: %ldus, Status: 0x%lx (%s)\n", - (unsigned long)parsetime.parse_state, - tmp, - (long)parsetime.parse_usecerror, - (long)parsetime.parse_usecdisp, - (unsigned long)parsetime.parse_status, - parsestatus(parsetime.parse_status, tmp1)); - } - - close(fd); - } - } - return 0; -} diff --git a/usr.sbin/xntpd/parse/util/testdcf.c b/usr.sbin/xntpd/parse/util/testdcf.c deleted file mode 100644 index bd5ea88506d0..000000000000 --- a/usr.sbin/xntpd/parse/util/testdcf.c +++ /dev/null @@ -1,488 +0,0 @@ -/* - * /src/NTP/REPOSITORY/v3/parse/util/testdcf.c,v 3.13 1994/05/12 12:49:31 kardel Exp - * - * testdcf.c,v 3.13 1994/05/12 12:49:31 kardel Exp - * - * simple DCF77 100/200ms pulse test program (via 50Baud serial line) - * - * Copyright (c) 1993,1994 - * Frank Kardel, Friedrich-Alexander Universitaet Erlangen-Nuernberg - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * This program may not be sold or used for profit without prior - * written consent of the author. - */ - -#include <unistd.h> -#include <stdio.h> -#include <fcntl.h> -#include <termios.h> -#include <sys/types.h> -#ifdef STREAM -#include <sys/stream.h> -#include <sys/stropts.h> -#endif -#include <sys/time.h> - -#include "ntp_stdlib.h" - -/* - * state flags - */ -#define DCFB_ANNOUNCE 0x0001 /* switch time zone warning (DST switch) */ -#define DCFB_DST 0x0002 /* DST in effect */ -#define DCFB_LEAP 0x0004 /* LEAP warning (1 hour prior to occurence) */ -#define DCFB_ALTERNATE 0x0008 /* alternate antenna used */ - -struct clocktime /* clock time broken up from time code */ -{ - long wday; - long day; - long month; - long year; - long hour; - long minute; - long second; - long usecond; - long utcoffset; /* in minutes */ - long flags; /* current clock status */ -}; - -typedef struct clocktime clocktime_t; - -#define TIMES10(_X_) (((_X_) << 3) + ((_X_) << 1)) - -/* - * parser related return/error codes - */ -#define CVT_MASK 0x0000000F /* conversion exit code */ -#define CVT_NONE 0x00000001 /* format not applicable */ -#define CVT_FAIL 0x00000002 /* conversion failed - error code returned */ -#define CVT_OK 0x00000004 /* conversion succeeded */ -#define CVT_BADFMT 0x00000010 /* general format error - (unparsable) */ - -/* - * DCF77 raw time code - * - * From "Zur Zeit", Physikalisch-Technische Bundesanstalt (PTB), Braunschweig - * und Berlin, Maerz 1989 - * - * Timecode transmission: - * AM: - * time marks are send every second except for the second before the - * next minute mark - * time marks consist of a reduction of transmitter power to 25% - * of the nominal level - * the falling edge is the time indication (on time) - * time marks of a 100ms duration constitute a logical 0 - * time marks of a 200ms duration constitute a logical 1 - * FM: - * see the spec. (basically a (non-)inverted psuedo random phase shift) - * - * Encoding: - * Second Contents - * 0 - 10 AM: free, FM: 0 - * 11 - 14 free - * 15 R - alternate antenna - * 16 A1 - expect zone change (1 hour before) - * 17 - 18 Z1,Z2 - time zone - * 0 0 illegal - * 0 1 MEZ (MET) - * 1 0 MESZ (MED, MET DST) - * 1 1 illegal - * 19 A2 - expect leap insertion/deletion (1 hour before) - * 20 S - start of time code (1) - * 21 - 24 M1 - BCD (lsb first) Minutes - * 25 - 27 M10 - BCD (lsb first) 10 Minutes - * 28 P1 - Minute Parity (even) - * 29 - 32 H1 - BCD (lsb first) Hours - * 33 - 34 H10 - BCD (lsb first) 10 Hours - * 35 P2 - Hour Parity (even) - * 36 - 39 D1 - BCD (lsb first) Days - * 40 - 41 D10 - BCD (lsb first) 10 Days - * 42 - 44 DW - BCD (lsb first) day of week (1: Monday -> 7: Sunday) - * 45 - 49 MO - BCD (lsb first) Month - * 50 MO0 - 10 Months - * 51 - 53 Y1 - BCD (lsb first) Years - * 54 - 57 Y10 - BCD (lsb first) 10 Years - * 58 P3 - Date Parity (even) - * 59 - usually missing (minute indication), except for leap insertion - */ - -static struct rawdcfcode -{ - char offset; /* start bit */ -} rawdcfcode[] = -{ - { 0 }, { 15 }, { 16 }, { 17 }, { 19 }, { 20 }, { 21 }, { 25 }, { 28 }, { 29 }, - { 33 }, { 35 }, { 36 }, { 40 }, { 42 }, { 45 }, { 49 }, { 50 }, { 54 }, { 58 }, { 59 } -}; - -#define DCF_M 0 -#define DCF_R 1 -#define DCF_A1 2 -#define DCF_Z 3 -#define DCF_A2 4 -#define DCF_S 5 -#define DCF_M1 6 -#define DCF_M10 7 -#define DCF_P1 8 -#define DCF_H1 9 -#define DCF_H10 10 -#define DCF_P2 11 -#define DCF_D1 12 -#define DCF_D10 13 -#define DCF_DW 14 -#define DCF_MO 15 -#define DCF_MO0 16 -#define DCF_Y1 17 -#define DCF_Y10 18 -#define DCF_P3 19 - -static struct partab -{ - char offset; /* start bit of parity field */ -} partab[] = -{ - { 21 }, { 29 }, { 36 }, { 59 } -}; - -#define DCF_P_P1 0 -#define DCF_P_P2 1 -#define DCF_P_P3 2 - -#define DCF_Z_MET 0x2 -#define DCF_Z_MED 0x1 - -static unsigned long ext_bf(buf, idx) - register char *buf; - register int idx; -{ - register unsigned long sum = 0; - register int i, first; - - first = rawdcfcode[idx].offset; - - for (i = rawdcfcode[idx+1].offset - 1; i >= first; i--) - { - sum <<= 1; - sum |= (buf[i] != '-'); - } - return sum; -} - -static unsigned pcheck(buf, idx) - register char *buf; - register int idx; -{ - register int i,last; - register unsigned psum = 1; - - last = partab[idx+1].offset; - - for (i = partab[idx].offset; i < last; i++) - psum ^= (buf[i] != '-'); - - return psum; -} - -static unsigned long convert_rawdcf(buffer, size, clock) - register unsigned char *buffer; - register int size; - register clocktime_t *clock; -{ - if (size < 57) - { - printf("%-30s", "*** INCOMPLETE"); - return CVT_NONE; - } - - /* - * check Start and Parity bits - */ - if ((ext_bf(buffer, DCF_S) == 1) && - pcheck(buffer, DCF_P_P1) && - pcheck(buffer, DCF_P_P2) && - pcheck(buffer, DCF_P_P3)) - { - /* - * buffer OK - */ - - clock->flags = 0; - clock->usecond= 0; - clock->second = 0; - clock->minute = ext_bf(buffer, DCF_M10); - clock->minute = TIMES10(clock->minute) + ext_bf(buffer, DCF_M1); - clock->hour = ext_bf(buffer, DCF_H10); - clock->hour = TIMES10(clock->hour) + ext_bf(buffer, DCF_H1); - clock->day = ext_bf(buffer, DCF_D10); - clock->day = TIMES10(clock->day) + ext_bf(buffer, DCF_D1); - clock->month = ext_bf(buffer, DCF_MO0); - clock->month = TIMES10(clock->month) + ext_bf(buffer, DCF_MO); - clock->year = ext_bf(buffer, DCF_Y10); - clock->year = TIMES10(clock->year) + ext_bf(buffer, DCF_Y1); - clock->wday = ext_bf(buffer, DCF_DW); - - switch (ext_bf(buffer, DCF_Z)) - { - case DCF_Z_MET: - clock->utcoffset = -60; - break; - - case DCF_Z_MED: - clock->flags |= DCFB_DST; - clock->utcoffset = -120; - break; - - default: - printf("%-30s", "*** BAD TIME ZONE"); - return CVT_FAIL|CVT_BADFMT; - } - - if (ext_bf(buffer, DCF_A1)) - clock->flags |= DCFB_ANNOUNCE; - - if (ext_bf(buffer, DCF_A2)) - clock->flags |= DCFB_LEAP; - - if (ext_bf(buffer, DCF_R)) - clock->flags |= DCFB_ALTERNATE; - - return CVT_OK; - } - else - { - /* - * bad format - not for us - */ - printf("%-30s", "*** BAD FORMAT (invalid/parity)"); - return CVT_FAIL|CVT_BADFMT; - } -} - -char type(c) -unsigned char c; -{ - c ^= 0xFF; - return (c > 0xF); -} - -static char *wday[8] = -{ - "??", - "Mo", - "Tu", - "We", - "Th", - "Fr", - "Sa", - "Su" -}; - -static char pat[] = "-\\|/"; - -#define LINES (24-2) /* error lines after which the two headlines are repeated */ - -int -main(argc, argv) - int argc; - char **argv; -{ - if ((argc != 2) && (argc != 3)) - { - fprintf(stderr, "usage: %s [-f|-t|-ft|-tf] <device>\n", argv[0]); - exit(1); - } - else - { - unsigned char c; - char *file; - int fd; - int offset = 15; - int trace = 0; - int errs = LINES+1; - - /* - * SIMPLE(!) argument "parser" - */ - if (argc == 3) - { - if (strcmp(argv[1], "-f") == 0) - offset = 0; - if (strcmp(argv[1], "-t") == 0) - trace = 1; - if ((strcmp(argv[1], "-ft") == 0) || - (strcmp(argv[1], "-tf") == 0)) - { - offset = 0; - trace = 1; - } - file = argv[2]; - } - else - { - file = argv[1]; - } - - fd = open(file, O_RDONLY); - if (fd == -1) - { - perror(file); - exit(1); - } - else - { - int i; -#ifdef TIOCM_RTS - int on = TIOCM_RTS; -#endif - struct timeval t, tt, tlast; - char buf[61]; - clocktime_t clock; - struct termios term; - int rtc = CVT_NONE; - - if (tcgetattr(fd, &term) == -1) - { - perror("tcgetattr"); - exit(1); - } - - memset(term.c_cc, 0, sizeof(term.c_cc)); - term.c_cc[VMIN] = 1; - term.c_cflag = B50|CS8|CREAD|CLOCAL|PARENB; - term.c_iflag = IGNPAR; - term.c_oflag = 0; - term.c_lflag = 0; - - if (tcsetattr(fd, TCSANOW, &term) == -1) - { - perror("tcsetattr"); - exit(1); - } - -#ifdef I_POP - while (ioctl(fd, I_POP, 0) == 0) - ; -#endif -#if defined(TIOCMBIC) && defined(TIOCM_RTS) - if (ioctl(fd, TIOCMBIC, (caddr_t)&on) == -1) - { - perror("TIOCM_RTS"); - } -#endif - - printf(" DCF77 monitor - Copyright 1993, Frank Kardel\n\n"); - - clock.hour = 0; - clock.minute = 0; - clock.day = 0; - clock.wday = 0; - clock.month = 0; - clock.year = 0; - clock.flags = 0; - buf[60] = '\0'; - for ( i = 0; i < 60; i++) - buf[i] = '.'; - - gettimeofday(&tlast, 0L); - i = 0; - while (read(fd, &c, 1) == 1) - { - gettimeofday(&t, 0L); - tt = t; - t.tv_sec -= tlast.tv_sec; - t.tv_usec -= tlast.tv_usec; - if (t.tv_usec < 0) - { - t.tv_usec += 1000000; - t.tv_sec -= 1; - } - - if (errs > LINES) - { - printf(" %s", &"PTB private....RADMLSMin....PHour..PMDay..DayMonthYear....P\n"[offset]); - printf(" %s", &"---------------RADMLS1248124P124812P1248121241248112481248P\n"[offset]); - errs = 0; - } - - if (t.tv_sec > 1 || - (t.tv_sec == 1 && - t.tv_usec > 500000)) - { - printf("%c %.*s ", pat[i % (sizeof(pat)-1)], 59 - offset, &buf[offset]); - - if ((rtc = convert_rawdcf(buf, i, &clock)) != CVT_OK) - { - printf("\n"); - clock.hour = 0; - clock.minute = 0; - clock.day = 0; - clock.wday = 0; - clock.month = 0; - clock.year = 0; - clock.flags = 0; - errs++; - } - - if (((c^0xFF)+1) & (c^0xFF)) - buf[0] = '?'; - else - buf[0] = type(c) ? '#' : '-'; - - for ( i = 1; i < 60; i++) - buf[i] = '.'; - - i = 0; - } - else - { - if (((c^0xFF)+1) & (c^0xFF)) - buf[i] = '?'; - else - buf[i] = type(c) ? '#' : '-'; - - printf("%c %.*s ", pat[i % (sizeof(pat)-1)], 59 - offset, &buf[offset]); - } - - if (rtc == CVT_OK) - { - /* We are only supplied two digits of the year, by the - * clock, so we'll just print two digits. - */ - printf("%s, %2d:%02d:%02d, %d.%02d.%02d, <%s%s%s%s>", - wday[clock.wday], - (int)clock.hour, (int)clock.minute, (int)i, (int)clock.day, (int)clock.month, - (int)clock.year, - (clock.flags & DCFB_ALTERNATE) ? "R" : "_", - (clock.flags & DCFB_ANNOUNCE) ? "A" : "_", - (clock.flags & DCFB_DST) ? "D" : "_", - (clock.flags & DCFB_LEAP) ? "L" : "_" - ); - if (trace && (i == 0)) - { - printf("\n"); - errs++; - } - } - - printf("\r"); - - if (i < 60) - { - i++; - } - - tlast = tt; - - fflush(stdout); - } - close(fd); - } - } - return 0; -} diff --git a/usr.sbin/xntpd/refclocks/Dependencies b/usr.sbin/xntpd/refclocks/Dependencies deleted file mode 100644 index 28294765f79e..000000000000 --- a/usr.sbin/xntpd/refclocks/Dependencies +++ /dev/null @@ -1,30 +0,0 @@ -Clock Defines Restrictions AddDef Kernel -PPS PPS - PPSPPS /STREAM/ STREAM(ppsclock|ppsclocd) - PPSCLK /LD/||/STREAM/ LD||STREAM(tty_clock||tty_clk_streams) - PPSCD /STREAM/ STREAM(ppsclock|ppsclocd) -LOCAL LOCAL_CLOCK -PST PST - PSTCLK /LD/||/STREAM/ LD||STREAM(tty_clock||tty_clk_streams) - PSTPPS /PPSPPS/ -WWVB WWVB - WWVBCLK /LD/||/STREAM/ PPSPPS LD||STREAM(tty_clock||tty_clk_streams) - WWVBPPS /PPSPPS/ -CHU CHU /SUNOS4/ none -PARSE PARSE /SYSV_TTYS/||/STREAM/||/TERMIOS/ PPS any||STREAM(parse||ppsclock||ppsclocd) - PARSEPPS /SYSV_TTYS/||/STREAM/||/TERMIOS/ PPS any||STREAM(parse||ppsclock||ppsclocd) - CLOCK_* -MX4200 MX4200PPS /PPSPPS/ -AS2201 AS2201 - AS2201PPS /PPSPPS/ -GOES GOES - GOESPPS /PPSPPS/ -GPSTM GPSTM - GPSTTMPPS /PPSPPS/ -OMEGA OMEGA - OMEGAPPS /PPSPPS/ -TPRO TPRO /SUNOS/ -LEITCH LEITCH - LEITCHPPS /PPSPPS/ -MSFEES MSFEESPPS /PPSPPS/ -IRIG IRIG /SUNOS/ BSDAUDIO diff --git a/usr.sbin/xntpd/refclocks/README b/usr.sbin/xntpd/refclocks/README deleted file mode 100644 index b27b0064bdf3..000000000000 --- a/usr.sbin/xntpd/refclocks/README +++ /dev/null @@ -1,4 +0,0 @@ -This directory contains shell scripts that should allow an interactive -refclock configuration. - -Frank Kardel diff --git a/usr.sbin/xntpd/refclocks/check b/usr.sbin/xntpd/refclocks/check deleted file mode 100755 index d1e8b19cd558..000000000000 --- a/usr.sbin/xntpd/refclocks/check +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -`echo "$1" | awk '{ if ( '"$2"' ) { print ":"; } else { print "false"; } exit; }'`; diff --git a/usr.sbin/xntpd/refclocks/echon b/usr.sbin/xntpd/refclocks/echon deleted file mode 100755 index 8750ae86c2d4..000000000000 --- a/usr.sbin/xntpd/refclocks/echon +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -echo -n "$@"; diff --git a/usr.sbin/xntpd/refclocks/query b/usr.sbin/xntpd/refclocks/query deleted file mode 100755 index 07e11ccf2f7a..000000000000 --- a/usr.sbin/xntpd/refclocks/query +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -echon "$1 (y/n) [$2] ? " -X="" -read X -if [ "$X" = "" ]; then - X="$2" -fi -case "$X" in - [yY]*) exit 0;; - *) exit 1;; -esac diff --git a/usr.sbin/xntpd/refclocks/rclk.AS2201 b/usr.sbin/xntpd/refclocks/rclk.AS2201 deleted file mode 100644 index 9af89af40965..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.AS2201 +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -case "$CMD" in - info) - echo " AS2201 - Austron 2200A or 2201A GPS receiver" - ;; - check) - if check "$RCONFIG" '$0 ~ /AS2201/'; then - echo "AS2201 - Austron 2200A or 2201A GPS receiver" - fi - ;; - config) - if check "$REFCONF" '$0 ~ /AS2201/' || - ( [ ! "$REFCONF" ] && query "Include Austron 2200A or 2201A GPS receiver (AS2201)" n); then - if check "$PPSFEATURES" '$0 ~ /CD/' && - [ "$PPSOK" -eq 1 ] && - (check "$REFCONF" '$0 ~ /AS2201PPS/' || - ( [ ! "$REFCONF" ] && query " Use AS2201 for PPS" n)); then - echo "-DAS2201PPS" >> $RCONFIG - else - echo "-DAS2201" >> $RCONFIG - fi - fi - ;; -esac diff --git a/usr.sbin/xntpd/refclocks/rclk.CHU b/usr.sbin/xntpd/refclocks/rclk.CHU deleted file mode 100644 index fedd55c33dea..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.CHU +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -if check "$DEFS" '$0 ~ /SYS_SUNOS4/'; then - case "$CMD" in - info) - echo " CHU - CHU via shortwave radio" - ;; - check) - if check "$RCONFIG" '$0 ~ /CHU/'; then - echo "CHU - CHU via shortwave radio" - fi - ;; - config) - if check "$REFCONF" '$0 ~ /CHU/' || - ( [ ! "$REFCONF" ] && query "Include CHU via shortwave radio (CHU)" n); then - echo "-DCHU" >> $RCONFIG - fi - ;; -esac -fi diff --git a/usr.sbin/xntpd/refclocks/rclk.DATUM b/usr.sbin/xntpd/refclocks/rclk.DATUM deleted file mode 100644 index 3639e4a21b4b..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.DATUM +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -case "$CMD" in - info) - echo " DATUM - use Datum Programmable Time System" - ;; - check) - if check "$RCONFIG" '$0 ~ /DATUM/'; then - echo "DATUM - Datum Programmable Time System" - fi - ;; - config) - if check "$REFCONF" '$0 ~ /DATUM/' || - ( [ ! "$REFCONF" ] && query "Include DATUM reference support (DATUM)" n); then - echo "-DDATUM" >> $RCONFIG - fi - ;; -esac diff --git a/usr.sbin/xntpd/refclocks/rclk.GOES b/usr.sbin/xntpd/refclocks/rclk.GOES deleted file mode 100644 index cb87c638987e..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.GOES +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -case "$CMD" in - info) - echo " GOES - Kinemetrics/TrueTime 468-DC GOES receiver" - ;; - check) - if check "$RCONFIG" '$0 ~ /GOES/'; then - echo "GOES - Kinemetrics/TrueTime 468-DC GOES receiver" - fi - ;; - config) - if check "$REFCONF" '$0 ~ /GOES/' || - ( [ ! "$REFCONF" ] && query "Include Kinemetrics/TrueTime 468-DC GOES receiver (GOES)" n); then - if check "$PPSFEATURES" '$0 ~ /CD/'; then - if [ "$PPSOK" -eq 1 ] && - (check "$REFCONF" '$0 ~ /GOESPPS/' || - ( [ ! "$REFCONF" ] && query " Use GOES for PPS" n)); then - echo "-DGOESPPS" >> $RCONFIG - else - echo "-DGOES" >> $RCONFIG - fi - else - echo "-DGOES" >> $RCONFIG - fi - fi - ;; -esac diff --git a/usr.sbin/xntpd/refclocks/rclk.GPSTM b/usr.sbin/xntpd/refclocks/rclk.GPSTM deleted file mode 100644 index 552747a57afd..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.GPSTM +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -case "$CMD" in - info) - echo " GPSTM - Kinemetrics/TrueTime GPS-TM/TMD receiver" - ;; - check) - if check "$RCONFIG" '$0 ~ /GPSTM/'; then - echo "GPSTM - Kinemetrics/TrueTime GPS-TM/TMD receiver" - fi - ;; - config) - if check "$REFCONF" '$0 ~ /GPSTM/' || - ( [ ! "$REFCONF" ] && - query "Include Kinemetrics/TrueTime GPS-TM/TMD receiver (GPSTM)" n); then - if check "$PPSFEATURES" '$0 ~ /CD/'; then - if [ "$PPSOK" -eq 1 ] && - (check "$REFCONF" '$0 ~ /GPSTMPPS/' || - ( [ ! "$REFCONF" ] && query " Use GPSTM for PPS" n)); then - echo "-DGPSTMPPS" >> $RCONFIG - else - echo "-DGPSTM" >> $RCONFIG - fi - else - echo "-DGPSTM" >> $RCONFIG - fi - fi - ;; -esac diff --git a/usr.sbin/xntpd/refclocks/rclk.IRIG b/usr.sbin/xntpd/refclocks/rclk.IRIG deleted file mode 100644 index b480e90391c4..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.IRIG +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -if check "$DEFS" '$0 ~ /SYS_SUNOS4/'; then - case "$CMD" in - info) - echo " IRIG - IRIG-B timecode timecode using the audio codec" - ;; - check) - if check "$RCONFIG" '$0 ~ /IRIG/'; then - echo "IRIG - IRIG-B timecode timecode using the audio codec" - fi - ;; - config) - if check "$REFCONF" '$0 ~ /IRIG/' || - ( [ ! "$REFCONF" ] && query "Include IRIG-B timecode timecode using the audio codec (IRIG)" n); then - echo "-DIRIG" >> $RCONFIG - fi - ;; - esac -fi diff --git a/usr.sbin/xntpd/refclocks/rclk.LEITCH b/usr.sbin/xntpd/refclocks/rclk.LEITCH deleted file mode 100644 index 1bd5fb8011bd..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.LEITCH +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -case "$CMD" in - info) - echo " LEITCH - Leitch CSD 5300 Master Clock System Driver" - ;; - check) - if check "$RCONFIG" '$0 ~ /LEITCH/'; then - echo "LEITCH - Leitch CSD 5300 Master Clock System Driver" - fi - ;; - config) - if check "$REFCONF" '$0 ~ /LEITCH/' || - ( [ ! "$REFCONF" ] && query "Include Leitch CSD 5300 Master Clock System Driver (LEITCH)" n); then - if check "$PPSFEATURES" '$0 ~ /CD/' && - [ "$PPSOK" -eq 1 ] && - (check "$REFCONF" '$0 ~ /LEITCHPPS/' || - ( [ ! "$REFCONF" ] && query " Use LEITCH for PPS" n)); then - echo "-DLEITCHPPS" >> $RCONFIG - else - echo "-DLEITCH" >> $RCONFIG - fi - fi - ;; -esac diff --git a/usr.sbin/xntpd/refclocks/rclk.LOCAL_CLOCK b/usr.sbin/xntpd/refclocks/rclk.LOCAL_CLOCK deleted file mode 100644 index e2f9e1afe753..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.LOCAL_CLOCK +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -case "$CMD" in - info) - echo " LOCAL_CLOCK - use local clock as reference" - ;; - check) - if check "$RCONFIG" '$0 ~ /LOCAL_CLOCK/'; then - echo "LOCAL_CLOCK - local clock" - fi - ;; - config) - if check "$REFCONF" '$0 ~ /LOCAL_CLOCK/' || - ( [ ! "$REFCONF" ] && query "Include local clock reference support (LOCAL_CLOCK)" y); then - echo "-DLOCAL_CLOCK" >> $RCONFIG - fi - ;; -esac diff --git a/usr.sbin/xntpd/refclocks/rclk.MOTO b/usr.sbin/xntpd/refclocks/rclk.MOTO deleted file mode 100644 index d6e11f8e0193..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.MOTO +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -case "$CMD" in - info) - echo " MOTO - Motorola GPS clock" - ;; - check) - if check "$RCONFIG" '$0 ~ /MOTO/'; then - echo "MOTO - Motorola GPS clock" - fi - ;; - config) - if check "$REFCONF" '$0 ~ /MOTO/' || - ( [ ! "$REFCONF" ] && query "Include Motorola clock (MOTO)" n); then - if check "$PPSFEATURES" '$0 ~ /CD/' && - [ "$PPSOK" -eq 1 ] && - (check "$REFCONF" '$0 ~ /MOTOPPS/' || - ( [ ! "$REFCONF" ] && query " Use Motorola for PPS" n)); then - echo "-DMOTOPPS" >> $RCONFIG - else - echo "-DMOTO" >> $RCONFIG - fi - fi - ;; -esac diff --git a/usr.sbin/xntpd/refclocks/rclk.MSFEES b/usr.sbin/xntpd/refclocks/rclk.MSFEES deleted file mode 100644 index aeb988af8d80..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.MSFEES +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -case "$CMD" in - info) - if check "$DEFS" '$0 ~ /STREAM/'; then - echo " MSFEESPPS - EES M201 MSF receiver" - fi - ;; - check) - if check "$RCONFIG" '$0 ~ /MSFEESPPS/'; then - echo "MSFEESPPS - EES M201 MSF receiver" - fi - ;; - config) - if check "$PPSFEATURES" '$0 ~ /CD/' && - [ "$PPSOK" -eq 1 ] && - (check "$REFCONF" '$0 ~ /MSFEESPPS/' || - ( [ ! "$REFCONF" ] && query "Include EES M201 MSF receiver (MSFEESPPS)" n)); then - echo "-DMSFEESPPS" >> $RCONFIG - fi - ;; -esac diff --git a/usr.sbin/xntpd/refclocks/rclk.MX4200 b/usr.sbin/xntpd/refclocks/rclk.MX4200 deleted file mode 100644 index 5d107126192f..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.MX4200 +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -case "$CMD" in - info) - if check "$DEFS" '$0 ~ /STREAM/'; then - echo " MX4200 - Magnavox 4200 GPS receiver" - fi - ;; - check) - if check "$RCONFIG" '$0 ~ /MX4200PPS/'; then - echo "MX4200 - Magnavox 4200 GPS receiver" - fi - ;; - config) - if check "$PPSFEATURES" '$0 ~ /CD/' && - [ "$PPSOK" -eq 1 ] && - (check "$REFCONF" '$0 ~ /MX4200PPS/' || - ( [ ! "$REFCONF" ] && query "Include Magnavox 4200 GPS receiver (MX4200PPS)" n)); then - echo "-DMX4200PPS" >> $RCONFIG - fi - ;; -esac - diff --git a/usr.sbin/xntpd/refclocks/rclk.NMEA b/usr.sbin/xntpd/refclocks/rclk.NMEA deleted file mode 100644 index f5054651a2f7..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.NMEA +++ /dev/null @@ -1,23 +0,0 @@ -case "$CMD" in - info) - echo " NMEA - NMEA GPS station clock" - ;; - check) - if check "$RCONFIG" '$0 ~ /NMEA/'; then - echo "NMEA - NMEA GPS station clock" - fi - ;; - config) - if check "$REFCONF" '$0 ~ /NMEA/' || - ( [ ! "$REFCONF" ] && query "Include NMEA GPS station clock (NMEA)" n); then - if check "$PPSFEATURES" '$0 ~ /CD/' && - [ "$PPSOK" -eq 1 ] && - (check "$REFCONF" '$0 ~ /NMEAPPS/' || - ( [ ! "$REFCONF" ] && query " Use NMEA for PPS" n)); then - echo "-DNMEAPPS" >> $RCONFIG - else - echo "-DNMEA" >> $RCONFIG - fi - fi - ;; -esac diff --git a/usr.sbin/xntpd/refclocks/rclk.OMEGA b/usr.sbin/xntpd/refclocks/rclk.OMEGA deleted file mode 100644 index 62094e46130d..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.OMEGA +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -case "$CMD" in - info) - echo " OMEGA - Kinemetrics/TrueTime OM-DC OMEGA receiver" - ;; - check) - if check "$RCONFIG" '$0 ~ /OMEGA/'; then - echo "OMEGA - Kinemetrics/TrueTime OM-DC OMEGA receiver" - fi - ;; - config) - if check "$REFCONF" '$0 ~ /OMEGA/' || - ( [ ! "$REFCONF" ] && query "Include Kinemetrics/TrueTime OM-DC OMEGA receiver (OMEGA)" n); then - if check "$PPSFEATURES" '$0 ~ /CD/' && - [ "$PPSOK" -eq 1 ] && - (check "$REFCONF" '$0 ~ /OMEGAPPS/' || - ( [ ! "$REFCONF" ] && query " Use OMEGA for PPS" n)); then - echo "-DOMEGAPPS" >> $RCONFIG - else - echo "-DOMEGA" >> $RCONFIG - fi - fi - ;; -esac diff --git a/usr.sbin/xntpd/refclocks/rclk.PARSE b/usr.sbin/xntpd/refclocks/rclk.PARSE deleted file mode 100644 index 5211ccca3620..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.PARSE +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh -CMD="$1" -shift; - -. refclocks/setup - -if check "$DEFS" '$0 ~ /HAVE_SYSV_TTYS|STREAM|HAVE_TERMIOS/'; then - case "$CMD" in - info) - echo " PARSE - GENERIC refence clock driver" - echo " DCF77:" - echo " Meinberg DCF U/A 31, PZF 535" - echo " Schmid DCF77 receiver" - echo " ELV DCF7000" - echo " Raw DCF77 signal (100/200ms pulses)" - echo " GPS:" - echo " Meinberg GPS 166" - echo " Trimble GPS (TAIP Protocol)" - echo " Trimble GPS (TSIP Protocol)" - ;; - check) - if check "$RCONFIG" '$0 ~ /PARSE/ && $0 ~ /CLOCK/'; then - echon "PARSE - GENERIC" - if check "$RCONFIG" '$0 ~ /PARSEPPS/'; then echon "/PPS"; fi - if check "$RCONFIG" '$0 ~ /CLOCK_MEINBERG/'; then echon ",MEINBERG"; fi - if check "$RCONFIG" '$0 ~ /CLOCK_SCHMID/'; then echon ",SCHMID"; fi - if check "$RCONFIG" '$0 ~ /CLOCK_DCF7000/'; then echon ",DCF7000"; fi - if check "$RCONFIG" '$0 ~ /CLOCK_TRIMTAIP/'; then echon ",Trimble GPS (TAIP)"; fi - if check "$RCONFIG" '$0 ~ /CLOCK_TRIMTSIP/'; then echon ",Trimble GPS (TSIP)"; fi - if check "$RCONFIG" '$0 ~ /CLOCK_RAWDCF/'; then echon ",Raw DCF77 pulses"; fi - echo - fi - ;; - config) - if check "$REFCONF" '$0 ~ /PARSE/' || - ( [ ! "$REFCONF" ] && query "Include PARSE generic driver support" n); then - if check "$REFCONF" '$0 ~ /PARSEPPS/' || - ( [ ! "$REFCONF" ] && query " Include support for PPS simulation" y); then echo "-DPARSEPPS" >> $RCONFIG; else echo "-DPARSE" >> $RCONFIG; fi - if check "$REFCONF" '$0 ~ /MEINBERG/' || - ( [ ! "$REFCONF" ] && query " Include support for Meinberg clocks" y); then echo "-DCLOCK_MEINBERG" >> $RCONFIG; fi - if check "$REFCONF" '$0 ~ /SCHMID/' || - ( [ ! "$REFCONF" ] && query " Include support for Schmid DCF77 clock" y); then echo "-DCLOCK_SCHMID" >> $RCONFIG; fi - if check "$REFCONF" '$0 ~ /DCF7000|ELV/' || - ( [ ! "$REFCONF" ] && query " Include support for ELV/DCF7000 clock" y); then echo "-DCLOCK_DCF7000" >> $RCONFIG; fi - if check "$REFCONF" '$0 ~ /TRIMTAIP/' || - ( [ ! "$REFCONF" ] && query " Include support for Trimble GPS receiver (TAIP Protocol)" y); then echo "-DCLOCK_TRIMTAIP" >> $RCONFIG; fi - if check "$REFCONF" '$0 ~ /TRIMTSIP/' || - ( [ ! "$REFCONF" ] && query " Include support for Trimble GPS receiver (TSIP Protocol)" y); then echo "-DCLOCK_TRIMTSIP" >> $RCONFIG; fi - if check "$REFCONF" '$0 ~ /RAWDCF/' || - ( [ ! "$REFCONF" ] && query " Include support for raw DCF77 time code" y); then echo "-DCLOCK_RAWDCF" >> $RCONFIG; fi - fi - ;; - esac -fi - diff --git a/usr.sbin/xntpd/refclocks/rclk.PST b/usr.sbin/xntpd/refclocks/rclk.PST deleted file mode 100644 index 4f93c8e8f24f..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.PST +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -case "$CMD" in - info) - echo " PST - PST/Traconex 1020 WWV/H receiver" - ;; - check) - if check "$RCONFIG" '$0 ~ /PST/'; then - echo "PST - PST/Traconex 1020 WWV/H receiver" - fi - ;; - config) - if check "$REFCONF" '$0 ~ /PST/' || - ( [ ! "$REFCONF" ] && query "Include PST/Traconex 1020 WWV/H receiver (PST)" n); then - _PST=0 - if check "$PPSFEATURES" '$0 ~ /CLK/'; then - if (check "$REFCONF" '$0 ~ /PSTCLK/' || - ( [ ! "$REFCONF" ] && query " Support PPS via clk" y)); then - echo " -DPSTCLK" >> $RCONFIG - _PST=1 - fi - fi - if check "$PPSFEATURES" '$0 ~ /CD/' && - [ "$PPSOK" -eq 1 ] && - (check "$REFCONF" '$0 ~ /PSTPPS/' || - ( [ ! "$REFCONF" ] && query " Use PST for PPS" n)); then - echo " -DPSTPPS" >> $RCONFIG - else - [ "$_PST" -eq 0 ] && echo "-DPST" >> $RCONFIG - fi - fi - ;; -esac diff --git a/usr.sbin/xntpd/refclocks/rclk.TPRO b/usr.sbin/xntpd/refclocks/rclk.TPRO deleted file mode 100644 index 74e5545211fc..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.TPRO +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -if check "$DEFS" '$0 ~ /SYS_SUNOS/'; then - case "$CMD" in - info) - echo " TPRO - KSI/Odetics TPRO-S IRIG-B timecode reader" - ;; - check) - if check "$RCONFIG" '$0 ~ /TPRO/'; then - echo "TPRO - KSI/Odetics TPRO-S IRIG-B timecode reader" - fi - ;; - config) - if check "$REFCONF" '$0 ~ /TPRO/' || - ( [ ! "$REFCONF" ] && query "Include KSI/Odetics TPRO-S IRIG-B timecode reader (TPRO)" n); then - echo "-DTPRO" >> $RCONFIG - fi - ;; - esac -fi diff --git a/usr.sbin/xntpd/refclocks/rclk.TRAK b/usr.sbin/xntpd/refclocks/rclk.TRAK deleted file mode 100644 index 188ffd4445bc..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.TRAK +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -case "$CMD" in - info) - echo " TRAK - TRAK 8810 GPS station clock" - ;; - check) - if check "$RCONFIG" '$0 ~ /TRAK/'; then - echo "TRAK - TRAK 8810 GPS station clock" - fi - ;; - config) - if check "$REFCONF" '$0 ~ /TRAK/' || - ( [ ! "$REFCONF" ] && query "Include TRAK 8810 GPS station clock (TRAK)" n); then - if check "$PPSFEATURES" '$0 ~ /CD/' && - [ "$PPSOK" -eq 1 ] && - (check "$REFCONF" '$0 ~ /TRAKPPS/' || - ( [ ! "$REFCONF" ] && query " Use TRAK for PPS" n)); then - echo "-DTRAKPPS" >> $RCONFIG - else - echo "-DTRAK" >> $RCONFIG - fi - fi - ;; -esac diff --git a/usr.sbin/xntpd/refclocks/rclk.WWVB b/usr.sbin/xntpd/refclocks/rclk.WWVB deleted file mode 100644 index 2801ac70b18b..000000000000 --- a/usr.sbin/xntpd/refclocks/rclk.WWVB +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/sh - -CMD="$1" -shift; - -. refclocks/setup - -case "$CMD" in - info) - echo " WWVB - Spectracom 8170 or Netclock/2 WWVB receiver" - ;; - check) - if check "$RCONFIG" '$0 ~ /WWVB/'; then - echo "WWVB - Spectracom 8170 or Netclock/2 WWVB receiver" - fi - ;; - config) - if check "$REFCONF" '$0 ~ /WWVB/' || - ( [ ! "$REFCONF" ] && query "Include Spectracom 8170 or Netclock/2 WWVB receiver (WWVB)" n); then - _WWV=0 - if check "$PPSFEATURES" '$0 ~ /CLK/'; then - if check "$REFCONF" '$0 ~ /WWVBCLK/' || - ( [ ! "$REFCONF" ] && query " Support PPS via clk" y); then - echo " -DWWVBCLK" >> $RCONFIG - _WWV=1 - fi - fi - if check "$PPSFEATURES" '$0 ~ /CD/'; then - if [ "$PPSOK" -eq 1 ] && - (check "$REFCONF" '$0 ~ /WWVBPPS/' || - ( [ ! "$REFCONF" ] && query " Use WWVB for PPS" n)); then - echo " -DWWVBPPS" >> $RCONFIG - fi - else - [ "$_WWV" -eq 0 ] && echo "-DWWVB" >> $RCONFIG - fi - fi - ;; -esac diff --git a/usr.sbin/xntpd/refclocks/rconfig b/usr.sbin/xntpd/refclocks/rconfig deleted file mode 100644 index e49c559bf797..000000000000 --- a/usr.sbin/xntpd/refclocks/rconfig +++ /dev/null @@ -1,130 +0,0 @@ -#!/bin/sh - -# -# Refclock configuration script -# -# batch configuration options (optional arg 1) -# pps related -# PPS - general PPS support -# CLK - CLK line discipline or streams module -# CD - ppsclock or ppsclockd streams module -# LINE - dedicated line -PATH=refclocks:${PATH} -export PATH -RCONFIG=rconf -DLOCAL=dlocal -REFCONF=${1-""} - -. refclocks/setup - -rcfg="`echo refclocks/rclk.*`" - -if [ "$rcfg" = "refclocks/rclk.*" ]; then - echo "no reference clock configuration information available" -else - config="`egrep '^[ ]*CLOCKDEFS[ ]*=' Config.local | sed 's/\([^#]*\)#.*$/\1/g; s/[ ]*CLOCKDEFS[ ]*=//g; s/-D//g; s/[ ][ ]*/ /g; s/^ *//g; s/ *$//g;'`" - DEFS="`egrep '^[ ]*DEFS[ ]*=' Config | sed 's/\([^#]*\)#.*$/\1/g; s/[ ]*DEFS[ ]*=//g; s/-D//g; s/[ ][ ]*/ /g; s/^ *//g; s/ *$//g;'`" - DEFSLOCAL="`egrep '^[ ]*DEFS_LOCAL[ ]*=' Config.local | sed 's/\([^#]*\)#.*$/\1/g; s/[ ]*DEFS_LOCAL[ ]*=//g; s/-D//g; s/[ ][ ]*/ /g; s/^ *//g; s/ *$//g;'`" - if [ ! "$REFCONF" ]; then - echo - echo "Current configuration" - echo - if check "$DEFSLOCAL" '$0 ~ /MCAST/'; then - echo "==> MULTICAST SUPPORT (if available)" - echo - fi - for i in $rcfg - do - sh $i check "$config" "" "" "$DEFS" "$REFCONF" - done - echo - fi - if [ "$REFCONF" ] || query "Change Configuration" n; then - if [ ! "$REFCONF" ]; then - echo - echo 'Available reference clock drivers' - for i in $rcfg - do - sh $i info "" "" "" "$DEFS" "$REFCONF" - done - echo - fi - :>"$RCONFIG" - PPS="" - PPSFEATURES="" - PPSOK=0 - if check "$REFCONF" '$0 ~ /PLL/' || - ( [ ! "$REFCONF" ] && query "Include support for Kernel PLL" n); then - PPS="-DKERNEL_PLL $PPS" - fi - if check "$REFCONF" '$0 ~ /[^A-Za-z]PPS/' || - ( [ ! "$REFCONF" ] && query "Do you have a PPS (pulse per second) signal" n); then - if check "$DEFS" '$0 ~ /HAVE_BSD_TTYS|STREAM/' && - (check "$REFCONF" '$0 ~ /CLK/' || - ( [ ! "$REFCONF" ] && query "Is the clk line discipline available" n)); then - PPSFEATURES="CLK" - else - if check "$DEFS" '$0 ~ /STREAM/' && - (check "$REFCONF" '$0 ~ /CD/' || - ( [ ! "$REFCONF" ] && query "Is the ppsclock or ppsclocd STREAMS module available" n)); then - PPSFEATURES="CD $PPSFEATURES" - fi - fi - if check "$PPSFEATURES" '$0 ~ /CLK|CD/' && - (check "$REFCONF" '$0 ~ /LINE/' || - ( [ ! "$REFCONF" ] && query "Do you want to use a dedicated serial port for PPS signal" n)); then - if check "$PPSFEATURES" '$0 ~ /CLK/'; then - PPS="-DPPSCLK $PPS" - fi - if check "$PPSFEATURES" '$0 ~ /CD/'; then - PPS="-DPPSCD $PPS" - fi - else - PPSOK=1 - PPS="-DPPS $PPS" - fi - fi - if (check "$REFCONF" '$0 ~ /MCAST/' || - ( [ ! "$REFCONF" ] && query "Do you want allow for multicast support (if available) ?" y)); then - MCAST="-DMCAST" - else - MCAST="" - fi - for i in $rcfg - do - sh $i config "$RCONFIG" "$PPSFEATURES" "$PPSOK" "$DEFS" "$REFCONF" - if [ "$PPSOK" -eq 1 ] && egrep -e '-D..*PPS' "$RCONFIG" >/dev/null 2>&1; then - PPSOK=0 - fi - done - if egrep -e '-D..*PPS' "$RCONFIG" >/dev/null 2>&1; then - PPS="-DPPSPPS $PPS" - fi - CLOCKDEFS="`tr '\012' ' ' < $RCONFIG`" - if check "$CLOCKDEFS" '$0 !~ /^[ ]*$/'; then - PPS="-DREFCLOCK $PPS" - if [ ! "$REFCONF" ]; then - echo - echo "Do not forget to set up the appropriate device links in the /dev directory" - echo - fi - fi - if sed -e 's/^[ ]*CLOCKDEFS[ ]*=.*$/CLOCKDEFS='"$CLOCKDEFS"'/;' \ - -e 's/^[ ]*DEFS_LOCAL[ ]*=.*$/DEFS_LOCAL= $(DEFS_OPT) '"$PPS $MCAST"'/;' \ - Config.local > Config.local.new; then - mv Config.local Config.local.old && - mv Config.local.new Config.local && - rm -f Config.local.old - echo - echo "New configuration defines:" - echo " CLOCKDEFS=$CLOCKDEFS" - echo " DEFS_LOCAL="'$(DEFS_OPT)'" $PPS $MCAST" - echo - echo "Configuration updated" - else - echo "Configuration update FAILED" - fi - rm -f "$RCONFIG" - else - :; - fi -fi diff --git a/usr.sbin/xntpd/refclocks/setup b/usr.sbin/xntpd/refclocks/setup deleted file mode 100644 index 461117841c35..000000000000 --- a/usr.sbin/xntpd/refclocks/setup +++ /dev/null @@ -1,16 +0,0 @@ -# -# gobble possible parameters -# -if [ $# -eq 5 ]; then - RCONFIG="$1" - PPSFEATURES="$2" - PPSOK="$3" - DEFS="$4" - REFCONF="$5" -fi -# -# shell dumbness detection -# -if (eval "_x () { :; }") >/dev/null 2>&1 ; then - . refclocks/setupfn -fi diff --git a/usr.sbin/xntpd/refclocks/setupfn b/usr.sbin/xntpd/refclocks/setupfn deleted file mode 100644 index 5724dcb52da6..000000000000 --- a/usr.sbin/xntpd/refclocks/setupfn +++ /dev/null @@ -1,27 +0,0 @@ -# -# sh io functions -# -if [ "`echo -n`" = "-n" ]; then - echon () { echo "$@\\c"; } -else - echon () { echo -n "$@"; } -fi - -query() { - _Q="$1" - _A="$2" - echon "$_Q (y/n) [$_A] ? " - X="" - read X - if [ "$X" = "" ]; then - X="$_A" - fi - case "$X" in - [yY]*) return 0;; - *) return 1;; - esac -} - -check () { - `echo "$1" | awk '{ if ( '"$2"' ) { print ":"; } else { print "false"; } exit; }'`; -} diff --git a/usr.sbin/xntpd/scripts/Guess.sh b/usr.sbin/xntpd/scripts/Guess.sh deleted file mode 100755 index 9b3180bf0e25..000000000000 --- a/usr.sbin/xntpd/scripts/Guess.sh +++ /dev/null @@ -1,130 +0,0 @@ -#! /bin/sh - -if [ -f /bin/uname -o -f /usr/bin/uname ]; then - set `uname -a | tr '[A-Z]' '[a-z]'` -# set `cat test | tr '[A-Z]' '[a-z]'` - case "$1" in - convexos) case "$4" in - 10.*) guess="convexos10" ;; - esac - ;; - aix) case "$4" in - 3) case "$3" in - 1) guess="aix3.1" ;; - 2) guess="aix3.2" ;; - esac - ;; - esac - ;; - sinix-m) - guess=sinix-m - ;; - sunos|solaris) - case "$3" in - 4.1*) guess="sunos4" ;; - 5.1) guess="sunos5.1" ;; - 5.2) guess="sunos5.2" ;; - 5.*) guess="sunos5.3" ;; - esac - ;; - irix) case "$3" in - 4.*) guess="irix4" ;; - 5.*) guess="irix5" ;; - esac - ;; - "a/ux") case "$3" in - 2.*) guess="aux2" ;; - 3.*) guess="aux3" ;; - esac - ;; - ultrix) - guess="ultrix" - ;; - hp-ux) case "$3" in - *.10.*) guess="hpux-adj" ;; - *.09.03) case "$5" in - 9000/3*) guess="hpux-adj" ;; - *) guess="hpux" ;; - esac ;; - *) guess="hpux" ;; - esac - ;; - linux) guess="linux" ;; - - osf1) case "$5" in - alpha) guess="decosf1" ;; - esac - ;; - "bsd/386") - guess="bsdi" - ;; - "freebsd") - guess="freebsd" - ;; - "netbsd") - guess="netbsd" - ;; - "4.4bsd") - guess="4.4bsd" - ;; - # now the fun starts - there are vendors that - # do not really identify their OS in uname. - # Fine - now I look at our version and hope - # that nobody else had this marvellous idea. - # I am not willing to mention the vendor explicitly - *) # Great ! - We are dealing with an industry standard ! - if [ -f /unix ]; then - # - # looks like this thing has the license - # to call itself Unix - # - case "$3" in - 3.2.*) - case "$4" in - v*) - (i386) >/dev/null 2>&1 && [ -f /usr/lib/libseq.a ] && guess=ptx;; - esac - esac - fi - ;; - esac -fi - -if [ "0$guess" != "0" ]; then - echo $guess - exit 0 -fi - -if [ -f /bin/machine ]; then - echo `/bin/machine` - exit 0 -fi - -if [ -f /usr/convex/vers ]; then - set `/usr/convex/vers /vmunix` - case "$2" in - 9.0) echo "convexos9" - exit 0 ;; - esac -fi - -if [ -d /usr/lib/NextStep ]; then - echo next - exit 0 -fi - -if [ -f /netbsd ]; then - echo netbsd - exit 0 -fi - -if [ -f /lib/clib -a -f /lib/libc ]; then - echo domainos - exit 0 -fi - -case "$guess" in - '') guess="none" -esac - -echo $guess diff --git a/usr.sbin/xntpd/scripts/README b/usr.sbin/xntpd/scripts/README deleted file mode 100644 index 7439c6c6c498..000000000000 --- a/usr.sbin/xntpd/scripts/README +++ /dev/null @@ -1,41 +0,0 @@ -README file for directory ./scripts of the NTP Version 3 distribution - -This directory contains shell and perl script files for the configuration, -monitoring and support of NTP installations. See the README and RELNOTES -files in the parent directory for directions on how to use these files. - -Guess.sh script to figure out what machine and operating system - is running this thing. Prizes awarded for new machines - added to the list. - -autoconf awesome script swiped from Jeff Johnson (who may have - swiped it from GNU) which delves deep into the system - files to reveal dark secrets necessary to port NTP to - everything except sewing machines. Unfinished work. - -makeconfig.sh shell script that calles Guess.sh and then figures out - what compiler is available, then builds the - configuration file in the base directory. Finally, it - launches the sed script Config.sed in the base directory - to make the makefiles used by most programs. - -mklinks script useful to create directories for multiple - architecture maintenance - -mkversion script useful to create new version numbers for all - sources - -monitoring directory containing perl scripts useful for monitoring - operations - -ntp-groper script useful for reaching out and rattling the cages of - NTP peers to see if animals are inside the bars - -ntp-restart script useful for killing and restarting the NTP daemon - -stats directory containing awk ans shell scripts useful for - maintaining statistics summaries of clockstats, loopstats - and peerstats files - -support directory containing shell and perl scripts useful for - configuration and monitoring of NTP subnets diff --git a/usr.sbin/xntpd/scripts/autoconf b/usr.sbin/xntpd/scripts/autoconf deleted file mode 100755 index b661910b5e23..000000000000 --- a/usr.sbin/xntpd/scripts/autoconf +++ /dev/null @@ -1,885 +0,0 @@ -#!/bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf. -# Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -# Usage: configure [--srcdir=DIR] [--host=HOST] [--gas] [--nfp] [--no-create] -# [--prefix=PREFIX] [--exec-prefix=PREFIX] [--with-PACKAGE] [TARGET] -# Ignores all args except --srcdir, --prefix, --exec-prefix, --no-create, and -# --with-PACKAGE unless this script has special code to handle it. - - -for arg -do - # Handle --exec-prefix with a space before the argument. - if test x$next_exec_prefix = xyes; then exec_prefix=$arg; next_exec_prefix= - # Handle --host with a space before the argument. - elif test x$next_host = xyes; then next_host= - # Handle --prefix with a space before the argument. - elif test x$next_prefix = xyes; then prefix=$arg; next_prefix= - # Handle --srcdir with a space before the argument. - elif test x$next_srcdir = xyes; then srcdir=$arg; next_srcdir= - else - case $arg in - # For backward compatibility, also recognize exact --exec_prefix. - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* | --exec=* | --exe=* | --ex=* | --e=*) - exec_prefix=`echo $arg | sed 's/[-a-z_]*=//'` ;; - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- | --exec | --exe | --ex | --e) - next_exec_prefix=yes ;; - - -gas | --gas | --ga | --g) ;; - - -host=* | --host=* | --hos=* | --ho=* | --h=*) ;; - -host | --host | --hos | --ho | --h) - next_host=yes ;; - - -nfp | --nfp | --nf) ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre | --no-cr | --no-c | --no- | --no) - no_create=1 ;; - - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=`echo $arg | sed 's/[-a-z_]*=//'` ;; - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - next_prefix=yes ;; - - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=* | --s=*) - srcdir=`echo $arg | sed 's/[-a-z_]*=//'` ;; - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr | --s) - next_srcdir=yes ;; - - -with-* | --with-*) - package=`echo $arg|sed 's/-*with-//'` - # Delete all the valid chars; see if any are left. - if test -n "`echo $package|sed 's/[-a-zA-Z0-9_]*//g'`"; then - echo "configure: $package: invalid package name" >&2; exit 1 - fi - eval "with_`echo $package|sed s/-/_/g`=1" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb | --ver | --ve | --v) - verbose=yes ;; - - *) ;; - esac - fi -done - -trap 'rm -f conftest* core; exit 1' 1 3 15 - -# Needed for some versions of `tr' so that character classes in `[]' work. -if test "${LANG+set}" = "set" ; then - LANG=C -fi - -rm -f conftest* -compile='${CC-cc} $CFLAGS $DEFS conftest.c -o conftest $LIBS >/dev/null 2>&1' - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -unique_file=lib/msyslog.c - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - srcdirdefaulted=yes - # Try the directory containing this script, then `..'. - prog=$0 - confdir=`echo $prog|sed 's%/[^/][^/]*$%%'` - test "X$confdir" = "X$prog" && confdir=. - srcdir=$confdir - if test ! -r $srcdir/$unique_file; then - srcdir=.. - fi -fi -if test ! -r $srcdir/$unique_file; then - if test x$srcdirdefaulted = xyes; then - echo "configure: Can not find sources in \`${confdir}' or \`..'." 1>&2 - else - echo "configure: Can not find sources in \`${srcdir}'." 1>&2 - fi - exit 1 -fi -# Preserve a srcdir of `.' to avoid automounter screwups with pwd. -# But we can't avoid them for `..', to make subdirectories work. -case $srcdir in - .|/*|~*) ;; - *) srcdir=`cd $srcdir; pwd` ;; # Make relative path absolute. -esac - - -useresolv="" - -echo CONFIGURE -- initializing DEFS -test -z "$DEFS" && DEFS="-DDEBUG -DREFCLOCK" -echo CONFIGURE -- initializing AUTHDEFS -test -z "$AUTHDEFS" && AUTHDEFS="-DDES -DMD5" -echo CONFIGURE -- initializing CLOCKDEFS -test -z "$CLOCKDEFS" && CLOCKDEFS="-DAS2201 -DCHU -DGOES -DLEITCH -DLOCAL_CLOCK -DOMEGA -DPST -DWWVB" -echo CONFIGURE -- initializing COPTS -test -z "$COPTS" && COPTS="-O" - -test -z "$INCLUDE" && INCLUDE="-I../include" -test -z "$LIB" && LIB="../lib/libntp.a" - -test "`uname`" = "SunOS" && { - DEFS="$DEFS -DXNTP_RETROFIT_STDLIB" -} -test "`uname`" = "ULTRIX" && { - DEFS="$DEFS -DXNTP_RETROFIT_STDLIB -DPLL -DREADKMEM" -} -test "`uname`" = "BSD/386" && { - DEFS="$DEFS -D__bsdi__" -} -test -d /usr/lib/NextStep && { - DEFS="$DEFS -DREADKMEM -DSYNCTODR_SUCKS" -} - -SOLARIS="" -test -d /kernel && test -d /opt && isSOLARIS="1" - -echo TODO -- checking for HPUX - -# We want these before the checks, so the checks can modify their values. -test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1 -test -z "$LDFLAGS" && LDFLAGS=-g - -#========================================================================== -if test -z "$CC"; then - # Extract the first word of `gcc', so it can be a program name with args. - set dummy gcc; word=$2 - echo checking for $word - IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:" - for dir in $PATH; do - test -z "$dir" && dir=. - if test -f $dir/$word; then - CC="gcc" - break - fi - done - IFS="$saveifs" -fi -test -z "$CC" && CC="cc" -test -n "$CC" -a -n "$verbose" && echo " setting CC to $CC" - -# Find out if we are using GNU C, under whatever name. -cat > conftest.c <<EOF -#ifdef __GNUC__ - yes -#endif -EOF -${CC-cc} -E conftest.c > conftest.out 2>&1 -if egrep yes conftest.out >/dev/null 2>&1; then - GCC=1 # For later tests. -fi -rm -f conftest* - - -# If we're using gcc and the user hasn't specified CFLAGS, add -O to CFLAGS. -test -n "$GCC" && test -n "$auto_cflags" && CFLAGS="$CFLAGS -O" - - -echo checking how to run the C preprocessor -if test -z "$CPP"; then - CPP='${CC-cc} -E' - cat > conftest.c <<EOF -#include <stdio.h> -EOF -err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"` -if test -z "$err"; then - : -else - CPP=/lib/cpp -fi -rm -f conftest* -fi - -if test -n "$GCC"; then - echo checking whether -traditional is needed - pattern="Autoconf.*'x'" - prog='#include <sgtty.h> -Autoconf TIOCGETP' - cat > conftest.c <<EOF -$prog -EOF -eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" -if egrep "$pattern" conftest.out >/dev/null 2>&1; then - need_trad=1 -fi -rm -f conftest* - - - if test -z "$need_trad"; then - prog='#include <termio.h> -Autoconf TCGETA' - cat > conftest.c <<EOF -$prog -EOF -eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" -if egrep "$pattern" conftest.out >/dev/null 2>&1; then - need_trad=1 -fi -rm -f conftest* - - fi - test -n "$need_trad" && CC="$CC -traditional" -fi - -if test -z "$RANLIB"; then - # Extract the first word of `ranlib', so it can be a program name with args. - set dummy ranlib; word=$2 - echo checking for $word - IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:" - for dir in $PATH; do - test -z "$dir" && dir=. - if test -f $dir/$word; then - RANLIB="ranlib" - break - fi - done - IFS="$saveifs" -fi -test -z "$RANLIB" && RANLIB=":" -test -n "$RANLIB" -a -n "$verbose" && echo " setting RANLIB to $RANLIB" - - -# aC_MEMORY_H -echo checking for ANSI C header files -cat > conftest.c <<EOF -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> -#include <float.h> -EOF -err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"` -if test -z "$err"; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. -echo '#include <string.h>' > conftest.c -eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" -if egrep "memchr" conftest.out >/dev/null 2>&1; then - # SGI's /bin/cc from Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -cat > conftest.c <<EOF -#include <ctype.h> -#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#define XOR(e,f) (((e) && !(f)) || (!(e) && (f))) -int main () { int i; for (i = 0; i < 256; i++) -if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); -exit (0); } - -EOF -eval $compile -if test -s conftest && (./conftest; exit) 2>/dev/null; then - { -test -n "$verbose" && \ -echo ' defining' STDC_HEADERS -DEFS="$DEFS -DSTDC_HEADERS=1" -} - -fi -rm -f conftest* -fi -rm -f conftest* - -fi -rm -f conftest* - -for hdr in string.h memory.h -do -trhdr=HAVE_`echo $hdr | tr '[a-z]./' '[A-Z]__'` -echo checking for ${hdr} -cat > conftest.c <<EOF -#include <${hdr}> -EOF -err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"` -if test -z "$err"; then - { -test -n "$verbose" && \ -echo ' defining' ${trhdr} -DEFS="$DEFS -D${trhdr}=1" -} - -fi -rm -f conftest* -done - -echo checking for unistd.h -cat > conftest.c <<EOF -#include <unistd.h> -EOF -err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"` -if test -z "$err"; then - { -test -n "$verbose" && \ -echo ' defining' NTP_POSIX_SOURCE -DEFS="$DEFS -DNTP_POSIX_SOURCE=1" -} - -fi -rm -f conftest* - - -echo checking for mode_t in sys/types.h -echo '#include <sys/types.h>' > conftest.c -eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" -if egrep "mode_t" conftest.out >/dev/null 2>&1; then - : -else - { -test -n "$verbose" && \ -echo ' defining' mode_t to be 'int' -DEFS="$DEFS -Dmode_t=int" -} - -fi -rm -f conftest* - -echo checking for pid_t in sys/types.h -echo '#include <sys/types.h>' > conftest.c -eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" -if egrep "pid_t" conftest.out >/dev/null 2>&1; then - : -else - { -test -n "$verbose" && \ -echo ' defining' pid_t to be 'int' -DEFS="$DEFS -Dpid_t=int" -} - -fi -rm -f conftest* - -echo checking for return type of signal handlers -cat > conftest.c <<EOF -#include <sys/types.h> -#include <signal.h> -#ifdef signal -#undef signal -#endif -extern void (*signal ()) (); -int main() { exit(0); } -int t() { int i; } -EOF -if eval $compile; then - { -test -n "$verbose" && \ -echo ' defining' RETSIGTYPE to be 'void' -DEFS="$DEFS -DRETSIGTYPE=void" -} - -else - { -test -n "$verbose" && \ -echo ' defining' RETSIGTYPE to be 'int' -DEFS="$DEFS -DRETSIGTYPE=int" -} - -fi -rm -f conftest* - - -echo checking for size_t in sys/types.h -echo '#include <sys/types.h>' > conftest.c -eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" -if egrep "size_t" conftest.out >/dev/null 2>&1; then - : -else - { -test -n "$verbose" && \ -echo ' defining' size_t to be 'unsigned' -DEFS="$DEFS -Dsize_t=unsigned" -} - -fi -rm -f conftest* - - -# aC_VPRINTF - -# aC_TIME_WITH_SYS_TIME -# aC_STRUCT_TM - -# aC_CHAR_UNSIGNED -echo checking for signed char declaration -cat > conftest.c <<EOF -main() { signed char c; } -EOF -eval $compile -if test -s conftest && (./conftest; exit) 2>/dev/null; then - : -else - { -test -n "$verbose" && \ -echo ' defining' NO_SIGNED_CHAR_DECL -DEFS="$DEFS -DNO_SIGNED_CHAR_DECL=1" -} - -fi -rm -f conftest* -echo checking for s_char in sys/types.h -echo '#include <sys/types.h>' > conftest.c -eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" -if egrep "s_char" conftest.out >/dev/null 2>&1; then - { -test -n "$verbose" && \ -echo ' defining' S_CHAR_DEFINED -DEFS="$DEFS -DS_CHAR_DEFINED=1" -} - -fi -rm -f conftest* - - -prog='/* Ultrix mips cc rejects this. */ -typedef int charset[2]; const charset x; -/* SunOS 4.1.1 cc rejects this. */ -char const *const *ccp; -char **p; -/* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in an arm - of an if-expression whose if-part is not a constant expression */ -const char *g = "string"; -p = &g + (g ? g-g : 0); -/* HPUX 7.0 cc rejects these. */ -++ccp; -p = (char**) ccp; -ccp = (char const *const *) p; -{ /* SCO 3.2v4 cc rejects this. */ - char *t; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; -} -{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25,17}; - const int *foo = &x[0]; - ++foo; -} -{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; -} -{ /* AIX XL C 1.02.0.0 rejects this saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; -}' -echo checking for working const -cat > conftest.c <<EOF - -int main() { exit(0); } -int t() { $prog } -EOF -if eval $compile; then - : -else - { -test -n "$verbose" && \ -echo ' defining' const to be 'empty' -DEFS="$DEFS -Dconst=" -} - -fi -rm -f conftest* - -if test -n "$GCC"; then -echo checking for inline -cat > conftest.c <<EOF - -int main() { exit(0); } -int t() { } inline foo() { } -EOF -if eval $compile; then - : -else - { -test -n "$verbose" && \ -echo ' defining' inline to be '__inline' -DEFS="$DEFS -Dinline=__inline" -} - -fi -rm -f conftest* - -fi - - -# aC_INT_16_BITS -# DEC Alpha running OSF/1 -echo checking integer size -cat > conftest.c <<EOF -main() { exit(!(sizeof(long) > sizeof(int))); } -EOF -eval $compile -if test -s conftest && (./conftest; exit) 2>/dev/null; then - { -test -n "$verbose" && \ -echo ' defining' LONG to be 'int' -DEFS="$DEFS -DLONG=int" -} - { -test -n "$verbose" && \ -echo ' defining' U_LONG to be 'u_int' -DEFS="$DEFS -DU_LONG=u_int" -} - -fi -rm -f conftest* - -if test -n "$GCC"; then -{ -test -n "$verbose" && \ -echo ' defining' HAVE_LONG_DOUBLE -DEFS="$DEFS -DHAVE_LONG_DOUBLE=1" -} - -else -echo checking for long double -cat > conftest.c <<EOF - -int main() { exit(0); } -int t() { } long double foo() { } -EOF -if eval $compile; then - { -test -n "$verbose" && \ -echo ' defining' HAVE_LONG_DOUBLE -DEFS="$DEFS -DHAVE_LONG_DOUBLE=1" -} - -fi -rm -f conftest* - -fi - -echo checking byte ordering -cat > conftest.c <<EOF -main () { - /* Are we little or big endian? From Harbison&Steele. */ - union - { - long l; - char c[sizeof (long)]; - } u; - u.l = 1; - exit (u.c[sizeof (long) - 1] == 1); -} -EOF -eval $compile -if test -s conftest && (./conftest; exit) 2>/dev/null; then - : -else - { -test -n "$verbose" && \ -echo ' defining' WORDS_BIGENDIAN -DEFS="$DEFS -DWORDS_BIGENDIAN=1" -} - -fi -rm -f conftest* - - -echo checking for restartable system calls -cat > conftest.c <<EOF -/* Exit 0 (true) if wait returns something other than -1, - i.e. the pid of the child, which means that wait was restarted - after getting the signal. */ -#include <sys/types.h> -#include <signal.h> -ucatch (isig) { } -main () { - int i = fork (), status; - if (i == 0) { sleep (3); kill (getppid (), SIGINT); sleep (3); exit (0); } - signal (SIGINT, ucatch); - status = wait(&i); - if (status == -1) wait(&i); - exit (status == -1); -} - -EOF -eval $compile -if test -s conftest && (./conftest; exit) 2>/dev/null; then - { -test -n "$verbose" && \ -echo ' defining' HAVE_RESTARTABLE_SYSCALLS -DEFS="$DEFS -DHAVE_RESTARTABLE_SYSCALLS=1" -} - -fi -rm -f conftest* - - -havestreams="" -echo checking for sys/stream.h -cat > conftest.c <<EOF -#include <sys/stream.h> -EOF -err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"` -if test -z "$err"; then - { -test -n "$verbose" && \ -echo ' defining' STREAM -DEFS="$DEFS -DSTREAM=1" -} - havestreams="1" -fi -rm -f conftest* - -echo checking clock options - -if test -f /dev/pps ; then - echo found ppsclk - DEFS="$DEFS -DPPSCLK" -fi -if test -f /dev/tpro ; then - echo found tpro - CLOCKDEFS="$CLOCKDEFS -DTPRO" -fi -if test -f /dev/irig ; then - echo found irig - CLOCKDEFS="$CLOCKDEFS -DIRIG" -fi - -echo TODO -- checking for adjtime/libadjtimed.a - -test -n "$useresolv" && { - LIBS_save="${LIBS}" -LIBS="${LIBS} -lresolv" -have_lib="" -echo checking for -lresolv -cat > conftest.c <<EOF - -int main() { exit(0); } -int t() { main(); } -EOF -if eval $compile; then - have_lib="1" -fi -rm -f conftest* -LIBS="${LIBS_save}" -if test -n "${have_lib}"; then - :; RESLIB="$RESLIB -lresolv" -else - :; -fi - -} -test -n "$isSOLARIS" && { - { -test -n "$verbose" && \ -echo ' defining' SOLARIS -DEFS="$DEFS -DSOLARIS=1" -} - - { -test -n "$verbose" && \ -echo ' defining' SLEWALWAYS -DEFS="$DEFS -DSLEWALWAYS=1" -} - - { -test -n "$verbose" && \ -echo ' defining' STUPID_SIGNAL -DEFS="$DEFS -DSTUPID_SIGNAL=1" -} - - LIBS_save="${LIBS}" -LIBS="${LIBS} -lsocket" -have_lib="" -echo checking for -lsocket -cat > conftest.c <<EOF - -int main() { exit(0); } -int t() { main(); } -EOF -if eval $compile; then - have_lib="1" -fi -rm -f conftest* -LIBS="${LIBS_save}" -if test -n "${have_lib}"; then - :; RESLIB="$RESLIB -lsocket" -else - :; -fi - - LIBS_save="${LIBS}" -LIBS="${LIBS} -lnsl" -have_lib="" -echo checking for -lnsl -cat > conftest.c <<EOF - -int main() { exit(0); } -int t() { main(); } -EOF -if eval $compile; then - have_lib="1" -fi -rm -f conftest* -LIBS="${LIBS_save}" -if test -n "${have_lib}"; then - :; RESLIB="$RESLIB -lnsl" -else - :; -fi - - LIBS_save="${LIBS}" -LIBS="${LIBS} -lelf" -have_lib="" -echo checking for -lelf -cat > conftest.c <<EOF - -int main() { exit(0); } -int t() { main(); } -EOF -if eval $compile; then - have_lib="1" -fi -rm -f conftest* -LIBS="${LIBS_save}" -if test -n "${have_lib}"; then - :; RESLIB="$RESLIB -lelf" -else - :; -fi - -} - -LIBS_save="${LIBS}" -LIBS="${LIBS} -lBSD" -have_lib="" -echo checking for -lBSD -cat > conftest.c <<EOF - -int main() { exit(0); } -int t() { main(); } -EOF -if eval $compile; then - have_lib="1" -fi -rm -f conftest* -LIBS="${LIBS_save}" -if test -n "${have_lib}"; then - :; LIBS="$LIBS -lBSD" -else - :; -fi - -test -n "$have_lib" && { -test -n "$verbose" && \ -echo ' defining' COMPAT to be '"-lBSD"' -DEFS="$DEFS -DCOMPAT=\"-lBSD\"" -} - - -test -z "$isSOLARIS" && { - LIBS_save="${LIBS}" -LIBS="${LIBS} -lkvm" -have_lib="" -echo checking for -lkvm -cat > conftest.c <<EOF - -int main() { exit(0); } -int t() { main(); } -EOF -if eval $compile; then - have_lib="1" -fi -rm -f conftest* -LIBS="${LIBS_save}" -if test -n "${have_lib}"; then - :; RESLIB="$RESLIB -lkvm" -else - :; -fi - - test -n "$have_lib" && { -test -n "$verbose" && \ -echo ' defining' USELIBKVM -DEFS="$DEFS -DUSELIBKVM=1" -} - -} - -LIBS_save="${LIBS}" -LIBS="${LIBS} -lmld" -have_lib="" -echo checking for -lmld -cat > conftest.c <<EOF - -int main() { exit(0); } -int t() { main(); } -EOF -if eval $compile; then - have_lib="1" -fi -rm -f conftest* -LIBS="${LIBS_save}" -if test -n "${have_lib}"; then - :; RESLIB="$RESLIB -lmld" -else - :; -fi - - -prefix=/usr/local -bindir=/usr/local/bin - -if test -n "$prefix"; then - test -z "$exec_prefix" && exec_prefix='${prefix}' - prsub="s%^prefix\\([ ]*\\)=\\([ ]*\\).*$%prefix\\1=\\2$prefix%" -fi -if test -n "$exec_prefix"; then - prsub="$prsub -s%^exec_prefix\\([ ]*\\)=\\([ ]*\\).*$%\ -exec_prefix\\1=\\2$exec_prefix%" -fi -DEFS="`echo \"$DEFS\" | sed 's%[&\\\]%\\\&%g'`" - -trap 'rm -f config.status; exit 1' 1 3 15 -echo creating config.status -rm -f config.status -cat > config.status <<EOF -#!/bin/sh -# Generated automatically by autoconf. -# Run this file to recreate the current configuration. -# This directory was configured as follows, -# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# -# $0 $* -PROGS='$PROGS' -CC='$CC' -CFLAGS='$CFLAGS' -LDFLAGS='$LDFLAGS' -CPP='$CPP' -RANLIB='$RANLIB' -bindir='$bindir' -AUTHDEFS='$AUTHDEFS' -CLOCKDEFS='$CLOCKDEFS' -COPTS='$COPTS' -INCLUDE='$INCLUDE' -LIB='$LIB' -ADJLIB='$ADJLIB' -RESLIB='$RESLIB' -COMPAT='$COMPAT' -LIBS='$LIBS' -srcdir='$srcdir' -DEFS='$DEFS' -prefix='$prefix' -exec_prefix='$exec_prefix' -prsub='$prsub' -EOF - diff --git a/usr.sbin/xntpd/scripts/install.sh b/usr.sbin/xntpd/scripts/install.sh deleted file mode 100755 index 1bc4989de16a..000000000000 --- a/usr.sbin/xntpd/scripts/install.sh +++ /dev/null @@ -1,100 +0,0 @@ -#!/bin/sh -# -# Emulate the BSD install command with cpset for System V -# Tom Moore - NCR Corporation -# -PATH=/bin:/etc:/usr/bin:/usr/ucb -export PATH - -# Default values -mode=0755 -owner=bin -group=bin -strip=FALSE -remove=TRUE - -USAGE="install [-s] [-c] [-m mode] [-o owner] [-g group] source file|directory" -set -- `getopt scm:o:g: $*` || { - echo $USAGE >&2 - exit 2 -} -for option in $* -do - case $option in - -s) # Strip the installed file - strip=TRUE - shift - ;; - -c) # Copy the source file rather than move it - remove=FALSE - shift - ;; - -m) # File mode - mode=$2 - shift 2 - ;; - -o) # File owner - owner=$2 - shift 2 - ;; - -g) # File group - group=$2 - shift 2 - ;; - --) # End of options - shift - break - ;; - esac -done - -case $# in -0) echo "install: no file or destination specified" >&2 - exit 2 - ;; -1) echo "install: no destination specified" >&2 - exit 2 - ;; -2) source=$1 - destination=$2 - ;; -*) echo "install: too many files specified" >&2 - exit 2 - ;; -esac - -[ $source = $destination -o $destination = . ] && { - echo "install: can't move $source onto itself" >&2 - exit 1 -} - -[ -f $source ] || { - echo "install: can't open $source" >&2 - exit 1 -} - -if [ -d $destination ] -then - file=`basename $source` - OLDdestination=$destination/OLD$file - destination=$destination/$file -else - dir=`dirname $destination` - file=`basename $destination` - OLDdestination=$dir/OLD$file -fi - -(cp $source $destination && - chmod $mode $destination && - chown $owner $destination && - chgrp $group $destination) || true # exit 1 - -# /bin/rm -f $OLDdestination - -[ $strip = TRUE ] && - strip $destination - -[ $remove = TRUE ] && - rm -f $source - -exit 0 diff --git a/usr.sbin/xntpd/scripts/makeconfig.sh b/usr.sbin/xntpd/scripts/makeconfig.sh deleted file mode 100755 index 8842a86c6c51..000000000000 --- a/usr.sbin/xntpd/scripts/makeconfig.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/bin/sh - -MACHINE=${1-${OS}} -COMPILER=${2-${CC}} - -# -# Figure out which compiler to use. Stolen from Jeff Johnson. -# -if [ "0$COMPILER" = "0" ]; then - COMPILER="cc" - set dummy gcc; word=$2 - IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:" - for dir in $PATH; do - test -z "$dir" && dir=. - if test -f $dir/$word; then - COMPILER="gcc" - break - fi - done - IFS="$saveifs" -fi - -# -# Figure out the byte order and word size. -# -if (cd util && rm -f longsize && $COMPILER -o longsize longsize.c ); then - if util/longsize >/dev/null 2>&1; then - LONG=`util/longsize` - else - echo "TROUBLE: executables built by your compiler don't work - bug your vendor" - exit 1 - fi -else - echo "TROUBLE: could not compile !" - echo "TROUBLE: either your compiler does not work / is not present" - echo "TROUBLE: or you have mangled the file tree" - exit 1 -fi -(cd util && rm -f byteorder && $COMPILER -o byteorder byteorder.c $LONG ) -BYTE=`util/byteorder ` -if [ "0$BYTE" = "0" ]; then - BYTE="XNTP_BIG_ENDIAN" -fi -(cd util && rm -f byteorder longsize) - -# -# Figure out which machine we have. -# -if [ "0$MACHINE" = "0" ]; then - GUESS=`scripts/Guess.sh` - if [ "0$GUESS" = "0none" ]; then - echo ' ' - echo "I don't know your system!" - echo "I do know about the following systems:" - (cd machines && ls -C *) - echo "Choose a system and type \"make OS=<system>\"" - exit 1 - else - if [ -f machines/$GUESS ]; then - MACHINE=$GUESS - else - if [ -f machines/$GUESS.posix ]; then - MACHINE="$GUESS.posix" - else - MACHINE="$GUESS.bsd" - fi - fi - fi -fi - -echo "Configuring machines/$MACHINE compilers/$MACHINE.$COMPILER" - -if [ -f machines/$MACHINE ]; then - cat machines/$MACHINE >Config ; - if [ -f compilers/$MACHINE.$COMPILER ]; then - cat compilers/$MACHINE.$COMPILER >>Config - else - echo "COMPILER= $COMPILER" >>Config - fi - echo "LIBDEFS= -D$BYTE" >>Config - cat Config.local >>Config -else - echo "Don't know how to build xntpd for machine $MACHINE " ; - exit 1 -fi diff --git a/usr.sbin/xntpd/scripts/mklinks b/usr.sbin/xntpd/scripts/mklinks deleted file mode 100755 index 8565d1ca3580..000000000000 --- a/usr.sbin/xntpd/scripts/mklinks +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# call from the source root as 'mklinks ../sun4 ../src' -find . -type d -print | sort | sed "s-^\.-mkdir $1-" | sh -root=`echo $2 | sed "s-^\.\./--"` -find . ! -type d -a ! -name Config -print | sed "s-^\./--" | while read file - do - down=`echo $file | sed -e "s-[^/]*-..-g"` - ln -s $down/$root/$file $1/$file - done diff --git a/usr.sbin/xntpd/scripts/mkversion b/usr.sbin/xntpd/scripts/mkversion deleted file mode 100755 index fe043e008ffc..000000000000 --- a/usr.sbin/xntpd/scripts/mkversion +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh - -PROG=${1-UNKNOWN} -if [ ! -f .version ]; then - echo 0 > .version -fi - -RUN="`cat .version`" -RUN="`expr $RUN + 1`" -echo $RUN > .version - -DATE="`LC_TIME=C date`" -TOPDIR=`echo $0 | sed -e 's;mkversion;..;'` - -if [ -r VERSION ]; then - VERSION=VERSION -else if [ -r ${TOPDIR}/VERSION ]; then - VERSION=${TOPDIR}/VERSION -else - VERSION=../VERSION -fi; fi - -if [ -f "$VERSION" ]; then - FLAGS="`egrep '^[0-9a-zA-Z_]+=' "$VERSION" | tr '\012' ';'` " -else - FLAGS="" -fi - -echo "Version $PROG ${FLAGS}${DATE} (${RUN})"; - -rm -f version.c -cat > version.c << -EoF- -/* - * version file for $PROG - */ -char * Version = "$PROG ${FLAGS}${DATE} (${RUN})"; --EoF- diff --git a/usr.sbin/xntpd/scripts/monitoring/README b/usr.sbin/xntpd/scripts/monitoring/README deleted file mode 100644 index fa8ad8bb9585..000000000000 --- a/usr.sbin/xntpd/scripts/monitoring/README +++ /dev/null @@ -1,154 +0,0 @@ -This directory contains support for monitoring the local clock of xntp daemons. - -WARNING: The scripts and routines contained in this directory are bete realease! - Do not depend on their correct operation. They are, however, in regular - use at University of Erlangen-Nuernberg. No severe problems are known - for this code. - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -PLEASE THINK TWICE BEFORE STARTING MONITORING REMOTE XNTP DEAMONS !!!! -MONITORING MAY INCREASE THE LOAD OF THE DEAMON MONITORED AND MAY -INCREASE THE NETWORK LOAD SIGNIFICANTLY -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - -Files are: - -README: - This file - -ntptrap: - perl script to log ntp mode 6 trap messages. - - It sends a set_trap request to each server given and dumps the - trap messages received. It handles refresh of set_trap. - Currently it handles only NTP V2, however the NTP V3 servers - also accept v2 requests. It will not interpret v3 system and peer - stati correctly. - - usage: - ntptrap [-n] [-p <port>] [-l <debug-output>] servers... - - -n: do not send set_trap requests - - port: port to listen for responses - useful if you have a configured trap - - debug-output: file to write trace output to (for debugging) - - This script convinced me that ntp trap messages are only of - little use. - -ntploopstat: - perl script to gather loop info statistics from xntpd via mode 7 - LOOP_INFO requests. - - This script collects data to allow monitoring of remote xntp servers - where it is not possible to directly access the loopstats file - produced by xntpd itself. Of course, it can be used to sample - a local server if it is not configured to produce a loopstats file. - - Please note, this program poses a high load on the server as - a communication takes place every delay seconds ! USE WITH CARE ! - - usage: - ntploopstat [-d<delay>] [-t<timeout>] [-l <logfile>] [-v] [ntpserver] - - delay: number of seconds to wait between samples - default: 60 seconds - timeout: number of seconds to wait for reply - default 12 seconds - logfile: file to log samples to - default: loopstats:<ntpserver>: - (note the trailing colon) - This name actually is a prefix. - The file name is dynamically derived by appending - the name of the month the sample belongs to. - Thus all samples of a month end up in the same file. - - the format of the files generated is identical to the format used by - xntpd with the loopstats file: - MJD <seconds since midnight UTC> offset frequency compliance - - if a timeout occurs the next sample is tried after delay/2 seconds - - The script will terminate after MAX_FAIL (currently 60) consecutive errors. - Errors are counted for: - - error on send call - - error on select call - - error on recv call - - short packet received - - bad packet - - error on open for logfile - -ntploopwatch: - perl script to display loop filter statistics collected by ntploopstat - or dumped directly by xntpd. - - Gnuplot is used to produce a graphical representation of the sample - values, that have been preprocessed and analysed by this script. - - It can either be called to produce a printout of specific data set or - used to continously monitor the values. Monitoring is achieved by - periodically reprocessing the logfiles, which are updated regularly - either by a running ntploopstat process or by the running xntpd. - - usage: - to watch statistics permanently: - ntploopwatch [-v[<level>]] [-c <config-file>] [-d <working-dir>] - - to get a single print out specify also - -P<printer> [-s<samples>] - [-S <start-time>] [-E <end-time>] - [-O <MaxOffs>] [-o <MinOffs>] - - level: level of verbosity for debugging - config-file: file to read configurable settings from - On each iteration it is checked and reread - if it has been changed - default: loopwatch.config - working-dir: specify working directory for process, affects - interpretation of relative file names - - All other flags are only useful with printing plots, as otherwise - command line values would be replaced by settings from the config file. - - printer: specify printer to print plot - BSD print systems semantics apply; if printer is omitted - the name "ps" is used; plots are prepared using - PostScript, thus the printer should best accept - postscript input - - For the following see also the comments in loopwatch.config.SAMPLE - - samples: use last # samples from input data - start-time: ignore input samples before this date - end-time: ignore input samples after this date - if both start-time and end-time are specified - a given samples value is ignored - MaxOffs: - MinOffs: restrict value range - -loopwatch.config.SAMPLE: - sample config file for ntploopwatch - each configurable option is explained there - -lr.pl: - linear regression package used by ntploopwatch to compute - linear approximations for frequency and offset values - within display range - -timelocal.pl: - used during conversion of ISO_DATE_TIME values specified in loopwatch - config files to unix epoch values (seconds since 1970-01-01_00:00_00 UTC) - - A version of this file is distributed with perl-4.x, however, - it has a bug related to dates crossing 1970, causing endless loops.. - The version contained here has been fixed. - -ntp.pl: - perl support for ntp v2 mode 6 message handling - WARNING: This code is beta level - it triggers a memory leak; - as for now it is not quite clear, wether this is caused by a - bug in perl or by bad usage of perl within this script. - diff --git a/usr.sbin/xntpd/scripts/monitoring/loopwatch.config.SAMPLE b/usr.sbin/xntpd/scripts/monitoring/loopwatch.config.SAMPLE deleted file mode 100644 index 8cefea395db0..000000000000 --- a/usr.sbin/xntpd/scripts/monitoring/loopwatch.config.SAMPLE +++ /dev/null @@ -1,89 +0,0 @@ -# sample configuration and control file for ntploowatch -# -# delay: sampling interval in seconds -delay=60 -# samples: use only last # samples -samples=600 -# DO NOT USE srcprefix in shared config files -# srcprefix: name of file to read samples from -# current time suffix (month name) is appended -# defaults to "./var@$STATHOST/loopstats." -# The string "$STATHOST"is replaced by the name of the host -# being monitored -#srcprefix=./var@$STATHOST/loopstats. -# -# showoffs: yes/no control display of offset values -showoffs=yes -# -# showfreq: yes/no control display of frequency values -showfreq=yes -# -# showcmpl: yes/no control display of compliance values -showcmpl=no -# -# showoreg: yes/no control display of linear regression of offset values -showoreg=no -# -# showfreg: yes/no control display of linear regression of frequency values -showfreg=no -# -# timebase: dynamic/ISO_DATE_TIME point of zero for linear regression -# ISO_DATE_TIME: yyyy-mm-dd_hh:mm:ss.ms -# values are interpreted using local time zone -# parts omitted from front default to current date/time -# parts omitted from end default to lowest permitted values -# to get aa:bb being interpreted as minutes:seconds use aa:bb.0 -# for dynamic '00:00:00.0 of current day' is used -timebase=dynamic -# -# freqbase: dynamic/<baseval> -# if a number is given, subtract this from sampling values for display -# if dynamic is selected, freqbase is adjusted to fit into the range of -# offset values -freqbase=dynamic -# -# cmplscale: dynamic/<scaling> -# if a number is given, the sampling values are divided by this number -# if dynamic is selected, cmplscale is adjusted to fit into the range of -# offset values -cmplscale=dynamic -# -# DumbScale: 0/1 -# 0 enables dynamic adjust of value ranges for freqbase and cmplscale -# timescale is labeled with human readable times -# 1 only uses explicit scaling for numbers -# timescale is labeled with hours relative to timebase -DumbScale=0 -# -# StartTime: none/ISO_DATE_TIME -# ignore any samples before the specified date -StartTime=none -# -# EndTime: none/ISO_DATE_TIME -# ignore any samples after the specified date -# -# if both StartTime and EndTime are specified -# the value specified for samples is ignored -EndTime=none -# -# MaxOffs: none/<number> -# limit display (y-axis) to values not larger than <number> -MaxOffset=none -# -# MinOffs: none/<number> -# limit display (y-axis) to values not smaller than <number> -MinOffset=none - -# -# verbose: <number> -# specify level for debugging -# default is 0 for printing and 1 for monitoring -# level 1 will just print a timestamp for any display update -# (this is every delay seconds) -verbose=1 -# -# deltaT: <seconds> -# mark `holes' in the sample data grater than <seconds> -# by a break in the plot -# default: 512 seconds -deltaT=512 diff --git a/usr.sbin/xntpd/scripts/monitoring/lr.pl b/usr.sbin/xntpd/scripts/monitoring/lr.pl deleted file mode 100755 index 02c7550ec3ad..000000000000 --- a/usr.sbin/xntpd/scripts/monitoring/lr.pl +++ /dev/null @@ -1,145 +0,0 @@ -;# -;# lr.pl,v 3.1 1993/07/06 01:09:08 jbj Exp -;# -;# -;# Linear Regression Package for perl -;# to be 'required' from perl -;# -;# Copyright (c) 1992 -;# Frank Kardel, Rainer Pruy -;# Friedrich-Alexander Universitaet Erlangen-Nuernberg -;# -;# -;############################################################# - -## -## y = A + Bx -## -## B = (n * Sum(xy) - Sum(x) * Sum(y)) / (n * Sum(x^2) - Sum(x)^2) -## -## A = (Sum(y) - B * Sum(x)) / n -## - -## -## interface -## -*lr_init = *lr'lr_init; #';# &lr_init(tag); initialize data set for tag -*lr_sample = *lr'lr_sample; #';# &lr_sample(x,y,tag); enter sample -*lr_Y = *lr'lr_Y; #';# &lr_Y(x,tag); compute y for given x -*lr_X = *lr'lr_X; #';# &lr_X(y,tag); compute x for given y -*lr_r = *lr'lr_r; #';# &lr_r(tag); regression coeffizient -*lr_cov = *lr'lr_cov; #';# &lr_cov(tag); covariance -*lr_A = *lr'lr_A; #';# &lr_A(tag); -*lr_B = *lr'lr_B; #';# &lr_B(tag); -*lr_sigma = *lr'lr_sigma; #';# &lr_sigma(tag); standard deviation -*lr_mean = *lr'lr_mean; #';# &lr_mean(tag); -######################### - -package lr; - -sub tagify -{ - local($tag) = @_; - if (defined($tag)) - { - *lr_n = eval "*${tag}_n"; - *lr_sx = eval "*${tag}_sx"; - *lr_sx2 = eval "*${tag}_sx2"; - *lr_sxy = eval "*${tag}_sxy"; - *lr_sy = eval "*${tag}_sy"; - *lr_sy2 = eval "*${tag}_sy2"; - } -} - -sub lr_init -{ - &tagify($_[$[]) if defined($_[$[]); - - $lr_n = 0; - $lr_sx = 0.0; - $lr_sx2 = 0.0; - $lr_sxy = 0.0; - $lr_sy = 0.0; - $lr_sy2 = 0.0; -} - -sub lr_sample -{ - local($_x, $_y) = @_; - - &tagify($_[$[+2]) if defined($_[$[+2]); - - $lr_n++; - $lr_sx += $_x; - $lr_sy += $_y; - $lr_sxy += $_x * $_y; - $lr_sx2 += $_x**2; - $lr_sy2 += $_y**2; -} - -sub lr_B -{ - &tagify($_[$[]) if defined($_[$[]); - - return 1 unless ($lr_n * $lr_sx2 - $lr_sx**2); - return ($lr_n * $lr_sxy - $lr_sx * $lr_sy) / ($lr_n * $lr_sx2 - $lr_sx**2); -} - -sub lr_A -{ - &tagify($_[$[]) if defined($_[$[]); - - return ($lr_sy - &lr_B * $lr_sx) / $lr_n; -} - -sub lr_Y -{ - &tagify($_[$[]) if defined($_[$[]); - - return &lr_A + &lr_B * $_[$[]; -} - -sub lr_X -{ - &tagify($_[$[]) if defined($_[$[]); - - return ($_[$[] - &lr_A) / &lr_B; -} - -sub lr_r -{ - &tagify($_[$[]) if defined($_[$[]); - - local($s) = ($lr_n * $lr_sx2 - $lr_sx**2) * ($lr_n * $lr_sy2 - $lr_sy**2); - - return 1 unless $s; - - return ($lr_n * $lr_sxy - $lr_sx * $lr_sy) / sqrt($s); -} - -sub lr_cov -{ - &tagify($_[$[]) if defined($_[$[]); - - return ($lr_sxy - $lr_sx * $lr_sy / $lr_n) / ($lr_n - 1); -} - -sub lr_sigma -{ - &tagify($_[$[]) if defined($_[$[]); - - return 0 if $lr_n <= 1; - return sqrt(($lr_sy2 - ($lr_sy * $lr_sy) / $lr_n) / ($lr_n)); -} - -sub lr_mean -{ - &tagify($_[$[]) if defined($_[$[]); - - return 0 if $lr_n <= 0; - return $lr_sy / $lr_n; -} - -&lr_init(); - -1; diff --git a/usr.sbin/xntpd/scripts/monitoring/ntp.pl b/usr.sbin/xntpd/scripts/monitoring/ntp.pl deleted file mode 100755 index f3bfd2bfe0b9..000000000000 --- a/usr.sbin/xntpd/scripts/monitoring/ntp.pl +++ /dev/null @@ -1,477 +0,0 @@ -#!/local/bin/perl -;# -;# ntp.pl,v 3.1 1993/07/06 01:09:09 jbj Exp -;# -;# process loop filter statistics file and either -;# - show statistics periodically using gnuplot -;# - or print a single plot -;# -;# Copyright (c) 1992 -;# Rainer Pruy Friedrich-Alexander Universitaet Erlangen-Nuernberg -;# -;# -;############################################################# - -package ntp; - -$NTP_version = 2; -$ctrl_mode=6; - -$byte1 = (($NTP_version & 0x7)<< 3) & 0x34 | ($ctrl_mode & 0x7); -$MAX_DATA = 468; - -$sequence = 0; # initial sequence number incred before used -$pad=4; -$do_auth=0; # no possibility today -$keyid=0; -;#list if known keys (passwords) -%KEYS = ( 0, "\200\200\200\200\200\200\200\200", - ); - -;#----------------------------------------------------------------------------- -;# access routines for ntp control packet - ;# NTP control message format - ;# C LI|VN|MODE LI 2bit=00 VN 3bit=2(3) MODE 3bit=6 : $byte1 - ;# C R|E|M|Op R response E error M more Op opcode - ;# n sequence - ;# n status - ;# n associd - ;# n offset - ;# n count - ;# a+ data (+ padding) - ;# optional authentication data - ;# N key - ;# N2 checksum - -;# first bye of packet -sub pkt_LI { return ($_[$[] >> 6) & 0x3; } -sub pkt_VN { return ($_[$[] >> 3) & 0x7; } -sub pkt_MODE { return ($_[$[] ) & 0x7; } - -;# second byte of packet -sub pkt_R { return ($_[$[] & 0x80) == 0x80; } -sub pkt_E { return ($_[$[] & 0x40) == 0x40; } -sub pkt_M { return ($_[$[] & 0x20) == 0x20; } -sub pkt_OP { return $_[$[] & 0x1f; } - -;#----------------------------------------------------------------------------- - -sub setkey -{ - local($id,$key) = @_; - - $KEYS{$id} = $key if (defined($key)); - if (! defined($KEYS{$id})) - { - warn "Key $id not yet specified - key not changed\n"; - return undef; - } - return ($keyid,$keyid = $id)[$[]; -} - -;#----------------------------------------------------------------------------- -sub numerical { $a <=> $b; } - -;#----------------------------------------------------------------------------- - -sub send #' -{ - local($fh,$opcode, $associd, $data,$address) = @_; - $fh = caller(0)."'$fh"; - - local($junksize,$junk,$packet,$offset,$ret); - $offset = 0; - - $sequence++; - while(1) - { - $junksize = length($data); - $junksize = $MAX_DATA if $junksize > $MAX_DATA; - - ($junk,$data) = $data =~ /^(.{$junksize})(.*)$/; - $packet - = pack("C2n5a".(($junk eq "") ? 0 : &pad($junksize+12,$pad)-12), - $byte1, - ($opcode & 0x1f) | ($data ? 0x20 : 0), - $sequence, - 0, $associd, - $offset, $junksize, $junk); - if ($do_auth) - { - ;# not yet - } - $offset += $junksize; - - if (defined($address)) - { - $ret = send($fh, $packet, 0, $address); - } - else - { - $ret = send($fh, $packet, 0); - } - - if (! defined($ret)) - { - warn "send failed: $!\n"; - return undef; - } - elsif ($ret != length($packet)) - { - warn "send failed: sent only $ret from ".length($packet). "bytes\n"; - return undef; - } - return $sequence unless $data; - } -} - -;#----------------------------------------------------------------------------- -;# status interpretation -;# -sub getval -{ - local($val,*list) = @_; - - return $list{$val} if defined($list{$val}); - return sprintf("%s#%d",$list{"-"},$val) if defined($list{"-"}); - return "unknown-$val"; -} - -;#--------------------------------- -;# system status -;# -;# format: |LI|CS|SECnt|SECode| LI=2bit CS=6bit SECnt=4bit SECode=4bit -sub ssw_LI { return ($_[$[] >> 14) & 0x3; } -sub ssw_CS { return ($_[$[] >> 8) & 0x3f; } -sub ssw_SECnt { return ($_[$[] >> 4) & 0xf; } -sub ssw_SECode { return $_[$[] & 0xf; } - -%LI = ( 0, "leap_none", 1, "leap_add_sec", 2, "leap_del_sec", 3, "sync_alarm", "-", "leap"); -%ClockSource = (0, "sync_unspec", - 1, "sync_lf_clock", - 2, "sync_uhf_clock", - 3, "sync_hf_clock", - 4, "sync_local_proto", - 5, "sync_ntp", - 6, "sync_udp/time", - 7, "sync_wristwatch", - "-", "ClockSource", - ); - -%SystemEvent = (0, "event_unspec", - 1, "event_restart", - 2, "event_fault", - 3, "event_sync_chg", - 4, "event_sync/strat_chg", - 5, "event_clock_reset", - 6, "event_bad_date", - 7, "event_clock_excptn", - "-", "event", - ); -sub LI -{ - &getval(&ssw_LI($_[$[]),*LI); -} -sub ClockSource -{ - &getval(&ssw_CS($_[$[]),*ClockSource); -} - -sub SystemEvent -{ - &getval(&ssw_SECode($_[$[]),*SystemEvent); -} - -sub system_status -{ - return sprintf("%s, %s, %d event%s, %s", &LI($_[$[]), &ClockSource($_[$[]), - &ssw_SECnt($_[$[]), ((&ssw_SECnt($_[$[])==1) ? "" : "s"), - &SystemEvent($_[$[])); -} -;#--------------------------------- -;# peer status -;# -;# format: |PStat|PSel|PCnt|PCode| Pstat=6bit PSel=2bit PCnt=4bit PCode=4bit -sub psw_PStat_config { return ($_[$[] & 0x8000) == 0x8000; } -sub psw_PStat_authenable { return ($_[$[] & 0x4000) == 0x4000; } -sub psw_PStat_authentic { return ($_[$[] & 0x2000) == 0x2000; } -sub psw_PStat_reach { return ($_[$[] & 0x1000) == 0x1000; } -sub psw_PStat_sane { return ($_[$[] & 0x0800) == 0x0800; } -sub psw_PStat_dispok { return ($_[$[] & 0x0400) == 0x0400; } -sub psw_PStat { return ($_[$[] >> 10) & 0x3f; } -sub psw_PSel { return ($_[$[] >> 8) & 0x3; } -sub psw_PCnt { return ($_[$[] >> 4) & 0xf; } -sub psw_PCode { return $_[$[] & 0xf; } - -%PeerSelection = (0, "sel_reject", - 1, "sel_candidate", - 2, "sel_selcand", - 3, "sel_sys.peer", - "-", "PeerSel", - ); -%PeerEvent = (0, "event_unspec", - 1, "event_ip_err", - 2, "event_authen", - 3, "event_unreach", - 4, "event_reach", - 5, "event_clock_excptn", - 6, "event_stratum_chg", - "-", "event", - ); - -sub PeerSelection -{ - &getval(&psw_PSel($_[$[]),*PeerSelection); -} -sub PeerEvent -{ - &getval(&psw_PCode($_[$[]),*PeerEvent); -} - -sub peer_status -{ - local($x) = (""); - $x .= "config," if &psw_PStat_config($_[$[]); - $x .= "authenable," if &psw_PStat_authenable($_[$[]); - $x .= "authentic," if &psw_PStat_authentic($_[$[]); - $x .= "reach," if &psw_PStat_reach($_[$[]); - $x .= &psw_PStat_sane($_[$[]) ? "sane," : "insane,"; - $x .= "hi_disp," unless &psw_PStat_dispok($_[$[]); - - $x .= sprintf(" %s, %d event%s, %s", &PeerSelection($_[$[]), - &psw_PCnt($_[$[]), ((&psw_PCnt($_[$[]) == 1) ? "" : "s"), - &PeerEvent($_[$[])); - return $x; -} - -;#--------------------------------- -;# clock status -;# -;# format: |CStat|CEvnt| CStat=8bit CEvnt=8bit -sub csw_CStat { return ($_[$[] >> 8) & 0xff; } -sub csw_CEvnt { return $_[$[] & 0xff; } - -%ClockStatus = (0, "clk_nominal", - 1, "clk_timeout", - 2, "clk_badreply", - 3, "clk_fault", - 4, "clk_prop", - 5, "clk_baddate", - 6, "clk_badtime", - "-", "clk", - ); - -sub clock_status -{ - return sprintf("%s, last %s", - &getval(&csw_CStat($_[$[]),*ClockStatus), - &getval(&csw_CEvnt($_[$[]),*ClockStatus)); -} - -;#--------------------------------- -;# error status -;# -;# format: |Err|reserved| Err=8bit -;# -sub esw_Err { return ($_[$[] >> 8) & 0xff; } - -%ErrorStatus = (0, "err_unspec", - 1, "err_auth_fail", - 2, "err_invalid_fmt", - 3, "err_invalid_opcode", - 4, "err_unknown_assoc", - 5, "err_unknown_var", - 6, "err_invalid_value", - 7, "err_adm_prohibit", - ); - -sub error_status -{ - return sprintf("%s", &getval(&esw_Err($_[$[]),*ErrorStatus)); -} - -;#----------------------------------------------------------------------------- -;# -;# cntrl op name translation - -%CntrlOpName = (1, "read_status", - 2, "read_variables", - 3, "write_variables", - 4, "read_clock_variables", - 5, "write_clock_variables", - 6, "set_trap", - 7, "trap_response", - 31, "unset_trap", # !!! unofficial !!! - "-", "cntrlop", - ); - -sub cntrlop_name -{ - return &getval($_[$[],*CntrlOpName); -} - -;#----------------------------------------------------------------------------- - -$STAT_short_pkt = 0; -$STAT_pkt = 0; - -;# process a NTP control message (response) packet -;# returns a list ($ret,$data,$status,$associd,$op,$seq,$auth_keyid) -;# $ret: undef --> not yet complete -;# "" --> complete packet received -;# "ERROR" --> error during receive, bad packet, ... -;# else --> error packet - list may contain useful info - - -sub handle_packet -{ - local($pkt,$from) = @_; # parameters - local($len_pkt) = (length($pkt)); -;# local(*FRAGS,*lastseen); - local($li_vn_mode,$r_e_m_op,$seq,$status,$associd,$offset,$count,$data); - local($autch_keyid,$auth_cksum); - - $STAT_pkt++; - if ($len_pkt < 12) - { - $STAT_short_pkt++; - return ("ERROR","short packet received"); - } - - ;# now break packet apart - ($li_vn_mode,$r_e_m_op,$seq,$status,$associd,$offset,$count,$data) = - unpack("C2n5a".($len_pkt-12),$pkt); - $data=substr($data,$[,$count); - if ((($len_pkt - 12) - &pad($count,4)) >= 12) - { - ;# looks like an authenticator - ($auth_keyid,$auth_cksum) = - unpack("Na8",substr($pkt,$len_pkt-12+$[,12)); - $STAT_auth++; - ;# no checking of auth_cksum (yet ?) - } - - if (&pkt_VN($li_vn_mode) != $NTP_version) - { - $STAT_bad_version++; - return ("ERROR","version ".&pkt_VN($li_vn_mode)."packet ignored"); - } - - if (&pkt_MODE($li_vn_mode) != $ctrl_mode) - { - $STAT_bad_mode++; - return ("ERROR", "mode ".&pkt_MODE($li_vn_mode)." packet ignored"); - } - - ;# handle single fragment fast - if ($offset == 0 && &pkt_M($r_e_m_op) == 0) - { - $STAT_single_frag++; - if (&pkt_E($r_e_m_op)) - { - $STAT_err_pkt++; - return (&error_status($status), - $data,$status,$associd,&pkt_OP($r_e_m_op),$seq, - $auth_keyid); - } - else - { - return ("", - $data,$status,$associd,&pkt_OP($r_e_m_op),$seq, - $auth_keyid); - } - } - else - { - ;# fragment - set up local name space - $id = "$from$seq".&pkt_OP($r_e_m_op); - $ID{$id} = 1; - *FRAGS = "$id FRAGS"; - *lastseen = "$id lastseen"; - - $STAT_frag++; - - $lastseen = 1 if !&pkt_M($r_e_m_op); - if (!defined(%FRAGS)) - { - (&pkt_M($r_e_m_op) ? " more" : "")."\n"; - $FRAGS{$offset} = $data; - ;# save other info - @FRAGS = ($status,$associd,&pkt_OP($r_e_m_op),$seq,$auth_keyid,$r_e_m_op); - } - else - { - (&pkt_M($r_e_m_op) ? " more" : "")."\n"; - ;# add frag to previous - combine on the fly - if (defined($FRAGS{$offset})) - { - $STAT_dup_frag++; - return ("ERROR","duplicate fragment at $offset seq=$seq"); - } - - $FRAGS{$offset} = $data; - - undef($loff); - foreach $off (sort numerical keys(%FRAGS)) - { - next unless defined($FRAGS{$off}); - if (defined($loff) && - ($loff + length($FRAGS{$loff})) == $off) - { - $FRAGS{$loff} .= $FRAGS{$off}; - delete $FRAGS{$off}; - last; - } - $loff = $off; - } - - ;# return packet if all frags arrived - ;# at most two frags with possible padding ??? - if ($lastseen && defined($FRAGS{0}) && - scalar(@x=sort numerical keys(%FRAGS)) <= 2 && - (length($FRAGS{0}) + 8) > $x[$[+1]) - { - @x=((&pkt_E($r_e_m_op) ? &error_status($status) : ""), - $FRAGS{0},@FRAGS); - &pkt_E($r_e_m_op) ? $STAT_err_frag++ : $STAT_frag_all++; - undef(%FRAGS); - undef(@FRAGS); - undef($lastseen); - delete $ID{$id}; - &main'clear_timeout($id); - return @x; - } - else - { - &main'set_timeout($id,time+$timeout,"&ntp'handle_packet_timeout(\"".unpack("H*",$id)."\");"); #'"; - } - } - return (undef); - } -} - -sub handle_packet_timeout -{ - local($id) = @_; - local($r_e_m_op,*FRAGS,*lastseen,@x) = (@FRAGS[$[+5]); - - *FRAGS = "$id FRAGS"; - *lastseen = "$id lastseen"; - - @x=((&pkt_E($r_e_m_op) ? &error_status($status) : "TIMEOUT"), - $FRAGS{0},@FRAGS[$[ .. $[+4]); - $STAT_frag_timeout++; - undef(%FRAGS); - undef(@FRAGS); - undef($lastseen); - delete $ID{$id}; - return @x; -} - - -sub pad -{ - return $_[$[+1] * int(($_[$[] + $_[$[+1] - 1) / $_[$[+1]); -} - -1; diff --git a/usr.sbin/xntpd/scripts/monitoring/ntploopstat b/usr.sbin/xntpd/scripts/monitoring/ntploopstat deleted file mode 100755 index 75cdff227b27..000000000000 --- a/usr.sbin/xntpd/scripts/monitoring/ntploopstat +++ /dev/null @@ -1,457 +0,0 @@ -#!/local/bin/perl -w--*-perl-*- -;# -;# ntploopstat,v 3.1 1993/07/06 01:09:11 jbj Exp -;# -;# Poll NTP server using NTP mode 7 loopinfo request. -;# Log info and timestamp to file for processing by ntploopwatch. -;# -;# -;# Copyright (c) 1992 -;# Rainer Pruy Friedrich-Alexander Universitaet Erlangen-Nuernberg -;# -;################################################################# -;# -;# The format written to the logfile is the same as used by xntpd -;# for the loopstats file. -;# This script however allows to gather loop filter statistics from -;# remote servers where you do not have access to the loopstats logfile. -;# -;# Please note: Communication delays affect the accuracy of the -;# timestamps recorded. Effects from these delays will probably -;# not show up, as timestamps are recorded to the second only. -;# (Should have implemented &gettimeofday()..) -;# - -$0 =~ s!^.*/([^/]+)$!\1!; # beautify script name - -$ntpserver = 'localhost'; # default host to poll -$delay = 60; # default sampling rate - ;# keep it shorter than minpoll (=64) - ;# to get all values - -require "ctime.pl"; -;# handle bug in early ctime distributions -$ENV{'TZ'} = 'MET' unless defined($ENV{'TZ'}) || $] > 4.010; - -if (defined(@ctime'MoY)) -{ - *MonthName = *ctime'MoY; -} -else -{ - @MonthName = ('Jan','Feb','Mar','Apr','May','Jun', - 'Jul','Aug','Sep','Oct','Nov','Dec'); -} - -;# this routine can be redefined to point to syslog if necessary -sub msg -{ - return unless $verbose; - - print STDERR "$0: "; - printf STDERR @_; -} - -;############################################################# -;# -;# process command line -$usage = <<"E-O-S"; - -usage: - $0 [-d<delay>] [-t<timeout>] [-l <logfile>] [-v] [ntpserver] -E-O-S - -while($_ = shift) -{ - /^-v(\d*)$/ && ($verbose=($1 eq '') ? 1 : $1,1) && next; - /^-d(\d*)$/ && - do { - ($1 ne '') && ($delay = $1,1) && next; - @ARGV || die("$0: delay value missing after -d\n$usage"); - $delay = shift; - ($delay >= 0) || die("$0: bad delay value \"$delay\"\n$usage"); - next; - }; - /^-l$/ && - do { - @ARGV || die("$0: logfile missing after -l\n$usage"); - $logfile = shift; - next; - }; - /^-t(\d*(\.\d*)?)$/ && - do { - ($1 ne '') && ($timeout = $1,1) && next; - @ARGV || die("$0: timeout value missing after -t\n$usage\n"); - $timeout = shift; - ($timeout > 0) || - die("$0: bad timeout value \"$timeout\"\n$usage"); - next; - }; - - /^-/ && die("$0: unknown option \"$_\"\n$usage"); - - ;# any other argument is server to poll - $ntpserver = $_; - last; -} - -if (@ARGV) -{ - warn("unexpected arguments: ".join(" ",@ARGV).".\n"); - die("$0: too many servers specified\n$usage"); -} - -;# logfile defaults to include server name -;# The name of the current month is appended and -;# the file is opened and closed for each sample. -;# -$logfile = "loopstats:$ntpserver." unless defined($logfile); -$timeout = 12.0 unless defined($timeout); # wait $timeout seconds for reply - -$MAX_FAIL = 60; # give up after $MAX_FAIL failed polls - - -$MJD_1970 = 40587; - -if (eval 'require "syscall.ph";') -{ - if (defined(&SYS_gettimeofday)) - { - ;# assume standard - ;# gettimeofday(struct timeval *tp,struct timezone *tzp) - ;# syntax for gettimeofday syscall - ;# tzp = NULL -> undef - ;# tp = (long,long) - eval 'sub time { local($tz) = pack("LL",0,0); - (&msg("gettimeofday failed: $!\n"), - return (time)) - unless syscall(&SYS_gettimeofday,$tz,undef) == 0; - local($s,$us) = unpack("LL",$tz); - return $s + $us/1000000; }'; - local($t1,$t2,$t3); - $t1 = time; - eval '$t2 = &time;'; - $t3 = time; - die("$0: gettimeofday failed: $@.\n") if defined($@) && $@; - die("$0: gettimeofday inconsistency time=$t1,gettimeofday=$t2,time=$t2\n") - if (int($t1) != int($t2) && int($t3) != int($t2)); - &msg("Using gettimeofday for timestamps\n"); - } - else - { - warn("No gettimeofday syscall found - using time builtin for timestamps\n"); - eval 'sub time { return time; }'; - } -} -else -{ - warn("No syscall.ph file found - using time builtin for timestamps\n"); - eval 'sub time { return time; }'; -} - - -;#------------------+ -;# from ntp_request.h -;#------------------+ - -;# NTP mode 7 packet format: -;# Byte 1: ResponseBit MoreBit Version(3bit) Mode(3bit)==7 -;# Byte 2: AuthBit Sequence # - 0 - 127 see MoreBit -;# Byte 3: Implementation # -;# Byte 4: Request Code -;# -;# Short 1: Err(3bit) NumItems(12bit) -;# Short 2: MBZ(3bit)=0 DataItemSize(12bit) -;# 0 - 500 byte Data -;# if AuthBit is set: -;# Long: KeyId -;# 2xLong: AuthCode - -;# -$IMPL_XNTPD = 2; -$REQ_LOOP_INFO = 8; - - -;# request packet for REQ_LOOP_INFO: -;# B1: RB=0 MB=0 V=2 M=7 -;# B2: S# = 0 -;# B3: I# = IMPL_XNTPD -;# B4: RC = REQ_LOOP_INFO -;# S1: E=0 NI=0 -;# S2: MBZ=0 DIS=0 -;# data: 32 byte 0 padding -;# 8byte timestamp if encryption, 0 padding otherwise -$loopinfo_reqpkt = - pack("CCCC nn x32 x8", 0x17, 0, $IMPL_XNTPD, $REQ_LOOP_INFO, 0, 0); - -;# ignore any auth data in packets -$loopinfo_response_size = - 1+1+1+1+2+2 # header size like request pkt - + 8 # l_fp last_offset - + 8 # l_fp drift_comp - + 4 # u_long compliance - + 4 # u_long watchdog_timer - ; -$loopinfo_response_fmt = "C4n2N2N2NN"; -$loopinfo_response_fmt_v2 = "C4n2N2N2N2N"; - -;# -;# prepare connection to server -;# - -;# workaround for broken socket.ph on dynix_ptx -eval 'sub INTEL {1;}' unless defined(&INTEL); -eval 'sub ATT {1;}' unless defined(&ATT); - -require "sys/socket.ph"; - -require 'netinet/in.ph'; - -;# if you do not have netinet/in.ph enable the following lines -;#eval 'sub INADDR_ANY { 0x00000000; }' unless defined(&INADDR_ANY); -;#eval 'sub IPPRORO_UDP { 17; }' unless defined(&IPPROTO_UDP); - -if ($ntpserver =~ /^((0x?)?\w+)\.((0x?)?\w+)\.((0x?)?\w+)\.((0x?)?\w+)$/) -{ - local($a,$b,$c,$d) = ($1,$3,$5,$7); - $a = oct($a) if defined($2); - $b = oct($b) if defined($4); - $c = oct($c) if defined($6); - $d = oct($d) if defined($8); - $server_addr = pack("C4", $a,$b,$c,$d); - - $server_mainname - = (gethostbyaddr($server_addr,&AF_INET))[$[] || $ntpserver; -} -else -{ - ($server_mainname,$server_addr) - = (gethostbyname($ntpserver))[$[,$[+4]; - - die("$0: host \"$ntpserver\" is unknown\n") - unless defined($server_addr); -} -&msg ("Address of server \"$ntpserver\" is \"%d.%d.%d.%d\"\n", - unpack("C4",$server_addr)); - -$proto_udp = (getprotobyname('udp'))[$[+2] || &IPPROTO_UDP; - -$ntp_port = - (getservbyname('ntp','udp'))[$[+2] || - (warn "Could not get port number for service \"ntp/udp\" using 123\n"), - ($ntp_port=123); - -;# -0 && &SOCK_DGRAM; # satisfy perl -w ... -socket(S, &AF_INET, &SOCK_DGRAM, $proto_udp) || - die("Cannot open socket: $!\n"); - -bind(S, pack("S n N x8", &AF_INET, 0, &INADDR_ANY)) || - die("Cannot bind: $!\n"); - -($my_port, $my_addr) = (unpack("S n a4 x8",getsockname(S)))[$[+1,$[+2]; - -&msg("Listening at address %d.%d.%d.%d port %d\n", - unpack("C4",$my_addr), $my_port); - -$server_inaddr = pack("Sna4x8", &AF_INET, $ntp_port, $server_addr); - -;############################################################ -;# -;# the main loop: -;# send request -;# get reply -;# wait til next sample time - -undef($lasttime); -$lostpacket = 0; - -while(1) -{ - $stime = &time; - - &msg("Sending request $stime...\n"); - - $ret = send(S,$loopinfo_reqpkt,0,$server_inaddr); - - if (! defined($ret) || $ret < length($loopinfo_reqpkt)) - { - warn("$0: send failed ret=($ret): $!\n"); - $fail++; - next; - } - - &msg("Waiting for reply...\n"); - - $mask = ""; vec($mask,fileno(S),1) = 1; - $ret = select($mask,undef,undef,$timeout); - - if (! defined($ret)) - { - warn("$0: select failed: $!\n"); - $fail++; - next; - } - elsif ($ret == 0) - { - warn("$0: request to $ntpserver timed out ($timeout seconds)\n"); - ;# do not count this event as failure - ;# it usually this happens due to dropped udp packets on noisy and - ;# havily loaded lines, so just try again; - $lostpacket = 1; - next; - } - - &msg("Receiving reply...\n"); - - $len = 520; # max size of a mode 7 packet - $reply = ""; # just make it defined for -w - $ret = recv(S,$reply,$len,0); - - if (!defined($ret)) - { - warn("$0: recv failed: $!\n"); - $fail++; - next; - } - - $etime = &time; - &msg("Received at\t$etime\n"); - - ;#$time = ($stime + $etime) / 2; # symmetric delay assumed - $time = $etime; # the above assumption breaks for X25 - ;# so taking etime makes timestamps be a - ;# little late, but keeps them increasing - ;# monotonously - - &msg(sprintf("Reply from %d.%d.%d.%d took %f seconds\n", - (unpack("SnC4",$ret))[$[+2 .. $[+5], ($etime - $stime))); - - if ($len < $loopinfo_response_size) - { - warn("$0: short packet ($len bytes) received ($loopinfo_response_size bytes expected\n"); - $fail++; - next; - } - - ($b1,$b2,$b3,$b4,$s1,$s2, - $offset_i,$offset_f,$drift_i,$drift_f,$compl,$watchdog) - = unpack($loopinfo_response_fmt,$reply); - - ;# check reply - if (($s1 >> 12) != 0) # error ! - { - die("$0: got error reply ".($s1>>12)."\n"); - } - if (($b1 != 0x97 && $b1 != 0x9f) || # Reply NotMore V=2 M=7 - ($b2 != 0 && $b2 != 0x80) || # S=0 Auth no/yes - $b3 != $IMPL_XNTPD || # ! IMPL_XNTPD - $b4 != $REQ_LOOP_INFO || # Ehh.. not loopinfo reply ? - $s1 != 1 || # ???? - ($s2 != 24 && $s2 != 28) # - ) - { - warn("$0: Bad/unexpected reply from server:\n"); - warn(" \"".unpack("H*",$reply)."\"\n"); - warn(" ".sprintf("b1=%x b2=%x b3=%x b4=%x s1=%d s2=%d\n", - $b1,$b2,$b3,$b4,$s1,$s2)); - $fail++; - next; - } - elsif ($s2 == 28) - { - ;# seems to be a version 2 xntpd - ($b1,$b2,$b3,$b4,$s1,$s2, - $offset_i,$offset_f,$drift_i,$drift_f,$compl_i,$compl_f,$watchdog) - = unpack($loopinfo_response_fmt_v2,$reply); - $compl = &lfptoa($compl_i, $compl_f); - } - - $time -= $watchdog; - - $offset = &lfptoa($offset_i, $offset_f); - $drift = &lfptoa($drift_i, $drift_f); - - &log($time,$offset,$drift,$compl) && ($fail = 0);; -} -continue -{ - die("$0: Too many failures - terminating\n") if $fail > $MAX_FAIL; - &msg("Sleeping " . ($lostpacket ? ($delay / 2) : $delay) . " seconds...\n"); - - sleep($lostpacket ? ($delay / 2) : $delay); - $lostpacket = 0; -} - -sub log -{ - local($time,$offs,$freq,$cmpl) = @_; - local($y,$m,$d); - local($fname,$suff) = ($logfile); - - - ;# silently drop sample if distance to last sample is too low - if (defined($lasttime) && ($lasttime + 2) >= $time) - { - &msg("Dropped packet - old sample\n"); - return 1; - } - - ;# $suff determines which samples end up in the same file - ;# could have used $year (;-) or WeekOfYear, DayOfYear,.... - ;# Change it to your suit... - - ($d,$m,$y) = (localtime($time))[$[+3 .. $[+5]; - $suff = sprintf("%04d%02d%02d",$y+1900,$m+1,$d); - $fname .= $suff; - if (!open(LOG,">>$fname")) - { - warn("$0: open($fname) failed: $!\n"); - $fail++; - return 0; - } - else - { - ;# file format - ;# MJD seconds offset drift compliance - printf LOG ("%d %.3lf %.8lf %.7lf %d\n", - int($time/86400)+$MJD_1970, - $time - int($time/86400) * 86400, - $offs,$freq,$cmpl); - close(LOG); - $lasttime = $time; - } - return 1; -} - -;# see ntp_fp.h to understand this -sub lfptoa -{ - local($i,$f) = @_; - local($sign) = 1; - - - if ($i & 0x80000000) - { - if ($f == 0) - { - $i = -$i; - } - else - { - $f = -$f; - $i = ~$i; - $i += 1; # 2s complement - } - $sign = -1; - ;#print "NEG: $i $f\n"; - } - else - { - ;#print "POS: $i $f\n"; - } - ;# unlike xntpd I have perl do the dirty work. - ;# Using floats here may affect precision, but - ;# currently these bits aren't significant anyway - return $sign * ($i + $f/2**32); -} diff --git a/usr.sbin/xntpd/scripts/monitoring/ntploopwatch b/usr.sbin/xntpd/scripts/monitoring/ntploopwatch deleted file mode 100755 index 655ed7188cea..000000000000 --- a/usr.sbin/xntpd/scripts/monitoring/ntploopwatch +++ /dev/null @@ -1,1631 +0,0 @@ -#!/local/bin/perl -w--*-perl-*- -;# -;# ntploopwatch,v 3.1 1993/07/06 01:09:13 jbj Exp -;# -;# process loop filter statistics file and either -;# - show statistics periodically using gnuplot -;# - or print a single plot -;# -;# Copyright (c) 1992 -;# Rainer Pruy Friedrich-Alexander Universitaet Erlangen-Nuernberg -;# -;# -;############################################################# -$0 =~ s!^.*/([^/]+)$!\1!; -$F = ' ' x length($0); -$|=1; - -$ENV{'SHELL'} = '/bin/sh'; # use bourne shell - -undef($config); -undef($workdir); -undef($PrintIt); -undef($samples); -undef($StartTime); -undef($EndTime); -($a,$b) if 0; # keep -w happy -$usage = <<"E-O-P"; -usage: - to watch statistics permanently: - $0 [-v[<level>]] [-c <config-file>] [-d <working-dir>] - $F [-h <hostname>] - - to get a single print out specify also - $F -P[<printer>] [-s<samples>] - $F [-S <start-time>] [-E <end-time>] - $F [-Y <MaxOffs>] [-y <MinOffs>] - -If You like long option names, You can use: - -help - -c +config - -d +directory - -h +host - -v +verbose[=<level>] - -P +printer[=<printer>] - -s +samples[=<samples>] - -S +starttime - -E +endtime - -Y +maxy - -y +miny - -If <printer> contains a '/' (slash character) output is directed to -a file of this name instead of delivered to a printer. -E-O-P - -;# add directory to look for lr.pl and timelocal.pl (in front of current list) -unshift(@INC,"/src/NTP/v3/xntp/monitoring"); - -require "lr.pl"; # linear regresion routines - -$MJD_1970 = 40587; # from ntp.h (V3) -$RecordSize = 48; # usually a line fits into 42 bytes -$MinClip = 0.12; # clip Y scales with greater range than this - -;# largest extension of Y scale from mean value, factor for standart deviation -$FuzzLow = 2; # for side closer to zero -$FuzzBig = 1; # for side farther from zero - -require "ctime.pl"; -require "timelocal.pl"; -;# early distributions of ctime.pl had a bug -$ENV{'TZ'} = 'MET' unless defined $ENV{'TZ'} || $[ > 4.010; -if (defined(@ctime'MoY)) -{ - *Month=*ctime'MoY; - *Day=*ctime'DoW; -} -else -{ - @Month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); - @Day = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); -} -;# max number of days per month -@MaxNumDaysPerMonth = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); - -;# config settable parameters -$delay = 60; -$srcprefix = "./var\@\$STATHOST/loopstats."; -$showoffs = 1; -$showfreq = 1; -$showcmpl = 0; -$showoreg = 0; -$showfreg = 0; -undef($timebase); -undef($freqbase); -undef($cmplscale); -undef($MaxY); -undef($MinY); -$deltaT = 512; # indicate sample data gaps greater than $deltaT seconds -$verbose = 1; - -while($_ = shift(@ARGV)) -{ - (/^[+-]help$/) && die($usage); - - (/^-c$/ || /^\+config$/) && - (@ARGV || die($usage), $config = shift(@ARGV), next); - - (/^-d$/ || /^\+directory$/) && - (@ARGV || die($usage), $workdir = shift(@ARGV), next); - - (/^-h$/ || /^\+host$/) && - (@ARGV || die($usage), $STATHOST = shift, next); - - (/^-v(\d*)$/ || /^\+verbose=?(\d*)$/) && - ($verbose=($1 eq "") ? 1 : $1, next); - - (/^-P(\S*)$/ || /^\+[Pp]rinter=?(\S*)$/) && - ($PrintIt = $1, $verbose==1 && ($verbose = 0), next); - - (/^-s(\d*)$/ || /^\+samples=?(\d*)$/) && - (($samples = ($1 eq "") ? (shift || die($usage)): $1), next); - - (/^-S$/ || /^\+[Ss]tart[Tt]ime$/) && - (@ARGV || die($usage), $StartTime=&date_time_spec2seconds(shift),next); - - (/^-E$/ || /^\+[Ee]nd[Tt]ime$/) && - (@ARGV || die($usage), $EndTime = &date_time_spec2seconds(shift),next); - - (/^-Y$/ || /^\+[Mm]ax[Yy]$/) && - (@ARGV || die($usage), $MaxY = shift, next); - - (/^-y$/ || /^\+[Mm]in[Yy]$/) && - (@ARGV || die($usage), $MinY = shift, next); - - die("$0: unexpected argument \"$_\"\n$usage"); -} - -if (defined($workdir)) -{ - chdir($workdir) || - die("$0: failed to change working dir to \"$workdir\": $!\n"); -} - -$PrintIt = "ps" if defined($PrintIt) && $PrintIt eq ""; - -if (!defined($PrintIt)) -{ - defined($samples) && - print "WARNING: your samples value may be shadowed by config file settings\n"; - defined($StartTime) && - print "WARNING: your StartTime value may be shadowed by config file settings\n"; - defined($EndTime) && - print "WARNING: your EndTime value may be shadowed by config file settings\n"; - defined($MaxY) && - print "WARNING: your MaxY value may be shadowed by config file settings\n"; - defined($MinY) && - print "WARNING: your MinY value may be shadowed by config file settings\n"; - - ;# check operating environment - ;# - ;# gnuplot usually has X support - ;# I vaguely remember there was one with sunview support - ;# - ;# If Your plotcmd can display graphics using some other method - ;# (Tek window,..) fix the following test - ;# (or may be, just disable it) - ;# - !(defined($ENV{'DISPLAY'}) || defined($ENV{'WINDOW_PARENT'})) && - die("Need window system to monitor statistics\n"); -} - -;# configuration file -$config = "loopwatch.config" unless defined($config); -($STATHOST = $config) =~ s!.*loopwatch\.config.([^/\.]*)$!\1! - unless defined($STATHOST); -($STATTAG = $STATHOST) =~ s/^([^\.\*\s]+)\..*$/\1/; - -$srcprefix =~ s/\$STATHOST/$STATHOST/g; - -;# plot command -@plotcmd=("gnuplot", - '-title', "Ntp loop filter statistics $STATHOST", - '-name', "NtpLoopWatch_$STATTAG"); -$tmpfile = "/tmp/ntpstat.$$"; - -;# other variables -$doplot = ""; # assembled command for @plotcmd to display plot -undef($laststat); - -;# plot value ranges -undef($mintime); -undef($maxtime); -undef($minoffs); -undef($maxoffs); -undef($minfreq); -undef($maxfreq); -undef($mincmpl); -undef($maxcmpl); -undef($miny); -undef($maxy); - -;# stop operation if plot command dies -sub sigchld -{ - local($pid) = wait; - unlink($tmpfile); - warn(sprintf("%s: %s died: exit status: %d signal %d\n", - $0, - (defined($Plotpid) && $Plotpid == $pid) - ? "plotcmd" : "unknown child $pid", - $?>>8,$? & 0xff)) if $?; - exit(1) if $? && defined($Plotpid) && $pid == $Plotpid; -} -&sigchld if 0; -$SIG{'CHLD'} = "sigchld"; -$SIG{'CLD'} = "sigchld"; - -sub abort -{ - unlink($tmpfile); - defined($Plotpid) && kill('TERM',$Plotpid); - die("$0: received signal SIG$_[$[] - exiting\n"); -} -&abort if 0; # make -w happy - &abort IS used -$SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = $SIG{'PIPE'} = "abort"; - -;# -sub abs -{ - ($_[$[] < 0) ? -($_[$[]) : $_[$[]; -} - -;##################### -;# start of real work - -print "starting plot command (" . join(" ",@plotcmd) . ")\n" if $verbose > 1; - -$Plotpid = open(PLOT,"|-"); -select((select(PLOT),$|=1)[$[]); # make PLOT line bufferd - -defined($Plotpid) || - die("$0: failed to start plot command: $!\n"); - -unless ($Plotpid) -{ - ;# child == plot command - close(STDOUT); - open(STDOUT,">&STDERR") || - die("$0: failed to redirect STDOUT of plot command: $!\n"); - - print STDOUT "plot command running as $$\n"; - - exec @plotcmd; - die("$0: failed to exec (@plotcmd): $!\n"); - exit(1); # in case ... -} - -sub read_config -{ - local($at) = (stat($config))[$[+9]; - local($_,$c,$v); - - (undef($laststat),(print("stat $config failed: $!\n")),return) if ! defined($at); - return if (defined($laststat) && ($laststat == $at)); - $laststat = $at; - - print "reading configuration from \"$config\"\n" if $verbose; - - open(CF,"<$config") || - (warn("$0: failed to read \"$config\" - using old settings ($!)\n"), - return); - while(<CF>) - { - chop; - s/^([^\#]*[^\#\s]?)\s*\#.*$//; - next if /^\s*$/; - - s/^\s*([^=\s]*)\s*=\s*(.*\S)\s*$/\1=\2/; - - ($c,$v) = split(/=/,$_,2); - print "processing \"$c=$v\"\n" if $verbose > 3; - ($c eq "delay") && ($delay = $v,1) && next; - ($c eq 'samples') && (!defined($PrintIt) || !defined($samples)) && - ($samples = $v,1) && next; - ($c eq 'srcprefix') && (($srcprefix=$v)=~s/\$STATHOST/$STATHOST/g,1) - && next; - ($c eq 'showoffs') && - ($showoffs = ($v eq 'yes' || $v eq 'y' || $v != 0),1) && next; - ($c eq 'showfreq') && - ($showfreq = ($v eq 'yes' || $v eq 'y' || $v != 0),1) && next; - ($c eq 'showcmpl') && - ($showcmpl = ($v eq 'yes' || $v eq 'y' || $v != 0),1) && next; - ($c eq 'showoreg') && - ($showoreg = ($v eq 'yes' || $v eq 'y' || $v != 0),1) && next; - ($c eq 'showfreg') && - ($showfreg = ($v eq 'yes' || $v eq 'y' || $v != 0),1) && next; - - ($c eq 'exit') && (unlink($tmpfile),die("$0: exit by config request\n")); - - ($c eq 'freqbase' || - $c eq 'cmplscale') && - do { - if (! defined($v) || $v eq "" || $v eq 'dynamic') - { - eval "undef(\$$c);"; - } - else - { - eval "\$$c = \$v;"; - } - next; - }; - ($c eq 'timebase') && - do { - if (! defined($v) || $v eq "" || $v eq "dynamic") - { - undef($timebase); - } - else - { - $timebase=&date_time_spec2seconds($v); - } - }; - ($c eq 'EndTime') && - do { - next if defined($EndTime) && defined($PrintIt); - if (! defined($v) || $v eq "" || $v eq "none") - { - undef($EndTime); - } - else - { - $EndTime=&date_time_spec2seconds($v); - } - }; - ($c eq 'StartTime') && - do { - next if defined($StartTime) && defined($PrintIt); - if (! defined($v) || $v eq "" || $v eq "none") - { - undef($StartTime); - } - else - { - $StartTime=&date_time_spec2seconds($v); - } - }; - - ($c eq 'MaxY') && - do { - next if defined($MaxY) && defined($PrintIt); - if (! defined($v) || $v eq "" || $v eq "none") - { - undef($MaxY); - } - else - { - $MaxY=$v; - } - }; - - ($c eq 'MinY') && - do { - next if defined($MinY) && defined($PrintIt); - if (! defined($v) || $v eq "" || $v eq "none") - { - undef($MinY); - } - else - { - $MinY=$v; - } - }; - - ($c eq 'deltaT') && - do { - if (!defined($v) || $v eq "") - { - undef($deltaT); - } - else - { - $deltaT = $v; - } - next; - }; - ($c eq 'verbose') && ! defined($PrintIt) && - do { - if (!defined($v) || $v == 0) - { - $verbose = 0; - } - else - { - $verbose = $v; - } - next; - }; - ;# otherwise: silently ignore unrecognized config line - } - close(CF); - ;# set show defaults when nothing selected - $showoffs = $showfreq = $showcmpl = 1 - unless $showoffs || $showfreq || $showcmpl; - if ($verbose > 3) - { - print "new configuration:\n"; - print " delay\t= $delay\n"; - print " samples\t= $samples\n"; - print " srcprefix\t= $srcprefix\n"; - print " showoffs\t= $showoffs\n"; - print " showfreq\t= $showfreq\n"; - print " showcmpl\t= $showcmpl\n"; - print " showoreg\t= $showoreg\n"; - print " showfreg\t= $showfreg\n"; - printf " timebase\t= %s",defined($timebase)?&ctime($timebase):"dynamic\n"; - printf " freqbase\t= %s\n",defined($freqbase) ?"$freqbase":"dynamic"; - printf " cmplscale\t= %s\n",defined($cmplscale)?"$cmplscale":"dynamic"; - printf " StartTime\t= %s",defined($StartTime)?&ctime($StartTime):"none\n"; - printf " EndTime\t= %s", defined($EndTime) ? &ctime($EndTime):"none\n"; - printf " MaxY\t= %s",defined($MaxY)? $MaxY :"none\n"; - printf " MinY\t= %s",defined($MinY)? $MinY :"none\n"; - print " verbose\t= $verbose\n"; - } -print "configuration file read\n" if $verbose > 2; -} - -sub make_doplot -{ - local($c) = (""); - local($fmt) - = ("%s \"%s\" using 1:%d title '%s <%lf %lf> %6s' with lines"); - local($regfmt) - = ("%s ((%lf * x) + %lf) title 'lin. approx. %s (%f t[h]) %s %f <%f> %6s' with lines"); - - $doplot = " set title 'NTP loopfilter statistics for $STATHOST " . - "(last $LastCnt samples from $srcprefix*)'\n"; - - local($xts,$xte,$i,$t); - - local($s,$c) = (""); - - ;# number of integral seconds to get at least 12 tic marks on x axis - $t = int(($maxtime - $mintime) / 12 + 0.5); - $t = 1 unless $t; # prevent $t to be zero - foreach $i (30, - 60,5*60,15*60,30*60, - 60*60,2*60*60,6*60*60,12*60*60, - 24*60*60,48*60*60) - { - last if $t < $i; - $t = $t - ($t % $i); - } - print "time label resolution: $t seconds\n" if $verbose > 1; - - ;# make gnuplot use wall clock time labels instead of NTP seconds - for ($c="", $i = $mintime - ($mintime % $t); - $i <= $maxtime + $t; - $i += $t, $c=",") - { - $s .= $c; - ((int($i / $t) % 2) && - ($s .= sprintf("'' %lf",($i - $LastTimeBase)/3600))) || - (($t <= 60) && - ($s .= sprintf("'%d:%02d:%02d' %lf", - (localtime($i))[$[+2,$[+1,$[+0], - ($i - $LastTimeBase)/3600))) - || (($t <= 2*60*60) && - ($s .= sprintf("'%d:%02d' %lf", - (localtime($i))[$[+2,$[+1], - ($i - $LastTimeBase)/3600))) - || (($t <= 12*60*60) && - ($s .= sprintf("'%s %d:00' %lf", - $Day[(localtime($i))[$[+6]], - (localtime($i))[$[+2], - ($i - $LastTimeBase)/3600))) - || ($s .= sprintf("'%d.%d-%d:00' %lf", - (localtime($i))[$[+3,$[+4,$[+2], - ($i - $LastTimeBase)/3600)); - } - $doplot .= "set xtics ($s)\n"; - - chop($xts = &ctime($mintime)); - chop($xte = &ctime($maxtime)); - $doplot .= "set xlabel 'Start: $xts -- Time Scale -- End: $xte'\n"; - $doplot .= "set yrange [" ; - $doplot .= defined($MinY) ? sprintf("%lf", $MinY) : $miny; - $doplot .= ':'; - $doplot .= defined($MaxY) ? sprintf("%lf", $MaxY) : $maxy; - $doplot .= "]\n"; - - $doplot .= " plot"; - $c = ""; - $showoffs && - ($doplot .= sprintf($fmt,$c,$tmpfile,2, - "offset", - $minoffs,$maxoffs, - "[ms]"), - $c = ","); - $showcmpl && - ($doplot .= sprintf($fmt,$c,$tmpfile,4, - "compliance" . - (&abs($LastCmplScale) > 1 - ? " / $LastCmplScale" - : (&abs($LastCmplScale) == 1 ? "" : " * ".(1/$LastCmplScale))), - $mincmpl/$LastCmplScale,$maxcmpl/$LastCmplScale, - ""), - $c = ","); - $showfreq && - ($doplot .= sprintf($fmt,$c,$tmpfile,3, - "frequency" . - ($LastFreqBase > 0 - ? " - $LastFreqBaseString" - : ($LastFreqBase == 0 ? "" : " + $LastFreqBaseString")), - $minfreq * $FreqScale - $LastFreqBase, - $maxfreq * $FreqScale - $LastFreqBase, - "[${FreqScaleInv}ppm]"), - $c = ","); - $showoreg && $showoffs && - ($doplot .= sprintf($regfmt, $c, - &lr_B('offs'),&lr_A('offs'), - "offset ", - &lr_B('offs'), - ((&lr_A('offs')) < 0 ? '-' : '+'), - &abs(&lr_A('offs')), &lr_r('offs'), - "[ms]"), - $c = ","); - $showfreg && $showfreq && - ($doplot .= sprintf($regfmt, $c, - &lr_B('freq') * $FreqScale, - (&lr_A('freq') + $minfreq) * $FreqScale - $LastFreqBase, - "frequency", - &lr_B('freq') * $FreqScale, - ((&lr_A('freq') + $minfreq) * $FreqScale - $LastFreqBase) < 0 ? '-' : '+', - &abs((&lr_A('freq') + $minfreq) * $FreqScale - $LastFreqBase), - &lr_r('freq'), - "[${FreqScaleInv}ppm]"), - $c = ","); - $doplot .= "\n"; -} - -%F_key = (); -%F_name = (); -%F_size = (); -%F_mtime = (); -%F_first = (); -%F_last = (); - -sub genfile -{ - local($cnt,$in,$out,@fpos) = @_; - - local(@F,@t,$t,$lastT) = (); - local(@break,@time,@offs,@freq,@cmpl,@loffset,@filekey) = (); - local($lm,$l,@f); - - local($sdir,$sname); - - ;# allocate some storage for the tables - ;# otherwise realloc may get into troubles - if (defined($StartTime) && defined($EndTime)) - { - $l = ($EndTime-$StartTime) -$[+1 +1; # worst case: 1 sample per second - } - else - { - $l = $cnt + 10; - } - print "preextending arrays to $l entries\n" if $verbose > 2; - $#break = $l; for ($i=$[; $i<=$l;$i++) { $break[$i] = 0; } - $#time = $l; for ($i=$[; $i<=$l;$i++) { $time[$i] = 0; } - $#offs = $l; for ($i=$[; $i<=$l;$i++) { $offs[$i] = 0; } - $#freq = $l; for ($i=$[; $i<=$l;$i++) { $freq[$i] = 0; } - $#cmpl = $l; for ($i=$[; $i<=$l;$i++) { $cmpl[$i] = 0; } - $#loffset = $l; for ($i=$[; $i<=$l;$i++) { $loffset[$i] = 0; } - $#filekey = $l; for ($i=$[; $i<=$l;$i++) { $filekey[$i] = 0; } - ;# now reduce size again - $#break = $[ - 1; - $#time = $[ - 1; - $#offs = $[ - 1; - $#freq = $[ - 1; - $#cmpl = $[ - 1; - $#loffset = $[ - 1; - $#filekey = $[ - 1; - print "memory allocation ready\n" if $verbose > 2; - sleep(3) if $verbose > 1; - - if (index($in,"/") < $[) - { - $sdir = "."; - $sname = $in; - } - else - { - ($sdir,$sname) = ($in =~ m!^(.*)/([^/]*)!); - $sname = "" unless defined($sname); - } - - if (!defined($Lsdir) || $Lsdir ne $sdir || $Ltime != (stat($sdir))[$[+9] || - grep($F_mtime{$_} != (stat($F_name{$_}))[$[+9], @F_files)) - - { - print "rescanning directory \"$sdir\" for files \"$sname*\"\n" - if $verbose > 1; - - ;# rescan directory on changes - $Lsdir = $sdir; - $Ltime = (stat($sdir))[$[+9]; - </X{> if 0; # dummy line - calm down my formatter - local(@newfiles) = < ${in}*[0-9] >; - local($st_dev,$st_ino,$st_mtime,$st_size,$name,$key,$modified); - - foreach $name (@newfiles) - { - ($st_dev,$st_ino,$st_size,$st_mtime) = - (stat($name))[$[,$[+1,$[+7,$[+9]; - $modified = 0; - $key = sprintf("%lx|%lu", $st_dev, $st_ino); - - print "candidate file \"$name\"", - (defined($st_dev) ? "" : " failed: $!"),"\n" - if $verbose > 2; - - if (! defined($F_key{$name}) || $F_key{$name} ne $key) - { - $F_key{$name} = $key; - $modified++; - } - if (!defined($F_name{$key}) || $F_name{$key} != $name) - { - $F_name{$key} = $name; - $modified++; - } - if (!defined($F_size{$key}) || $F_size{$key} != $st_size) - { - $F_size{$key} = $st_size; - $modified++; - } - if (!defined($F_mtime{$key}) || $F_mtime{$key} != $st_mtime) - { - $F_mtime{$key} = $st_mtime; - $modified++; - } - if ($modified) - { - print "new data \"$name\" key: $key;\n" if $verbose > 1; - print " size: $st_size; mtime: $st_mtime;\n" - if $verbose > 1; - $F_last{$key} = $F_first{$key} = $st_mtime; - $F_first{$key}--; # prevent zero divide later on - ;# now compute derivated attributes - open(IN, "<$name") || - do { - warn "$0: failed to open \"$name\": $!"; - next; - }; - - while(<IN>) - { - @F = split; - next if @F < 5; - next if $F[$[] eq ""; - $t = ($F[$[] - $MJD_1970) * 24 * 60 * 60; - $t += $F[$[+1]; - $F_first{$key} = $t; - print "\tfound first entry: $t ",&ctime($t) - if $verbose > 4; - last; - } - seek(IN, - ($st_size > 4*$RecordSize) ? $st_size - 4*$RecordSize : 0, - 0); - while(<IN>) - { - @F = split; - next if @F < 5; - next if $F[$[] eq ""; - $t = ($F[$[] - $MJD_1970) * 24 * 60 * 60; - $t += $F[$[+1]; - $F_last{$key} = $t; - $_ = <IN>; - print "\tfound last entry: $t ", &ctime($t) - if $verbose > 4 && ! defined($_); - last unless defined($_); - redo; - ;# Ok, calm down... - ;# using $_ = <IN> in conjunction with redo - ;# is semantically equivalent to the while loop, but - ;# I needed a one line look ahead and this solution - ;# was what I thought of first - ;# and.. If you do not like it dont look - } - close(IN); - print(" first: ",$F_first{$key}, - " last: ",$F_last{$key},"\n") if $verbose > 1; - } - } - ;# now reclaim memory used for files no longer referenced ... - local(%Names); - grep($Names{$_} = 1,@newfiles); - foreach (keys %F_key) - { - next if defined($Names{$_}); - delete $F_key{$_}; - $verbose > 2 && print "no longer referenced: \"$_\"\n"; - } - %Names = (); - - grep($Names{$_} = 1,values(%F_key)); - foreach (keys %F_name) - { - next if defined($Names{$_}); - delete $F_name{$_}; - $verbose > 2 && print "unref name($_)= $F_name{$_}\n"; - } - foreach (keys %F_size) - { - next if defined($Names{$_}); - delete $F_size{$_}; - $verbose > 2 && print "unref size($_)\n"; - } - foreach (keys %F_mtime) - { - next if defined($Names{$_}); - delete $F_mtime{$_}; - $verbose > 2 && print "unref mtime($_)\n"; - } - foreach (keys %F_first) - { - next if defined($Names{$_}); - delete $F_first{$_}; - $verbose > 2 && print "unref first($_)\n"; - } - foreach (keys %F_last) - { - next if defined($Names{$_}); - delete $F_last{$_}; - $verbose > 2 && print "unref last($_)\n"; - } - ;# create list sorted by time - @F_files = sort {$F_first{$a} <=> $F_first{$b}; } keys(%F_name); - if ($verbose > 1) - { - print "Resulting file list:\n"; - foreach (@F_files) - { - print "\t$_\t$F_name{$_}\n"; - } - } - } - - printf("processing %s; output \"$out\" (%d input files)\n", - ((defined($StartTime) && defined($EndTime)) - ? "time range" - : (defined($StartTime) ? "$cnt samples from StartTime" : - (defined($EndTime) ? "$cnt samples to EndTime" : - "last $cnt samples"))), - scalar(@F_files)) - if $verbose > 1; - - ;# open output file - will be input for plotcmd - open(OUT,">$out") || - do { - warn("$0: cannot create \"$out\": $!\n"); - }; - - @f = @F_files; - if (defined($StartTime)) - { - while (@f && ($F_last{$f[$[]} < $StartTime)) - { - print("shifting ", $F_name{$f[$[]}, - " last: ", $F_last{$f[$[]}, - " < StartTime: $StartTime\n") - if $verbose > 3; - shift(@f); - } - - - } - if (defined($EndTime)) - { - while (@f && ($F_first{$f[$#f]} > $EndTime)) - { - print("popping ", $F_name{$f[$#f]}, - " first: ", $F_first{$f[$#f]}, - " > EndTime: $EndTime\n") - if $verbose > 3; - pop(@f); - } - } - - if (@f) - { - if (defined($StartTime)) - { - print "guess start according to StartTime ($StartTime)\n" - if $verbose > 3; - - if ($fpos[$[] eq 'start') - { - if (grep($_ eq $fpos[$[+1],@f)) - { - shift(@f) while @f && $f[$[] ne $fpos[$[+1]; - } - else - { - @fpos = ('start', $f[$[], undef); - } - } - else - { - @fpos = ('start' , $f[$[], undef); - } - - if (!defined($fpos[$[+2])) - { - if ($StartTime <= $F_first{$f[$[]}) - { - $fpos[$[+2] = 0; - } - else - { - $fpos[$[+2] = - int($F_size{$f[$[]} * - (($StartTime - $F_first{$f[$[]})/ - ($F_last{$f[$[]} - $F_first{$f[$[]}))); - $fpos[$[+2] = ($fpos[$[+2] <= 2 * $RecordSize) - ? 0 : $fpos[$[+2] - 2 * $RecordSize; - ;# anyway as the data may contain "time holes" - ;# our heuristics may baldly fail - ;# so just start at 0 - $fpos[$[+2] = 0; - } - } - } - elsif (defined($EndTime)) - { - print "guess starting point according to EndTime ($EndTime)\n" - if $verbose > 3; - - if ($fpos[$[] eq 'end') - { - if (grep($_ eq $fpos[$[+1],@f)) - { - shift(@f) while @f && $f[$[] ne $fpos[$[+1]; - } - else - { - @fpos = ('end', $f[$[], undef); - } - } - else - { - @fpos = ('end', $f[$[], undef); - } - - if (!defined($fpos[$[+2])) - { - local(@x) = reverse(@f); - local($s,$c) = (0,$cnt); - if ($EndTime < $F_last{$x[$[]}) - { - ;# last file will only be used partially - $s = int($F_size{$x[$[]} * - (($EndTime - $F_first{$x[$[]}) / - ($F_last{$x[$[]} - $F_first{$x[$[]}))); - $s = int($s/$RecordSize); - $c -= $s - 1; - if ($c <= 0) - { - ;# start is in the same file - $fpos[$[+1] = $x[$[]; - $fpos[$[+2] = ($c >=-2) ? 0 : (-$c - 2) * $RecordSize; - shift(@f) while @f && ($f[$[] ne $x[$[]); - } - else - { - shift(@x); - } - } - - if (!defined($fpos[$[+2])) - { - local($_); - while($_ = shift(@x)) - { - $s = int($F_size{$_}/$RecordSize); - $c -= $s - 1; - if ($c <= 0) - { - $fpos[$[+1] = $_; - $fpos[$[+2] = ($c>-2) ? 0 : (-$c - 2) * $RecordSize; - shift(@f) while @f && ($f[$[] ne $_); - last; - } - } - } - } - } - else - { - print "guessing starting point according to count ($cnt)\n" - if $verbose > 3; - ;# guess offset to get last available $cnt samples - if ($fpos[$[] eq 'cnt') - { - if (grep($_ eq $fpos[$[+1],@f)) - { - print "old positioning applies\n" if $verbose > 3; - shift(@f) while @f && $f[$[] ne $fpos[$[+1]; - } - else - { - @fpos = ('cnt', $f[$[], undef); - } - } - else - { - @fpos = ('cnt', $f[$[], undef); - } - - if (!defined($fpos[$[+2])) - { - local(@x) = reverse(@f); - local($s,$c) = (0,$cnt); - - local($_); - while($_ = shift(@x)) - { - print "examing \"$_\" $c samples still needed\n" - if $verbose > 4; - $s = int($F_size{$_}/$RecordSize); - $c -= $s - 1; - if ($c <= 0) - { - $fpos[$[+1] = $_; - $fpos[$[+2] = ($c>-2) ? 0 : (-$c - 2) * $RecordSize; - shift(@f) while @f && ($f[$[] ne $_); - last; - } - } - if (!defined($fpos[$[+2])) - { - print "no starting point yet - using start of data\n" - if $verbose > 2; - $fpos[$[+2] = 0; - } - } - } - } - print "Ooops, no suitable input file ??\n" - if $verbose > 1 && @f <= 0; - - printf("Starting at (%s) \"%s\" offset %ld using %d files\n", - $fpos[$[+1], - $F_name{$fpos[$[+1]}, - $fpos[$[+2], - scalar(@f)) - if $verbose > 2; - - $lm = 1; - $l = 0; - foreach $key (@f) - { - $file = $F_name{$key}; - print "processing file \"$file\"\n" if $verbose > 2; - - open(IN,"<$file") || - (warn("$0: cannot read \"$file\": $!\n"), next); - - ;# try to seek to a position nearer to the start of the interesting lines - ;# should always affect only first item in @f - ($key eq $fpos[$[+1]) && - (($verbose > 1) && - print("Seeking to offset $fpos[$[+2]\n"), - seek(IN,$fpos[$[+2],0) || - warn("$0: seek(\"$F_name{$key}\" failed: $|\n")); - - while(<IN>) - { - $l++; - ($verbose > 3) && - (($l % $lm) == 0 && print("\t$l lines read\n") && - (($l == 2) && ($lm = 10) || - ($l == 100) && ($lm = 100) || - ($l == 500) && ($lm = 500) || - ($l == 1000) && ($lm = 1000) || - ($l == 5000) && ($lm = 5000) || - ($l == 10000) && ($lm = 10000))); - - @F = split; - - next if @F < 5; # no valid input line is this short - next if $F[$[] eq ""; - ($F[$[] !~ /^\d+$/) && # A 'never should have happend' error - die("$0: unexpected input line: $_\n"); - - ;# modified Julian to UNIX epoch - $t = ($F[$[] - $MJD_1970) * 24 * 60 * 60; - $t += $F[$[+1]; # add seconds + fraction - - ;# multiply offset by 1000 to get ms - try to avoid float op - (($F[$[+2] =~ s/(\d*)\.(\d{3})(\d*)/\1\2.\3/) && - $F[$[+2] =~ s/0+([\d\.])/($1 eq '.') ? '0.' : $1/e) # strip leading zeros - || $F[$[+2] *= 1000; - - - ;# skip samples out of specified time range - next if (defined($StartTime) && $StartTime > $t); - next if (defined($EndTime) && $EndTime < $t); - - next if defined($lastT) && $t < $lastT; # backward in time ?? - - push(@offs,$F[$[+2]); - push(@freq,$F[$[+3] * (2**20/10**6)); - push(@cmpl,$F[$[+4]); - - push(@break, (defined($lastT) && ($t - $lastT > $deltaT))); - $lastT = $t; - push(@time,$t); - push(@loffset, tell(IN) - length($_)); - push(@filekey, $key); - - shift(@break),shift(@time),shift(@offs), - shift(@freq), shift(@cmpl),shift(@loffset), - shift(@filekey) - if @time > $cnt && - ! (defined($StartTime) && defined($EndTime)); - - last if @time >= $cnt && defined($StartTime) && !defined($EndTime); - } - close(IN); - last if @time >= $cnt && defined($StartTime) && !defined($EndTime); - } - print "input scanned ($l lines/",scalar(@time)," samples)\n" - if $verbose > 1; - - &lr_init('offs'); - &lr_init('freq'); - - if (@time) - { - local($_,@F); - - local($timebase) unless defined($timebase); - local($freqbase) unless defined($freqbase); - local($cmplscale) unless defined($cmplscale); - - undef($mintime,$maxtime,$minoffs,$maxoffs, - $minfreq,$maxfreq,$mincmpl,$maxcmpl, - $miny,$maxy); - - print "computing ranges\n" if $verbose > 2; - - $LastCnt = @time; - - ;# @time is in ascending order (;-) - $mintime = @time[$[]; - $maxtime = @time[$#time]; - unless (defined($timebase)) - { - local($time,@X) = (time); - @X = localtime($time); - - ;# compute today 00:00:00 - $timebase = $time - ((($X[$[+2]*60)+$X[$[+1])*60+$X[$[]); - - } - $LastTimeBase = $timebase; - - if ($showoffs) - { - local($i,$m,$f); - - $minoffs = &min(@offs); - $maxoffs = &max(@offs); - - ;# I know, it is not perl style using indices to access arrays, - ;# but I have to proccess two arrays in sync, non-destructively - ;# (otherwise a (shift(@a1),shift(a2)) would do), - ;# I dont like to make copies of these arrays as they may be huge - $i = $[; - &lr_sample(($time[$i]-$timebase)/3600,$offs[$i],'offs'),$i++ - while $i <= $#time; - - ($minoffs == $maxoffs) && ($minoffs -= 0.1,$maxoffs += 0.1); - - $i = &lr_sigma('offs'); - $m = &lr_mean('offs'); - - print "mean offset: $m sigma: $i\n" if $verbose > 2; - - if (($maxoffs - $minoffs) > $MinClip) - { - $f = (&abs($minoffs) < &abs($maxoffs)) ? $FuzzLow : $FuzzBig; - $miny = (($m - $minoffs) <= ($f * $i)) - ? $minoffs : ($m - $f * $i); - $f = ($f == $FuzzLow) ? $FuzzBig : $FuzzLow; - $maxy = (($maxoffs - $m) <= ($f * $i)) - ? $maxoffs : ($m + $f * $i); - } - else - { - $miny = $minoffs; - $maxy = $maxoffs; - } - ($maxy-$miny) == 0 && - (($maxy,$miny) - = (($maxoffs - $minoffs) > 0) - ? ($maxoffs,$minoffs) : ($MinClip,-$MinClip)); - - $maxy = $MaxY if defined($MaxY) && $MaxY < $maxy; - $miny = $MinY if defined($MinY) && $MinY > $miny; - - print "offset min clipped from $minoffs to $miny\n" - if $verbose > 2 && $minoffs != $miny; - print "offset max clipped from $maxoffs to $maxy\n" - if $verbose > 2 && $maxoffs != $maxy; - } - - if ($showfreq) - { - local($i,$m); - - $minfreq = &min(@freq); - $maxfreq = &max(@freq); - - $i = $[; - &lr_sample(($time[$i]-$timebase)/3600,$freq[$i]-$minfreq,'freq'), - $i++ - while $i <= $#time; - - $i = &lr_sigma('freq'); - $m = &lr_mean('freq') + $minfreq; - - print "mean frequency: $m sigma: $i\n" if $verbose > 2; - - if (defined($maxy)) - { - local($s) = - ($maxfreq - $minfreq) - ? ($maxy - $miny) / ($maxfreq - $minfreq) : 1; - - if (defined($freqbase)) - { - $FreqScale = 1; - $FreqScaleInv = ""; - } - else - { - $FreqScale = 1; - $FreqScale = 10 ** int(log($s)/log(10) - 0.8); - $FreqScaleInv = - ("$FreqScale" =~ /^10(0*)$/) ? "0.${1}1" : - ($FreqScale == 1 ? "" : (1/$FreqScale)); - - $freqbase = $m * $FreqScale; - $freqbase -= &lr_mean('offs'); - - ;# round resulting freqbase - ;# to precision of min max difference - $s = int(log(($maxfreq-$minfreq)*$FreqScale)/log(10))-1; - $s = 10 ** $s; - $freqbase = int($freqbase / $s) * $s; - } - } - else - { - $FreqScale = 1; - $FreqScaleInv = ""; - $freqbase = $m unless defined($freqbase); - if (($maxfreq - $minfreq) > $MinClip) - { - $f = (&abs($minfreq) < &abs($maxfreq)) - ? $FuzzLow : $FuzzBig; - $miny = (($freqbase - $minfreq) <= ($f * $i)) - ? ($minfreq-$freqbase) : (- $f * $i); - $f = ($f == $FuzzLow) ? $FuzzBig : $FuzzLow; - $maxy = (($maxfreq - $freqbase) <= ($f * $i)) - ? ($maxfreq-$freqbase) : ($f * $i); - } - else - { - $miny = $minfreq - $freqbase; - $maxy = $maxfreq - $freqbase; - } - ($maxy - $miny) == 0 && - (($maxy,$miny) = - (($maxfreq - $minfreq) > 0) - ? ($maxfreq-$freqbase,$minfreq-$freqbase) : (0.5,-0.5)); - - $maxy = $MaxY if defined($MaxY) && $MaxY < $maxy; - $miny = $MinY if defined($MinY) && $MinY > $miny; - - print("frequency min clipped from ",$minfreq-$freqbase, - " to $miny\n") - if $verbose > 2 && $miny != ($minfreq - $freqbase); - print("frequency max clipped from ",$maxfreq-$freqbase, - " to $maxy\n") - if $verbose > 2 && $maxy != ($maxfreq - $freqbase); - } - $LastFreqBaseString = - sprintf("%g",$freqbase >= 0 ? $freqbase : -$freqbase); - $LastFreqBase = $freqbase; - print "LastFreqBaseString now \"$LastFreqBaseString\"\n" - if $verbose > 5; - } - else - { - $FreqScale = 1; - $FreqScaleInv = ""; - $LastFreqBase = 0; - $LastFreqBaseString = ""; - } - - if ($showcmpl) - { - $mincmpl = &min(@cmpl); - $maxcmpl = &max(@cmpl); - - if (!defined($cmplscale)) - { - if (defined($maxy)) - { - local($cmp) - = (&abs($miny) > &abs($maxy)) ? &abs($miny) : $maxy; - $cmplscale = $cmp == $maxy ? 1 : -1; - - foreach (0.01, 0.02, 0.05, - 0.1, 0.2, 0.25, 0.4, 0.5, - 1, 2, 4, 5, - 10, 20, 25, 50, - 100, 200, 250, 500, 1000) - { - $cmplscale *= $_, last if $maxcmpl/$_ <= $cmp; - } - } - else - { - $cmplscale = 1; - $miny = $mincmpl ? 0 : -$MinClip; - $maxy = $maxcmpl+$MinClip; - } - } - $LastCmplScale = $cmplscale; - } - else - { - $LastCmplScale = 1; - } - - print "creating plot command input file\n" if $verbose > 2; - - - print OUT ("# preprocessed NTP statistics file for $STATHOST\n"); - print OUT ("# timebase is: ",&ctime($LastTimeBase)) - if defined($LastTimeBase); - print OUT ("# frequency is offset by ", - ($LastFreqBase >= 0 ? "+" : "-"), - "$LastFreqBaseString [${FreqScaleInv}ppm]\n"); - print OUT ("# compliance is scaled by $LastCmplScale\n"); - print OUT ("# time [h]\toffset [ms]\tfrequency [${FreqScaleInv}ppm]\tcompliance\n"); - - printf OUT ("%s%lf\t%lf\t%lf\t%lf\n", - (shift(@break) ? "\n" : ""), - (shift(@time) - $LastTimeBase)/3600, - shift(@offs), - shift(@freq) * $FreqScale - $LastFreqBase, - shift(@cmpl) / $LastCmplScale) - while(@time); - } - else - { - ;# prevent plotcmd from processing empty file - print "Creating plot command dummy...\n" if $verbose > 2; - print OUT "# dummy samples\n0 1 2 3\n1 1 2 3\n"; - &lr_sample(0,1,'offs'); - &lr_sample(1,1,'offs'); - &lr_sample(0,2,'freq'); - &lr_sample(1,2,'freq'); - @time = (0, 1); $maxtime = 1; $mintime = 0; - @offs = (1, 1); $maxoffs = 1; $minoffs = 1; - @freq = (2, 2); $maxfreq = 2; $minfreq = 2; - @cmpl = (3, 3); $maxcmpl = 3; $mincmpl = 3; - $LastCnt = 2; - $LastFreqBase = 0; - $LastCmplScale = 1; - $LastTimeBase = 0; - $miny = -$MinClip; - $maxy = 3 + $MinClip; - } - close(OUT); - - print "plot command input file created\n" - if $verbose > 2; - - if (($fpos[$[] eq 'cnt' && @loffset >= $cnt) || - ($fpos[$[] eq 'start' && $time[$[] <= $StartTime) || - ($fpos[$[] eq 'end')) - { - return ($fpos[$[],$filekey[$[],$loffset[$[]); - } - else # found to few lines - next time start search earlier in file - { - if ($fpos[$[] eq 'start') - { - ;# the timestamps we got for F_first and F_last guaranteed - ;# that no file is left out - ;# the only thing that could happen is: - ;# we guessed the starting point wrong - ;# compute a new guess from the first record found - ;# if this equals our last guess use data of first record - ;# otherwise try new guess - - if ($fpos[$[+1] eq $filekey[$[] && $loffset[$[] > $fpos[$[+2]) - { - local($noff); - $noff = $loffset[$[] - ($cnt - @loffset + 1) * $RecordSize; - $noff = 0 if $noff < 0; - - return (@fpos[$[,$[+1], ($noff == $fpos[$[+2]) ? $loffset[$[] : $noff); - } - return ($fpos[$[],$filekey[$[],$loffset[$[]); - } - elsif ($fpos[$[] eq 'end' || $fpos[$[] eq 'cnt') - { - ;# try to start earlier in file - ;# if we already started at the beginning - ;# try to use previous file - ;# this assumes distance to better starting point is at most one file - ;# the primary guess at top of genfile() should usually allow this - ;# assumption - ;# if the offset of the first sample used is within - ;# a different file than we guessed it must have occured later - ;# in the sequence of files - ;# this only can happen if our starting file did not contain - ;# a valid sample from the starting point we guessed - ;# however this does not invalidate our assumption, no check needed - local($noff,$key); - if ($fpos[$[+2] > 0) - { - $noff = $fpos[$[+2] - $RecordSize * ($cnt - @loffset + 1); - $noff = 0 if $noff < 0; - return (@fpos[$[,$[+1],$noff); - } - else - { - if ($fpos[$[+1] eq $F_files[$[]) - { - ;# first file - and not enough samples - ;# use data of first sample - return ($fpos[$[], $filekey[$[], $loffset[$[]); - } - else - { - ;# search key of previous file - $key = $F_files[$[]; - @F = reverse(@F_files); - while ($_ = shift(@F)) - { - if ($_ eq $fpos[$[+1]) - { - $key = shift(@F) if @F; - last; - } - } - $noff = int($F_size{$key} / $RecordSize); - $noff -= $cnt - @loffset; - $noff = 0 if $noff < 0; - $noff *= $RecordSize; - return ($fpos[$[], $key, $noff); - } - } - } - else - { - return (); - } - - return 0 if @loffset <= 1 || ($loffset[$#loffset] - $loffset[$[]) <= 1; - - ;# EOF - 1.1 * avg(line) * $cnt - local($val) = $loffset[$#loffset] - - $cnt * 11 * (($loffset[$#loffset] - $loffset[$[]) / @loffset) / 10; - return ($val < 0) ? 0 : $val; - } -} - -;# initial setup of plot -print "initialize plotting\n" if $verbose; -if (defined($PrintIt)) -{ - if ($PrintIt =~ m,/,) - { - print "Saving plot to file $PrintIt\n"; - print PLOT "set output '$PrintIt'\n"; - } - else - { - print "Printing plot on printer $PrintIt\n"; - print PLOT "set output '| lpr -P$PrintIt -h'\n"; - } - print PLOT "set terminal postscript landscape color solid 'Helvetica' 10\n"; -} -print PLOT "set grid\n"; -print PLOT "set tics out\n"; -print PLOT "set format y '%g '\n"; -printf PLOT "set time 47\n" unless defined($PrintIt); - -@filepos =(); -while(1) -{ - print &ctime(time) if $verbose; - - ;# update diplay characteristics - &read_config;# unless defined($PrintIt); - - unlink($tmpfile); - @filepos = &genfile($samples,$srcprefix,$tmpfile,@filepos); - - ;# make plotcmd display samples - &make_doplot; - print "Displaying plot...\n" if $verbose > 1; - print "command for plot sub process:\n$doplot----\n" if $verbose > 3; - print PLOT $doplot; -} -continue -{ - if (defined($PrintIt)) - { - delete $SIG{'CHLD'}; - print PLOT "quit\n"; - close(PLOT); - if ($PrintIt =~ m,/,) - { - print "Plot saved to file $PrintIt\n"; - } - else - { - print "Plot spooled to printer $PrintIt\n"; - } - unlink($tmpfile); - exit(0); - } - ;# wait $delay seconds - print "waiting $delay seconds ..." if $verbose > 2; - sleep($delay); - print " continuing\n" if $verbose > 2; - undef($LastFreqBaseString); -} - - -sub date_time_spec2seconds -{ - local($_) = @_; - ;# a date_time_spec consistes of: - ;# YYYY-MM-DD_HH:MM:SS.ms - ;# values can be omitted from the beginning and default than to - ;# values of current date - ;# values omitted from the end default to lowest possible values - - local($time) = time; - local($sec,$min,$hour,$mday,$mon,$year) - = localtime($time); - - local($last) = (); - - s/^\D*(.*\d)\D*/\1/; # strip off garbage - - PARSE: - { - if (s/^(\d{4})(-|$)//) - { - if ($1 < 1970) - { - warn("$0: can not handle years before 1970 - year $1 ignored\n"); - return undef; - } - elsif ( $1 >= 2070) - { - warn("$0: can not handle years past 2070 - year $1 ignored\n"); - return undef; - } - else - { - $year = $1 % 100; # 0<= $year < 100 - ;# - interpreted 70 .. 99,00 .. 69 - } - $last = $[ + 5; - last PARSE if $_ eq ''; - warn("$0: bad date_time_spec: \"$_\" found after YEAR\n"), - return(undef) - if $2 eq ''; - } - - if (s/^(\d{1,2})(-|$)//) - { - warn("$0: implausible month $1\n"),return(undef) - if $1 < 1 || $1 > 12; - $mon = $1 - 1; - $last = $[ + 4; - last PARSE if $_ eq ''; - warn("$0: bad date_time_spec: \"$_\" found after MONTH\n"), - return(undef) - if $2 eq ''; - } - else - { - warn("$0: bad date_time_spec \"$_\"\n"),return(undef) - if defined($last); - - } - - if (s/^(\d{1,2})([_ ]|$)//) - { - warn("$0: implausible month day $1 for month ".($mon+1)." (". - $MaxNumDaysPerMonth[$mon].")$mon\n"), - return(undef) - if $1 < 1 || $1 > $MaxNumDaysPerMonth[$mon]; - $mday = $1; - $last = $[ + 3; - last PARSE if $_ eq ''; - warn("$0: bad date_time_spec \"$_\" found after MDAY\n"), - return(undef) - if $2 eq ''; - } - else - { - warn("$0: bad date_time_spec \"$_\"\n"), return undef - if defined($last); - } - - ;# now we face a problem: - ;# if ! defined($last) a prefix of "07:" - ;# can be either 07:MM or 07:ss - ;# to get the second interpretation make the user add - ;# a msec fraction part and check for this special case - if (! defined($last) && s/^(\d{1,2}):(\d{1,2}\.\d+)//) - { - warn("$0: implausible minute $1\n"), return undef - if $1 < 0 || $1 >= 60; - warn("$0: implausible second $1\n"), return undef - if $2 < 0 || $2 >= 60; - $min = $1; - $sec = $2; - $last = $[ + 1; - last PARSE if $_ eq ''; - warn("$0: bad date_time_spec \"$_\" after SECONDS\n"); - return undef; - } - - if (s/^(\d{1,2})(:|$)//) - { - warn("$0: implausible hour $1\n"), return undef - if $1 < 0 || $1 > 24; - $hour = $1; - $last = $[ + 2; - last PARSE if $_ eq ''; - warn("$0: bad date_time_spec found \"$_\" after HOUR\n"), - return undef - if $2 eq ''; - } - else - { - warn("$0: bad date_time_spec \"$_\"\n"), return undef - if defined($last); - } - - if (s/^(\d{1,2})(:|$)//) - { - warn("$0: implausible minute $1\n"), return undef - if $1 < 0 || $1 >=60; - $min = $1; - $last = $[ + 1; - last PARSE if $_ eq ''; - warn("$0: bad date_time_spec found \"$_\" after MINUTE\n"), - return undef - if $2 eq ''; - } - else - { - warn("$0: bad date_time_spec \"$_\"\n"), return undef - if defined($last); - } - - if (s/^(\d{1,2}(\.\d+)?)//) - { - warn("$0: implausible second $1\n"), return undef - if $1 < 0 || $1 >=60; - $sec = $1; - $last = $[; - last PARSE if $_ eq ''; - warn("$0: bad date_time_spec found \"$_\" after SECOND\n"); - return undef; - } - } - - return $time unless defined($last); - - $sec = 0 if $last > $[; - $min = 0 if $last > $[ + 1; - $hour = 0 if $last > $[ + 2; - $mday = 1 if $last > $[ + 3; - $mon = 0 if $last > $[ + 4; - local($rtime) = &timelocal($sec,$min,$hour,$mday,$mon,$year, 0,0, 0); - - ;# $rtime may be off if daylight savings time is in effect at given date - return $rtime + ($sec - int($sec)) - if $hour == (localtime($rtime))[$[+2]; - return - &timelocal($sec,$min,$hour,$mday,$mon,$year, 0,0, 1) - + ($sec - int($sec)); -} - - -sub min -{ - local($m) = shift; - - grep((($m > $_) && ($m = $_),0),@_); - $m; -} - -sub max -{ - local($m) = shift; - - grep((($m < $_) && ($m = $_),0),@_); - $m; -} diff --git a/usr.sbin/xntpd/scripts/monitoring/ntptrap b/usr.sbin/xntpd/scripts/monitoring/ntptrap deleted file mode 100755 index 69c66608af97..000000000000 --- a/usr.sbin/xntpd/scripts/monitoring/ntptrap +++ /dev/null @@ -1,453 +0,0 @@ -#!/local/bin/perl --*-perl-*- -;# -;# ntptrap,v 3.1 1993/07/06 01:09:15 jbj Exp -;# -;# a client for the xntp mode 6 trap mechanism -;# -;# Copyright (c) 1992 -;# Rainer Pruy Friedrich-Alexander Universitaet Erlangen-Nuernberg -;# -;# -;############################################################# -$0 =~ s!^.*/([^/]+)$!\1!; # strip to filename -;# enforce STDOUT and STDERR to be line buffered -$| = 1; -select((select(STDERR),$|=1)[$[]); - -;####################################### -;# load utility routines and definitions -;# -require('ntp.pl'); # implementation of the NTP protocol -eval { require('sys/socket.ph'); require('netinet/in.ph') unless defined(&INADDR_ANY); } || -do { - die("$0: $@") unless $[ == index($@, "Can't locate "); - warn "$0: $@"; - warn "$0: supplying some default definitions\n"; - eval 'sub INADDR_ANY { 0; } sub AF_INET {2;} sub SOCK_DGRAM {2;} 1;' || die "$0: $@"; -}; -require('getopts.pl'); # option parsing -require('ctime.pl'); # date/time formatting - -;###################################### -;# define some global constants -;# -$BASE_TIMEOUT=10; -$FRAG_TIMEOUT=10; -$MAX_TRY = 5; -$REFRESH_TIME=60*15; # 15 minutes (server uses 1 hour) -$ntp'timeout = $FRAG_TIMEOUT; #'; - -;###################################### -;# now process options -;# -sub usage -{ - die("usage: $0 [-n] [-p <port>] [-l <logfile>] [host] ...\n"); -} - -$opt_l = "/dev/null"; # where to write debug messages to -$opt_p = 0; # port to use locally - (0 does mean: will be choosen by kernel) - -&usage unless &Getopts('l:p:'); -&Getopts if 0; # make -w happy - -@Hosts = ($#ARGV < $[) ? ("localhost") : @ARGV; - -;# setup for debug output -$DEBUGFILE=$opt_l; -$DEBUGFILE="&STDERR" if $DEBUGFILE eq '-'; - -open(DEBUG,">>$DEBUGFILE") || die("Cannot open \"$DEBUGFILE\": $!\n"); -select((select(DEBUG),$|=1)[$[]); - -;# &log prints a single trap record (adding a (local) time stamp) -sub log -{ - chop($date=&ctime(time)); - print "$date ",@_,"\n"; -} - -sub debug -{ - print DEBUG @_,"\n"; -} -;# -$proto_udp = (getprotobyname('udp'))[$[+2] || - (warn("$0: Could not get protocoll number for 'udp' using 17"), 17); - -$ntp_port = (getservbyname('ntp','udp'))[$[+2] || - (warn("$0: Could not get port number for service ntp/udp using 123"), 123); - -;# -socket(S, &AF_INET, &SOCK_DGRAM, $proto_udp) || die("Cannot open socket: $!\n"); - -;# -bind(S, pack("S n N x8", &AF_INET, $opt_p, &INADDR_ANY)) || - die("Cannot bind: $!\n"); - -($my_port, $my_addr) = (unpack("S n a4 x8",getsockname(S)))[$[+1,$[+2]; -&log(sprintf("Listening at address %d.%d.%d.%d port %d", - unpack("C4",$my_addr), $my_port)); - -;# disregister with all servers in case of termination -sub cleanup -{ - &log("Aborted by signal \"$_[$[]\"") if defined($_[$[]); - - foreach (@Hosts) - { - &ntp'send(S,31,0,"",pack("Sna4x8",&AF_INET,$ntp_port,$Hosts{$_})); #'; - } - close(S); - exit(2); -} - -$SIG{'HUP'} = 'cleanup'; -$SIG{'INT'} = 'cleanup'; -$SIG{'QUIT'} = 'cleanup'; -$SIG{'TERM'} = 'cleanup'; - -0 && $a && $b; -sub timeouts # sort timeout id array -{ - $TIMEOUTS{$a} <=> $TIMEOUTS{$b}; -} - -;# a Request element looks like: pack("a4SC",addr,associd,op) -@Requests= (); - -;# compute requests for set trap control msgs to each host given -{ - local($name,$addr); - - foreach (@Hosts) - { - if (/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) - { - ($name,$addr) = - (gethostbyaddr(pack("C4",$1,$2,$3,$4),&AF_INET))[$[,$[+4]; - unless (defined($name)) - { - $name = sprintf("[[%d.%d.%d.%d]]",$1,$2,$3,$4); - $addr = pack("C4",$1,$2,$3,$4); - } - } - else - { - ($name,$addr) = (gethostbyname($_))[$[,$[+4]; - unless (defined($name)) - { - warn "$0: unknown host \"$_\" - ignored\n"; - next; - } - } - next if defined($Host{$name}); - $Host{$name} = $addr; - push(@Requests,pack("a4SC",$addr,0,6)); # schedule a set trap request for $name - } -} - -sub hostname -{ - local($addr) = @_; - return $HostName{$addr} if defined($HostName{$addr}); - local($name) = gethostbyaddr($addr,&AF_INET); - &debug(sprintf("hostname(%d.%d.%d.%d) = \"%s\"",unpack("C4",$addr),$name)) - if defined($name); - defined($name) && ($HostName{$addr} = $name) && (return $name); - &debug(sprintf("Failed to get name for %d.%d.%d.%d",unpack("C4",$addr))); - return sprintf("[%d.%d.%d.%d]",unpack("C4",$addr)); -} - -;# when no hosts were given on the commandline no requests have been scheduled -&usage unless (@Requests); - -&debug(sprintf("%d request(s) scheduled",scalar(@Requests))); -grep(&debug(" - ".$_),keys(%Host)); - -;# allocate variables; -$addr=""; -$assoc=0; -$op = 0; -$timeout = 0; -$ret=""; -%TIMEOUTS = (); -%TIMEOUT_PROCS = (); -@TIMEOUTS = (); - -$len = 512; -$buf = " " x $len; - -while (1) -{ - if (@Requests || @TIMEOUTS) # if there is some work pending - { - if (@Requests) - { - ($addr,$assoc,$op) = unpack("a4SC",($req = shift(@Requests))); - &debug(sprintf("Request: %s: %s(%d)",&hostname($addr), &ntp'cntrlop_name($op), $assoc)); #';)) - $ret = &ntp'send(S,$op,$assoc,"", #'( - pack("Sna4x8",&AF_INET,$ntp_port,$addr)); - &set_timeout("retry-".unpack("H*",$req),time+$BASE_TIMEOUT, - sprintf("&retry(\"%s\");",unpack("H*",$req))); - - last unless (defined($ret)); # warn called by ntp'send(); - - ;# if there are more requests just have a quick look for new messages - ;# otherwise grant server time for a response - $timeout = @Requests ? 0 : $BASE_TIMEOUT; - } - if ($timeout && @TIMEOUTS) - { - ;# ensure not to miss a timeout - if ($timeout + time > $TIMEOUTS{$TIMEOUTS[$[]}) - { - $timeout = $TIMEOUTS{$TIMEOUTS[$[]} - time; - $timeout = 0 if $timeout < 0; - } - } - } - else - { - ;# no work yet - wait for some messages dropping in - ;# usually this will not hapen as the refresh semantic will - ;# always have a pending timeout - undef($timeout); - } - - vec($mask="",fileno(S),1) = 1; - $ret = select($mask,undef,undef,$timeout); - - warn("$0: select: $!\n"),last if $ret < 0; # give up on error return from select - - if ($ret == 0) - { - ;# timeout - if (@TIMEOUTS && time > $TIMEOUTS{$TIMEOUTS[$[]}) - { - ;# handle timeout - $timeout_proc = - (delete $TIMEOUT_PROCS{$TIMEOUTS[$[]}, - delete $TIMEOUTS{shift(@TIMEOUTS)})[$[]; - eval $timeout_proc; - die "timeout eval (\"$timeout_proc\"): $@\n" if $@; - } - ;# else: there may be something to be sent - } - else - { - ;# data avail - $from = recv(S,$buf,$len,0); - ;# give up on error return from recv - warn("$0: recv: $!\n"), last unless (defined($from)); - - $from = (unpack("Sna4",$from))[$[+2]; # keep host addr only - ;# could check for ntp_port - but who cares - &debug("-Packet from ",&hostname($from)); - - ;# stuff packet into ntp mode 6 receive machinery - ($ret,$data,$status,$associd,$op,$seq,$auth_keyid) = - &ntp'handle_packet($buf,$from); # '; - &debug(sprintf("%s uses auth_keyid %d",&hostname($from),$auth_keyid)) if defined($auth_keyid); - next unless defined($ret); - - if ($ret eq "") - { - ;# handle packet - ;# simple trap response messages have neither timeout nor retries - &clear_timeout("retry-".unpack("H*",pack("a4SC",$from,$associd,$op))) unless $op == 7; - delete $RETRY{pack("a4SC",$from,$associd,$op)} unless $op == 7; - - &process_response($from,$ret,$data,$status,$associd,$op,$seq,$auth_keyid); - } - else - { - ;# some kind of error - &log(sprintf("%50s: %s: %s",(gethostbyaddr($from,&AF_INET))[$[],$ret,$data)); - if ($ret ne "TIMEOUT" && $ret ne "ERROR") - { - &clear_timeout("retry-".unpack("H*",pack("a4SC",$from,$associd,$op))); - } - } - } - -} - -warn("$0: terminating\n"); -&cleanup; -exit 0; - -;################################################## -;# timeout support -;# -sub set_timeout -{ - local($id,$time,$proc) = @_; - - $TIMEOUTS{$id} = $time; - $TIMEOUT_PROCS{$id} = $proc; - @TIMEOUTS = sort timeouts keys(%TIMEOUTS); - chop($date=&ctime($time)); - &debug(sprintf("Schedule timeout \"%s\" for %s", $id, $date)); -} - -sub clear_timeout -{ - local($id) = @_; - delete $TIMEOUTS{$id}; - delete $TIMEOUT_PROCS{$id}; - @TIMEOUTS = sort timeouts keys(%TIMEOUTS); - &debug("Clear timeout \"$id\""); -} - -0 && &refresh; -sub refresh -{ - local($addr) = @_; - $addr = pack("H*",$addr); - &debug(sprintf("Refreshing trap for %s", &hostname($addr))); - push(@Requests,pack("a4SC",$addr,0,6)); -} - -0 && &retry; -sub retry -{ - local($tag) = @_; - $tag = pack("H*",$tag); - $RETRY{$tag} = 0 if (!defined($RETRY{$tag})); - - if (++$RETRY{$tag} > $MAX_TRY) - { - &debug(sprintf("Retry failed: %s assoc %5d op %d", - &hostname(substr($tag,$[,4)), - unpack("x4SC",$tag))); - return; - } - &debug(sprintf("Retrying: %s assoc %5d op %d", - &hostname(substr($tag,$[,4)), - unpack("x4SC",$tag))); - push(@Requests,$tag); -} - -sub process_response -{ - local($from,$ret,$data,$status,$associd,$op,$seq,$auth_keyid) = @_; - - $msg=""; - if ($op == 7) # trap response - { - $msg .= sprintf("%40s trap#%-5d", - &hostname($from),$seq); - &debug (sprintf("\nTrap %d associd %d:\n%s\n===============\n",$seq,$associd,$data)); - if ($associd == 0) # system event - { - $msg .= " SYSTEM "; - $evnt = &ntp'SystemEvent($status); #'; - $msg .= "$evnt "; - ;# for special cases add additional info - ($stratum) = ($data =~ /stratum=(\d+)/); - ($refid) = ($data =~ /refid=([\w\.]+)/); - $msg .= "stratum=$stratum refid=$refid"; - if ($refid =~ /\[?(\d+)\.(\d+)\.(\d+)\.(\d+)/) - { - $msg .= " " . (gethostbyaddr(pack("C4",$1,$2,$3,$4),&AF_INET))[$[]; - } - if ($evnt eq "event_sync_chg") - { - $msg .= sprintf("%s %s ", - &ntp'LI($status), #', - &ntp'ClockSource($status) #' - ); - } - elsif ($evnt eq "event_sync/strat_chg") - { - ($peer) = ($data =~ /peer=([0-9]+)/); - $msg .= " peer=$peer"; - } - elsif ($evnt eq "event_clock_excptn") - { - if (($device) = ($data =~ /device=\"([^\"]+)\"/)) - { - ($cstatus) = ($data =~ /refclockstatus=0?x?([\da-fA-F]+)/); - $Cstatus = hex($cstatus); - $msg .= sprintf("- %-32s",&ntp'clock_status($Cstatus)); #'); - ($timecode) = ($data =~ /timecode=\"([^\"]+)\"/); - $msg .= " \"$device\" \"$timecode\""; - } - else - { - push(@Requests,pack("a4SC",$from, $associd, 4)); - } - } - } - else # peer event - { - $msg .= sprintf("peer %5d ",$associd); - ($srcadr) = ($data =~ /srcadr=\[?([\d\.]+)/); - $msg .= sprintf("%-18s %40s ", "[$srcadr]", - &hostname(pack("C4",split(/\./,$srcadr)))); - $evnt = &ntp'PeerEvent($status); #'; - $msg .= "$evnt "; - ;# for special cases include additional info - if ($evnt eq "event_clock_excptn") - { - if (($device) = ($data =~ /device=\"([^\"]+)\"/)) - { - ;#&debug("----\n$data\n====\n"); - ($cstatus) = ($data =~ /refclockstatus=0?x?([\da-fA-F]+)/); - $Cstatus = hex($cstatus); - $msg .= sprintf("- %-32s",&ntp'clock_status($Cstatus)); #'); - ($timecode) = ($data =~ /timecode=\"([^\"]+)\"/); - $msg .= " \"$device\" \"$timecode\""; - } - else - { - ;# no clockvars included - post a cv request - push(@Requests,pack("a4SC",$from, $associd, 4)); - } - } - elsif ($evnt eq "event_stratum_chg") - { - ($stratum) = ($data =~ /stratum=(\d+)/); - $msg .= "new stratum $stratum"; - } - } - } - elsif ($op == 6) # set trap resonse - { - &debug("Set trap ok from ",&hostname($from)); - &set_timeout("refresh-".unpack("H*",$from),time+$REFRESH_TIME, - sprintf("&refresh(\"%s\");",unpack("H*",$from))); - return; - } - elsif ($op == 4) # read clock variables response - { - ;# status of clock - $msg .= sprintf(" %40s ", &hostname($from)); - if ($associd == 0) - { - $msg .= "system clock status: "; - } - else - { - $msg .= sprintf("peer %5d clock",$associd); - } - $msg .= sprintf("%-32s",&ntp'clock_status($status)); #'); - ($device) = ($data =~ /device=\"([^\"]+)\"/); - ($timecode) = ($data =~ /timecode=\"([^\"]+)\"/); - $msg .= " \"$device\" \"$timecode\""; - } - elsif ($op == 31) # unset trap response (UNOFFICIAL op) - { - ;# clear timeout - &debug("Clear Trap ok from ",&hostname($from)); - &clear_timeout("refresh-".unpack("H*",$from)); - return; - } - else # unexpected response - { - $msg .= "unexpected response to op $op assoc=$associd"; - $msg .= sprintf(" status=%04x",$status); - } - &log($msg); -} diff --git a/usr.sbin/xntpd/scripts/monitoring/timelocal.pl b/usr.sbin/xntpd/scripts/monitoring/timelocal.pl deleted file mode 100755 index 061f925ac915..000000000000 --- a/usr.sbin/xntpd/scripts/monitoring/timelocal.pl +++ /dev/null @@ -1,78 +0,0 @@ -;# timelocal.pl -;# -;# Usage: -;# $time = timelocal($sec,$min,$hours,$mday,$mon,$year,$junk,$junk,$isdst); -;# $time = timegm($sec,$min,$hours,$mday,$mon,$year); - -;# These routines are quite efficient and yet are always guaranteed to agree -;# with localtime() and gmtime(). We manage this by caching the start times -;# of any months we've seen before. If we know the start time of the month, -;# we can always calculate any time within the month. The start times -;# themselves are guessed by successive approximation starting at the -;# current time, since most dates seen in practice are close to the -;# current date. Unlike algorithms that do a binary search (calling gmtime -;# once for each bit of the time value, resulting in 32 calls), this algorithm -;# calls it at most 6 times, and usually only once or twice. If you hit -;# the month cache, of course, it doesn't call it at all. - -;# timelocal is implemented using the same cache. We just assume that we're -;# translating a GMT time, and then fudge it when we're done for the timezone -;# and daylight savings arguments. The timezone is determined by examining -;# the result of localtime(0) when the package is initialized. The daylight -;# savings offset is currently assumed to be one hour. - -CONFIG: { - package timelocal; - - @epoch = localtime(0); - $tzmin = $epoch[2] * 60 + $epoch[1]; # minutes east of GMT - if ($tzmin > 0) { - $tzmin = 24 * 60 - $tzmin; # minutes west of GMT - $tzmin -= 24 * 60 if $epoch[5] == 70; # account for the date line - } - - $SEC = 1; - $MIN = 60 * $SEC; - $HR = 60 * $MIN; - $DAYS = 24 * $HR; - $YearFix = ((gmtime(946684800))[5] == 100) ? 100 : 0; - 1; -} - -sub timegm { - package timelocal; - - $ym = pack(C2, @_[5,4]); - $cheat = $cheat{$ym} || &cheat; - $cheat + $_[0] * $SEC + $_[1] * $MIN + $_[2] * $HR + ($_[3]-1) * $DAYS; -} - -sub timelocal { - package timelocal; - - $ym = pack(C2, @_[5,4]); - $cheat = $cheat{$ym} || &cheat; - $cheat + $_[0] * $SEC + $_[1] * $MIN + $_[2] * $HR + ($_[3]-1) * $DAYS - + $tzmin * $MIN - 60 * 60 * ($_[8] != 0); -} - -package timelocal; - -sub cheat { - $year = $_[5]; - $month = $_[4]; - $guess = $^T; - @g = gmtime($guess); - $year += $YearFix if $year < $epoch[5]; - while ($diff = $year - $g[5]) { - $guess += $diff * (364 * $DAYS); - @g = gmtime($guess); - } - while ($diff = $month - $g[4]) { - $guess += $diff * (28 * $DAYS); - @g = gmtime($guess); - } - $g[3]--; - $guess -= $g[0] * $SEC + $g[1] * $MIN + $g[2] * $HR + $g[3] * $DAYS; - $cheat{$ym} = $guess; -} diff --git a/usr.sbin/xntpd/scripts/ntp-groper b/usr.sbin/xntpd/scripts/ntp-groper deleted file mode 100755 index 1fd0cfe4c2d6..000000000000 --- a/usr.sbin/xntpd/scripts/ntp-groper +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/sh -# -# ntpgroper host ... -# -# This script checks each hostname given as an argument to see if -# it is running NTP. It reports one of the following messages (assume -# the host is named "dumbo.hp.com": -# -# dumbo.hp.com not registered in DNS -# dumbo.hp.com not responding to ping -# dumbo.hp.com refused ntpq connection -# dumbo.hp.com not responding to NTP -# dumbo.hp.com answers NTP version 2, stratum: 3, ref: telford.nsa.hp.com -# dumbo.hp.com answers NTP version 3, stratum: 3, ref: telford.nsa.hp.com -# -# It ain't pretty, but it is kinda useful. -# -# Walter Underwood, 11 Feb 1993, wunder@hpl.hp.com -# -# converted to /bin/sh from /bin/ksh by scott@ee.udel.edu 24 Mar 1993 - -PATH="/usr/local/etc:$PATH" export PATH - -verbose=1 -logfile=/tmp/cntp-log$$ -ntpqlog=/tmp/cntp-ntpq$$ - -# I wrap the whole thing in parens so that it is possible to redirect -# all the output somewhere, if desired. -( -for host in $* -do - # echo "Trying $host." - - gethost $host > /dev/null 2>&1 - if [ $? -ne 0 ] - then - echo "$host not registered in DNS" - continue - fi - - ping $host 64 1 > /dev/null 2>&1 - if [ $? -ne 0 ] - then - echo "$host not responding to ping" - continue - fi - - # Attempt to contact with version 3 ntp, then try version 2. - for version in 3 2 - do - - ntpq -c "ntpversion $version" -p $host > $ntpqlog 2>&1 - - if fgrep -s 'Connection refused' $ntpqlog - then - echo "$host refused ntpq connection" - break - fi - - responding=1 - fgrep -s 'timed out, nothing received' $ntpqlog > /dev/null && responding=0 - - if [ $responding -eq 1 ] - then - ntpq -c "ntpversion $version" -c rl $host > $ntpqlog - - # First we extract the reference ID (usually a host or a clock) - synchost=`fgrep "refid=" $ntpqlog` - #synchost=${synchost##*refid=} # strip off the beginning of the line - #synchost=${synchost%%,*} # strip off the end - synchost=`expr "$synchost" : '.*refid=\([^,]*\),.*'` - - # Next, we get the stratum - stratum=`fgrep "stratum=" $ntpqlog` - #stratum=${stratum##*stratum=} - #stratum=${stratum%%,*} - stratum=`expr "$stratum" : '.*stratum=\([^,]*\),.*'` - - echo "$host answers NTP version $version, stratum: $stratum, ref: $synchost" - break; - fi - - if [ $version -eq 2 -a $responding -eq 0 ] - then - echo "$host not responding to NTP" - fi - done -done -) -# ) >> $logfile - -if [ -f $ntpqlog ]; then - rm $ntpqlog -fi diff --git a/usr.sbin/xntpd/scripts/ntp-restart b/usr.sbin/xntpd/scripts/ntp-restart deleted file mode 100755 index d2023f0b67b2..000000000000 --- a/usr.sbin/xntpd/scripts/ntp-restart +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# -# This script can be used to kill and restart the NTP daemon. Edit the -# /usr/local/bin/xntpd line to fit. -# -kill -INT `ps -ax | egrep "xntpd" | egrep -v "egrep" | sed 's/^\([ 0-9]*\) .*/\1'/` -sleep 10 -/usr/local/bin/xntpd -exit 0 diff --git a/usr.sbin/xntpd/scripts/stats/README b/usr.sbin/xntpd/scripts/stats/README deleted file mode 100644 index 680896342acb..000000000000 --- a/usr.sbin/xntpd/scripts/stats/README +++ /dev/null @@ -1,39 +0,0 @@ -Statistics processing scripts (README) - -This directory contains a number of scripts for use with the filegen -facility. Those files ending in .awk are for the Unix awk utility, while -those ending in .sh are for the csh utility. Normally, the summary.sh -script is called from a cron job once per day. This script processes the -daily loopstats, peerstats and clockstats files produced by the daemon, -updates the loop_summary, peer_summary and clock_summary archive files, -and deletes the daily files. - -In the case of the Austron 2201A GPS receiver, the clockstats file -contains a wealth of additional monitoring data. These data are summarized -and writted to the clock_summary file, then a series of special files are -constructed for later processing by the S utility. - -The summary.sh script invokes a number of awk scripts to actually produce -the data. This may result in multiple scans of the same input file. -The input file is deleted after processing. In fact, the shell scripts will -process all input files found of the correct type in chronological order, -deleting each one as it is scanned, except the current day file. - -The summary.sh script can produce input files for the S utility, if it -is found on the search path. This utility makes PostScript graphs of the -loopstats data for each day, as well as various statistics produced by -the Austorn 220aA GPS receiver. The S utility is automatically run -as a background job. Its control files have the .S extension. - -The psummary.awk script can be used to scan the peer_summary file and -construct an historical reprise of the daily summaries. - -The file formats are documented in the README.stats file and in the -scripts themselves. Further detail on the radio clock ASCII timecode -formats and related data are in the README.timecode file. - -David L. Mills -University of Delaware -mills@udel.edu -1 November 1993 -Revised 12 April 1994 diff --git a/usr.sbin/xntpd/scripts/stats/README.stats b/usr.sbin/xntpd/scripts/stats/README.stats deleted file mode 100644 index aa8e77fb1bbe..000000000000 --- a/usr.sbin/xntpd/scripts/stats/README.stats +++ /dev/null @@ -1,246 +0,0 @@ -Statistics file formats (README.stats) - -The xntp3 daemon can produce a variety of statistics files which are -useful for maintenance, evaluation and retrospective calibration -purposes. See the xntpd.8 man page for instructions on how to configure -this feature. Since these files can become rather large and cumbersome, -they are ordinarily reduced to summary form by running the summary.sh -shell script once per day, week or month, as appropriate. There are -three file collections presently defined: peerstats, loopstats and -clockstats, each of which is described in this note. - -peerstats - -The following data are collected in the peerstats files. The files are -reduced to summary data using the peer.sh shell script. See the peer.awk -script for further information. A line in the file is produced upon -reception of each valid update from a configured peer. - - 49236 30.756 140.173.96.1 9474 0.000603 0.37532 - - 49236 modified Julian day number - 30.756 time of day (s) past midnight UTC - 140.173.96.1 peer identifier (IP address or receiver identifier) - 9474 peer status word (hex) (see NTP specification) - 0.000603 offset (s) - 0.08929 delay (s) - 0.37532 dispersion (s) - -loopstats - -The following data are collected in the loopstats files. The files are -reduced to summary data using the loop.sh shell script. See the loop.awk -script for further information. A line in the file is produced at each -valid update of the local clock. - - 49236 11.897 -0.000004 -35.9384 0 - - 49236 modified Julian day number - 11.897 time of day (s) past midnight UTC - -0.000004 time offset (s) - -35.9384 frequency offset (ppm) - 0 phase-lock loop time constant - -clockstats - -The following data are collected in the clockstats files. The files are -reduced to summary data using the clock.sh shell script, which also -updates the ensemble, etf, itf and tdata data files as well. See the -clock.awk, ensemble.awk, etf.awk, itf.awk and tdta.awk scripts for -further information. A line in the file is produced at each valid update -received from a configured radio clock. Data are at present recorded for -several radios. The first part of each data line is similar for all -radios, e.g.: - - 49234 60517.826 127.127.4.1 93 247 16:48:21.814 - - 49234 modified Julian day number - 60517.826 time of day (s) past midnight UTC - 127.127.4.1 receiver identifier (Spectracom 8170/Netclock-2) - 93 247 16:48:21.814 timecode (format varies) - -In the case of the Austron GPS receiver, a good deal of additional -information is extracted from the radio, as described below. The formats -shown consist of one line with all the fields shown in order. The -timecode formats specific to each radio follow. See the file -README.timecodes for detailed information on the timecode formats used -by these radios. - -Spectracom 8170/Netclock-2 WWVB receiver - - 49234 60517.826 127.127.4.1 ?A93 247 16:48:21.814 - - The '?' and 'A' characters are present only when the receiver is - unsynchronized; otherwise, they are replaced by space ' ' characters. - -IRIG audio decoder - - 49234 60517.826 127.127.6.0 247 16:48:21? - - The '?' character is present only when the receiver is unsynchronized. - -Austron 2200A/2201A GPS receiver - - 49234 60580.843 127.127.10.1 93:247:16:49:24.814? - - The '?' character is present only when the receiver is unsynchronized. - -Depending on the installed options, the Austron 2200A/2201A recognizes a -number of special commands that report various data items. See the -refclock_as2201.c source module for a list of the commands used. These -data are collected only if the following line is included in the -configuration file ntp.conf: - - fudge 127.127.10.1 flag4 1 # enable extended statistics collection - -The format of each data line returned is summarized in the following -list. - -External time/frequency data (requires input buffer option IN) - -These data determine the deviations of external time/frequency inputs -relative to receiver oscillator time. The following data are typical -using an external cesium oscillator PPS and 5-MHz outputs. - - 49234 60580.843 127.127.10.1 93:247:16:49:24.814 ETF - - -85.9 time interval (ns) - -89.0 average time interval (ns) - 4.0 time interval sigma (ns) - +1.510E-11 time interval rate - -4.500E-11 deltaf/f - +1.592E-11 average deltaf/f - 5.297E-13 sigma deltaf/f - 500 number of samples - -Model and option identifiers - -These data show the receiver model number and option configuration. - - 49234 60708.848 127.127.10.1 93:247:16:51:32.817 ID;OPT;VER - - GPS 2201A model ident (must be "GPS 2200A" or "GPS 2201A") - TTY1 rs232 option present (required) - TC1 IRIG option present (optional) - LORAN LORAN assist option present (optional) - IN input buffer option present (optional) - OUT1 output buffer option present (required) - B.00 data processor software version ("B.00" or later) - B.00 signal processor software version ("B.00" or later) - 28-Apr-93 software version date ("28-Apr-93" or later) - -Internal time/frequency data - -These data determine the deviations of the receiver oscillator with -respect to satellite time. - - 49234 60564.846 127.127.10.1 93:247:16:49:08.816 ITF - - COCO current mode (must be "COCO") - 0 code coast mode (must be zero) - +6.6152E-08 code sigma (s) - -3.5053E-08 code delta t (s) - -4.0361E-11 deltat/t - -6.4746E-11 oscillator ageing rate - 500.00 loop time constant - 4.984072 electrical tuning (V) - -GPS/LORAN ensemble data (requires LORAN assist option LORAN) - -These data determine the deviations and weights to calculate ensemble -time from GPS and LORAN data. - - 49234 60596.852 127.127.10.1 93:247:16:49:40.812 LORAN ENSEMBLE - - +9.06E-08 GPS t (s) - +3.53E-08 GPS sigma (s) - .532 GPS weight - +3.71E-08 LORAN t (s) - +3.76E-08 LORAN sigma (s) - .468 LORAN weight - +6.56E-08 ensemble t - +6.94E-08 ensemble sigma (s) - -LORAN stationkeeping data (requires LORAN assist option LORAN) - -These data determine which stations of the LORAN chain are being -tracked, together with individual signal/noise ratios, deviations and -weights. - - 49234 60532.850 127.127.10.1 93:247:16:48:36.820 LORAN TDATA - - M station identifier; data follows - OK status (must be "OK" for tracking) - 0 cw flag - 0 sw flag - 1162.17 time of arrival - -4.6 snr (-30.0 if not "OK" status) - 1.67E-07 2-sample phase-time deviation - .507 weight (included only if "OK" status) - W AQ 0 0 3387.80 -31.0 station identifier and data - X OK 0 0 1740.27 -11.2 2.20E-07 .294 station identifier and data - Y OK 0 0 2180.71 -4.6 2.68E-07 .198 station identifier and data - Z CV 0 0 3392.94 -30.0 station identifier and data - -Oscillator status and environment - -These data determine the receiver oscillator type, mode, status and -environment. Nominal operating conditions are shown below. - - 49234 60628.847 127.127.10.1 93:247:16:50:12.817 OSC;ET;TEMP - - 1121 Software Control oscillator model and mode (must be - "Software Control") - Locked status (must be "Locked") - 4.979905 electrical tuning (V) - 44.81 oscillator cavity temperature - -Receiver position, status and offsets - -These data determine the receiver position and elevation, together with -programmable delay corrections for the antenna cable and receiver. - - 49234 60788.847 127.127.10.1 93:247:16:52:52.817 POS;PPS;PPSOFF - - +39:40:48.425 receiver latitude (N) - -075:45:02.392 receiver longitude (E) - +74.09 receiver elevation (m) - Stored position status (must be "Stored") - UTC PPS/PPM alignment (must be "UTC") - 0 receiver delay (ns) (should be zero for calibrated - receiver) - 200 cable delay (ns) - 0 user time bias (ns) (must be zero) - -Satellite tracking status - -These data determine how many satellites are being tracked. At the -present state of constellation development, there should be at least -three visible satellites in view. Much of the time the maximum of -seven are being tracked; rarely this number drops to two. - - 49234 60612.850 127.127.10.1 93:247:16:49:56.820 TRSTAT - - 24 T satellite prn and status (T = track, A = acquire) - 16 A 13 T 20 T 18 T 07 T 12 T list continued - -UTC leap-second information - -These data determine when the next leap second is to occur. The exact -method to use is obscure. - - 49234 60548.847 127.127.10.1 93:247:16:48:52.818 UTC - - -1.2107E-08 A0 term (s) - -1.2790E-13 A1 term (s) - +9.0000E+00 current leap seconds (s) - +2.0480E+05 time for leap seconds (s) - +2.0100E+02 week number for delta leap (weeks) - +1.9100E+02 week number for future leap (weeks) - +4.0000E+00 day number for future leap (days) - +9.0000E+00 future leap seconds (s) - -David L. Mills -University of Delaware -mills@udel.edu -23 October 1993 diff --git a/usr.sbin/xntpd/scripts/stats/README.timecodes b/usr.sbin/xntpd/scripts/stats/README.timecodes deleted file mode 100644 index 00b5ba54584f..000000000000 --- a/usr.sbin/xntpd/scripts/stats/README.timecodes +++ /dev/null @@ -1,149 +0,0 @@ -Radio Timecode Formats (README.timecodes) - -Following are examples of the serial timecode formats used by various -timecode receivers as given in the instruction manuals. These examples -are intended only for illustration and not as the basis of system -design. The following symbols are used to identify the timecode -character that begins a subfield. The values given after this symbol -represent the character offset from the beginning of the timecode string -as edited to remove control characters. - -C on-time character (start bit) -Y year of century -T time of day -D day of year or month/day -A alarm indicator (format specific) -Q quality indicator (format specific) -<LF> ASCII line feed (hex 0a) -<CR> ASCII carriage return (hex 0d) -<SP> ASCII space (hex 20) - -In order to promote uniform behavior in the various implementations, it -is useful to have a common interpretation of alarm conditions and signal -quality. When the alarm indicator it on, the receiver is not operating -correctly or has never synchronized to the broadcast signal. When the -alarm indicator is off and the quality indicator is on, the receiver has -synchronized to the broadcast signal, then lost the signal and is -coasting on its internal oscillator. - -In the following uppercase letters, punctuation marks and spaces <SP> -stand for themselves; lowercase letters stand for fields as described. -Special characters other than <LF>, <CR> and <SP> are preceded by ^. - -Spectracom 8170 and Netclock/2 WWV Synchonized Clock (format 0) - -"<CR><LF>i ddd hh:mm:ss TZ=zz<CR><LF>" - C A D T - - poll: ?; offsets: Y = none, D = 3, T = 7, A = 0, Q = none - i = synchronization flag (<SP> = in synch, ? = out synch) - ddd = day of year - hh:mm:ss = hours, minutes, seconds - zz = timezone offset (hours from UTC) - - Note: alarm condition is indicated by other than <SP> at A, which - occurs during initial synchronization and when received signal has - been lost for about ten hours - - example: " 216 15:36:43 TZ=0" - A D T - -Netclock/2 WWV Synchonized Clock (format 2) - -"<CR><LF>iqyy ddd hh:mm:ss.fff ld" - C AQY D T - - poll: ?; offsets: Y = 2, D = 5, T = 9, A = 0, Q = 1 - i = synchronization flag (<SP> = in synch, ? = out synch) - q = quality indicator (<SP> < 1ms, A < 10 ms, B < 100 ms, C < 500 - ms, D > 500 ms) - yy = year (as broadcast) - ddd = day of year - hh:mm:ss.fff = hours, minutes, seconds, milliseconds of day - l = leap-second warning (L indicates leap at end of month) - d = standard/daylight time indicator (<SP> standard, D daylight) - - Note: alarm condition is indicated by other than <SP> at A, which - occurs during initial synchronization and when received signal has - been lost for about ten hours; unlock condition is indicated by - other than <SP> at Q, with time since last lock indicated by the - letter code A < 13 min, B < 1.5 hr, C < 7 hr, D > 7 hr. - - example: " 92 216 15:36:43.640 D" - AQ D T - -TrueTime 468-DC Satellite Synchronized Clock (and other TrueTime -receivers) - -"<CR><LF><^A>ddd:hh:mm:ssq<CR>" - D T QC - - poll: none; offsets: Y = none, D = 0, T = 4, A = 12, Q = 12 - hh:mm:ss = hours, minutes, seconds - q = quality/alarm indicator (<SP> = locked, ? = alarm) - - Note: alarm condition is indicated by ? at A, which occurs during - initial synchronization and when received signal is lost for an - extended period; unlock condition is indicated by other than <SP> - at Q - - example: "216:15:36:43 " - D T Q - -Heath GC-1000 Most Accurate Clock (WWV/H) - -"<CR>hh:mm:ss.f dd/mm/yy<CR>" - C T A D - - poll: none; offsets: Y = none, D = 15, T = 0, A = 9, Q = none - hh:mm:ss = hours, minutes, seconds - f = deciseconds (? when out of spec) - dd/mm = day, month - yy = year of century (from DIPswitches) - - Note: 0?:??:??.? is displayed before synch is first established and - hh:mm:ss.? once synch is established and then lost again for about - a day. - - example: "15:36:43.6 04/08/91" - T A D Y - -PST/Traconex 1020 Time Source (WWV/H) (firmware revision V4.01) - -"frdzycchhSSFTttttuuxx<CR>" "ahh:mm:ss.fffs<CR>" "yy/dd/mm/ddd<CR>" - A Q T Y D - - poll: "QMQDQT"; offsets: Y = 0, D = 3 T = 1,, A = 11, Q = 13 - 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 = 1991) - 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 (1-5 = 2.5, 5, 10, 15, 20 MHz) - T = transmitter (C = WWV, H = WWVH) - tttt = time since last update (minutes) - uu = flush character (03 = ^C) - xx = 94 (unknown) (firmware revision X4.01.999 only) - - a = AM/PM indicator (A = AM, P = PM, <SP> - 24-hour format) - hh:mm:ss.fff = hours, minutes, seconds, milliseconds of day - s = daylight-saving indicator (<SP> standard, D daylight) - - yy = year of century (from DIPswitches) - dd/mm/ddd = day of month, month of year, day of year - - Note: The alarm condition is indicated by other than ? at A, which - occurs during initial synchronization and when received signal is - lost for an extended period. A receiver unlock condition is - indicated by other than "0000" in the tttt subfield at Q. - - example: "O3@055281824C00000394 91/08/04/216 15:36:43.640" - T Y D T - -David L. Mills -University of Delaware -mills@udel.edu -23 October 1993 diff --git a/usr.sbin/xntpd/scripts/stats/clock.awk b/usr.sbin/xntpd/scripts/stats/clock.awk deleted file mode 100644 index c9d1455b6fef..000000000000 --- a/usr.sbin/xntpd/scripts/stats/clock.awk +++ /dev/null @@ -1,341 +0,0 @@ -# awk program to scan clockstat files and report errors/statistics -# -# usage: awk -f check.awk clockstats -# -# This program works for Spectracom 8170/Netclock-2 receiver, Austron -# 2200A/2201A receiver and IRIG audio decoder. It is easily adapted to -# other receivers as required. See README.austron file for additional -# information on Austron receiver. -# -BEGIN { - etf_min = osc_vmin = osc_tmin = 1e9 - etf_max = osc_vmax = osc_tmax = -1e9 -} -# -# scan all records in file -# -{ - # - # select WWVB records - # see summary for decode - # - if (NF >= 4 && $3 == "127.127.4.1") { - if ($4 == "SIGNAL" || NF > 7) - printf "%s\n", $0 - else { - wwvb_count++ - if ($4 ~ /\?/) - wwvb_x++ - else if ($4 ~ /A/) - wwvb_a++ - else if ($4 ~ /B/) - wwvb_b++ - else if ($4 ~ /C/) - wwvb_c++ - else if ($4 ~ /D/) - wwvb_d++ - } - continue - } - # - # select IRIG records - # see summary for decode - # - if (NF >= 4 && $3 == "127.127.6.0") { - irig_count++ - if ($5 ~ /\?/) - irig_error++ - continue - } - # - # select LORAN ENSEMBLE records - # see summary for decode - # - else if (NF >= 13 && $6 == "ENSEMBLE") { - ensemble_count++ - if ($9 <= 0) - ensemble_badgps++ - else if ($12 <= 0) - ensemble_badloran++ - else { - if ($13 > 200e-9 || $13 < -200e-9) - ensemble_200++ - else if ($13 > 100e-9 || $13 < -100e-9) - ensemble_100++ - ensemble_mean += $13 - ensemble_rms += $13 * $13 - } - continue - } - # - # select LORAN TDATA records - # see summary for decode; note that signal quality log is simply - # copied to output - # - else if (NF >= 7 && $6 == "TDATA") { - tdata_count++ - for (i = 7; i < NF; i++) { - if ($i == "M" && $(i+1) == "OK") { - i += 5 - m += $i - tdata_m++ - } - else if ($i == "W" && $(i+1) == "OK") { - i += 5 - w += $i - tdata_w++ - } - else if ($i == "X" && $(i+1) == "OK") { - i += 5 - x += $i - tdata_x++ - } - else if ($i == "Y" && $(i+1) == "OK") { - i += 5 - y += $i - tdata_y++ - } - else if ($i == "Z" && $(i+1) == "OK") { - i += 5 - z += $i - tdata_z++ - } - } - continue - } - # - # select ITF records - # see summary for decode - # - else if (NF >= 13 && $5 == "ITF" && $12 >= 100) { - itf_count++ - if ($9 > 200e-9 || $9 < -200e-9) - itf_200++ - else if ($9 > 100e-9 || $9 < -100e-9) - itf_100++ - itf_mean += $9 - itf_rms += $9 * $9 - itf_var += $10 * $10 - continue - } - # - # select ETF records - # see summary for decode - # - else if (NF >= 13 && $5 == "ETF" && $13 >= 100) { - etf_count++ - if ($6 > etf_max) - etf_max = $6 - else if ($6 < etf_min) - etf_min = $6 - etf_mean += $6 - etf_rms += $6 * $6 - etf_var += $9 * $9 - continue - } - # - # select TRSTAT records - # see summary for decode - # - else if (NF >= 5 && $5 == "TRSTAT") { - trstat_count++ - j = 0 - for (i = 6; i <= NF; i++) - if ($i == "T") - j++ - trstat_sat[j]++ - continue - } - # - # select ID;OPT;VER records - # - # config GPS 2201A TTY1 TC1 LORAN IN OUT1 B.00 B.00 28-Apr-93 - # - # GPS 2201A receiver model - # TTY1 rs232 moduel - # TC1 IRIG module - # LORAN LORAN assist module - # IN input module - # OUT1 output module - # B.00 B.00 firmware revision - # 28-Apr-9 firmware date3 - # - else if (NF >= 5 && $5 == "ID;OPT;VER") { - id_count++ - id_temp = "" - for (i = 6; i <= NF; i++) - id_temp = id_temp " " $i - if (id_string != id_temp) - printf "config%s\n", id_temp - id_string = id_temp - continue - } - # - # select POS;PPS;PPSOFF records - # - # position +39:40:48.425 -075:45:02.392 +74.09 Stored UTC 0 200 0 - # - # +39:40:48.425 position north latitude - # -075:45:02.392 position east longitude - # +74.09 elevation (meters) - # Stored position is stored - # UTC time is relative to UTC - # 0 200 0 PPS offsets - # - else if (NF >= 5 && $5 == "POS;PPS;PPSOFF") { - pos_count++ - pos_temp = "" - for (i = 6; i <= NF; i++) - pos_temp = pos_temp " " $i - if (pos_string != pos_temp) - printf "position%s\n", pos_temp - pos_string = pos_temp - continue - } - # - # select OSC;ET;TEMP records - # - # loop 1121 Software Control Locked - # - # 1121 oscillator type - # Software Control loop is under software control - # Locked loop is locked - # - else if (NF >= 5 && $5 == "OSC;ET;TEMP") { - osc_count++ - osc_temp = $6 " " $7 " " $8 " " $9 - if (osc_status != osc_temp) - printf "loop %s\n", osc_temp - osc_status = osc_temp - if ($10 > osc_vmax) - osc_vmax = $10 - if ($10 < osc_vmin) - osc_vmin = $10 - if ($11 > osc_tmax) - osc_tmax = $11 - if ($11 < osc_tmin) - osc_tmin = $11 - continue - } - # - # select UTC records - # these ain't ready yet - # - else if (NF >= 5 && $5 == "UTC") { - utc_count++ - utc_temp = "" - for (i = 6; i <= NF; i++) - utc_temp = utc_temp " " $i - if (utc_string != utc_temp) -# printf "utc%s\n", utc_temp - utc_string = utc_temp - continue - } -} END { -# -# ensemble summary data -# -# ensemble record count -# badgps gps data unavailable -# badloran loran data unavailable -# rms ensemble rms error (ns) -# >200 ensemble error >200 ns -# >100 100 ns < ensemble error < 200 ns -# - if (ensemble_count > 0) { - ensemble_mean /= ensemble_count - ensemble_rms = sqrt(ensemble_rms / ensemble_count - ensemble_mean * ensemble_mean) * 1e9 - printf "ensemble %d, badgps %d, badloran %d, rms %.1f, >200 %d, >100 %d\n", ensemble_count, ensemble_badgps, ensemble_badloran, ensemble_rms, ensemble_200, ensemble_100 - } -# -# wwvb summary data -# -# wwvb record count -# ? unsynchronized -# >1 error > 1 ms -# >10 error > 10 ms -# >100 error > 100 ms -# >500 error > 500 ms -# - if (wwvb_count > 0) - printf "wwvb %d, ? %d, >1 %d, >10 %d, >100 %d, >500 %d\n", wwvb_count, wwvb_x, wwvb_a, wwvb_b, wwvb_c, wwvb_d -# -# irig summary data -# -# irig record count -# err error count -# - if (irig_count > 0) - printf "irig %d, err %d\n", irig_count, irig_error -# -# tdata summary data -# -# tdata record count -# m M master OK-count, mean level (dB) -# w W slave OK-count, mean level (dB) -# x X slave OK-count, mean level (dB) -# y Y slave OK-count, mean level (dB) -# z Z slave OK-count, mean level (dB) -# - if (tdata_count > 0 ) { - if (tdata_m > 0) - m /= tdata_count - if (tdata_x > 0) - w /= tdata_count - if (tdata_x > 0) - x /= tdata_count - if (tdata_y > 0) - y /= tdata_count - if (tdata_z > 0) - z /= tdata_count - printf "tdata %d, m %d %.1f, w %d %.1f, x %d %.1f, y %d %.1f, z %d %.1f\n", tdata_count, tdata_m, m, tdata_w, w, tdata_x, x, tdata_y, y, tdata_z, z - } -# -# itf summary data -# -# itf record count -# rms itf rms error (ns) -# >200 itf error > 200 ns -# >100 itf error > 100 ns -# var Allan variance -# - if (itf_count > 1) { - itf_mean /= itf_count - itf_rms = sqrt(itf_rms / itf_count - itf_mean * itf_mean) * 1e9 - itf_var = sqrt(itf_var / (2 * (itf_count - 1))) - printf "itf %d, rms %.1f, >200 %d, >100 %d, var %.2e\n", itf_count, itf_rms, itf_200, itf_100, itf_var - } -# -# etf summary data -# -# etf record count -# mean etf mean (ns) -# rms etf rms error (ns) -# max etf maximum (ns) -# min etf minimum (ns) -# var Allan variance -# - if (etf_count > 0) { - etf_mean /= etf_count - etf_rms = sqrt(etf_rms / etf_count - etf_mean * etf_mean) - etf_var = sqrt(etf_var / (2 * (etf_count - 1))) - printf "etf %d, mean %.1f, rms %.1f, max %d, min %d, var %.2e\n", etf_count, etf_mean, etf_rms, etf_max, etf_min, etf_var - } -# -# trstat summary data -# -# trstat record count -# sat histogram of tracked satellites (0 - 7) -# - if (trstat_count > 0) - printf "trstat %d, sat %d %d %d %d %d %d %d %d\n", trstat_count, trstat_sat[0], trstat_sat[1], trstat_sat[2], trstat_sat[2], trstat_sat[3], trstat_sat[4], trstat_sat[5], trstat_sat[6], trstat_sat[7] -# -# osc summary data -# -# osc record count -# control control midrange (V) +/- deviation (mV) -# temp oven temperature midrange +/- deviation (deg C) -# - if (osc_count > 0) - printf "osc %d, control %.3f+/-%.3f, temp %.1f+/-%.2f\n", osc_count, (osc_vmax + osc_vmin) / 2, (osc_vmax - osc_vmin) / 2 * 1e3, (osc_tmax + osc_tmin) / 2, (osc_tmax - osc_tmin) / 2 -} diff --git a/usr.sbin/xntpd/scripts/stats/clock.sh b/usr.sbin/xntpd/scripts/stats/clock.sh deleted file mode 100755 index 1866d556403d..000000000000 --- a/usr.sbin/xntpd/scripts/stats/clock.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/csh -# -# Script to summarize clockstats files -# -set x = `ls clockstats.*` -foreach dayfile ( $x ) - if ($dayfile == $x[$#x]) continue - echo " " - echo $dayfile - awk -f clock.awk $dayfile - awk -f itf.awk $dayfile >>itf - awk -f etf.awk $dayfile >>etf - awk -f ensemble.awk $dayfile >>ensemble - awk -f tdata.awk $dayfile >>tdata - rm -f $dayfile -end - diff --git a/usr.sbin/xntpd/scripts/stats/dupe.awk b/usr.sbin/xntpd/scripts/stats/dupe.awk deleted file mode 100644 index 317c2a4faf84..000000000000 --- a/usr.sbin/xntpd/scripts/stats/dupe.awk +++ /dev/null @@ -1,8 +0,0 @@ -# -# delete duplicate lines -# -{ - if (old != $0) - printf "%s\n", $0 - old = $0 -} diff --git a/usr.sbin/xntpd/scripts/stats/ensemble.S b/usr.sbin/xntpd/scripts/stats/ensemble.S deleted file mode 100644 index 32a4dbabb820..000000000000 --- a/usr.sbin/xntpd/scripts/stats/ensemble.S +++ /dev/null @@ -1,5 +0,0 @@ -ensemble <- scan(file1, list(day=0, sec=0, gps=0, gpsw=0, loran=0, loranw=0, ensemble=0, std=0)) -str <- paste("eps/", file1, ".eps", sep="") -postscript(str, , , , 5, pointsize=18) -par(mgp=c(1, 0, 0), tck = 0.03, mar = c(2, 2, 1, 1)) -plot(ensemble$sec, ensemble$ensemble, type="l", xlab=paste("MJD", ensemble$day, "Time (s)"), ylab="Ensemble Offset (ns)", ylim=c(-400, 400)) diff --git a/usr.sbin/xntpd/scripts/stats/ensemble.awk b/usr.sbin/xntpd/scripts/stats/ensemble.awk deleted file mode 100644 index 136b33da37cb..000000000000 --- a/usr.sbin/xntpd/scripts/stats/ensemble.awk +++ /dev/null @@ -1,17 +0,0 @@ -# program to produce loran ensemble statistics from clockstats files -# -# usage: awk -f ensemble.awk clockstats -# -# format of input record (time values in seconds) -# 49165 8.628 127.127.10.1 93:178:00:00:07.241 LORAN ENSEMBLE -# -6.43E-08 +5.02E-08 .091 +5.98E-08 +1.59E-08 .909 +4.85E-08 +3.52E-08 -# -# format of output record (time values in nanoseconds) -# MJD sec GPS wgt LORAN wgt avg sigma -# 49165 8.628 -64.3 0.091 59.8 0.909 48.5 35.2 -# -# select LORAN ENSEMBLE records with valid format and weights -{ - if (NF >= 14 && $6 == "ENSEMBLE" && $9 > 0 && $12 > 0) - printf "%5s %9.3f %7.1f %6.3f %7.1f %6.3f %7.1f %7.1f\n", $1, $2, $7*1e9, $9, $10*1e9, $12, $13*1e9, $14*1e9 -} diff --git a/usr.sbin/xntpd/scripts/stats/etf.S b/usr.sbin/xntpd/scripts/stats/etf.S deleted file mode 100644 index 9b9c68b937b5..000000000000 --- a/usr.sbin/xntpd/scripts/stats/etf.S +++ /dev/null @@ -1,15 +0,0 @@ -options(digits=4) -file2 <- "etf_summary" -etf <- scan(file1, list(day=0, sec=0, offset=0, stab=0)) -r <- lsfit(etf$sec, etf$offset) -count<-length(etf$sec) -mean<-r$coef[[1]] -std<-sqrt(var(r$residuals)) -slope<-r$coef[[2]] * 1000 -cat("\n", file=file2 , append=TRUE, fill=FALSE, sep="") -cat(file1, "\n", file=file2, append=TRUE, fill=FALSE, sep="") -cat("etf1 ", count, ", T ", mean, " ns, R ", slope, " ps/s, std ", std, " us\n", file=file2, append=TRUE, fill=FALSE, sep="") -str <- paste("eps/", file1, ".eps", sep="") -postscript(str, , , , 5, pointsize=18) -par(mgp=c(1, 0, 0), tck=0.03, mar=c(2, 2, 1, 1)) -plot(etf$sec, etf$offset, type="l", xlab=paste("MJD", etf$day, "Time (s)"), ylab="External Offset (ns)", ylim=c(-400, 400)) diff --git a/usr.sbin/xntpd/scripts/stats/etf.awk b/usr.sbin/xntpd/scripts/stats/etf.awk deleted file mode 100644 index 8e6e334c1e01..000000000000 --- a/usr.sbin/xntpd/scripts/stats/etf.awk +++ /dev/null @@ -1,19 +0,0 @@ -# program to produce external time/frequence statistics from clockstats files -# -# usage: awk -f etf.awk clockstats -# -# format of input record -# 49165 40.473 127.127.10.1 93:178:00:00:39.238 ETF -# +175.0 +176.8 2.0 +3.729E-11 +1.000E-10 +3.511E-11 4.005E-13 500 -# -# format of output record (time values in nanoseconds) -# MJD sec time freq -# 49165 40.473 175.0 3.729e-11 -# -# select ETF records with valid format -{ - if (NF >= 9 && $5 == "ETF") { - printf "%5s %9.3f %7.1f %10.3e\n", $1, $2, $6, $9 - } -} - diff --git a/usr.sbin/xntpd/scripts/stats/itf.S b/usr.sbin/xntpd/scripts/stats/itf.S deleted file mode 100644 index 56c8c8d0cc7a..000000000000 --- a/usr.sbin/xntpd/scripts/stats/itf.S +++ /dev/null @@ -1,5 +0,0 @@ -itf <- scan(file1, list(day=0, sec=0, offset=0, stab=0)) -str <- paste("eps/", file1, ".eps", sep="") -postscript(str, , , , 5, pointsize=18) -par(mgp=c(1, 0, 0), tck=0.03, mar=c(2, 2, 1, 1)) -plot(itf$sec, itf$offset, type="l", xlab=paste("MJD", itf$day, "Time (s)"), ylab="Internal Offset (ns)", ylim=c(-400, 400)) diff --git a/usr.sbin/xntpd/scripts/stats/itf.awk b/usr.sbin/xntpd/scripts/stats/itf.awk deleted file mode 100644 index 2b21c5b9b97c..000000000000 --- a/usr.sbin/xntpd/scripts/stats/itf.awk +++ /dev/null @@ -1,19 +0,0 @@ -# program to produce intewrnal time/frequence statistics from clockstats files -# -# usage: awk -f itf.awk clockstats -# -# format of input record -# 49227 67.846 127.127.10.1 93:240:00:00:51.816 ITF -# COCO 0 +2.0579E-07 -3.1037E-08 -7.7723E-11 +6.5455E-10 500.00 4.962819 -# -# format of output record (time values in nanoseconds) -# MJD sec time freq -# 49227 67.846 +2.0579E-07 -7.7723E-11 -# -# select ITF records with valid format -{ - if (NF >= 10 && $5 == "ITF") { - printf "%5s %9.3f %7.1f %10.3e\n", $1, $2, $8 * 1e9, $10 - } -} - diff --git a/usr.sbin/xntpd/scripts/stats/loop.S b/usr.sbin/xntpd/scripts/stats/loop.S deleted file mode 100644 index 8e564b67eb67..000000000000 --- a/usr.sbin/xntpd/scripts/stats/loop.S +++ /dev/null @@ -1,7 +0,0 @@ -options(digits=4) -loop <- scan(file1, list(day=0, sec=0, offset=0, freq=0, tc=0)) -loop$offset <- loop$offset * 1e6 -str <- paste("eps/", file1, ".eps", sep="") -postscript(str, , , , 5, pointsize=18) -par(mgp=c(1, 0, 0), tck=0.03, mar=c(2, 2, 1, 1)) -plot(loop$sec, loop$offset, type="l", xlab=paste("MJD", loop$day, "Time (s)"), ylab="PLL Offset (us)", ylim=c(-400, 400)) diff --git a/usr.sbin/xntpd/scripts/stats/loop.awk b/usr.sbin/xntpd/scripts/stats/loop.awk deleted file mode 100644 index 470b27c8bef5..000000000000 --- a/usr.sbin/xntpd/scripts/stats/loop.awk +++ /dev/null @@ -1,41 +0,0 @@ -# awk program to scan loopstats files and report errors/statistics -# -# usage: awk -f loop.awk loopstats -# -# format of loopstats record -# MJD sec time (s) freq (ppm) tc -# 49235 3.943 0.000016 22.4716 0 -# -BEGIN { - loop_tmax = loop_fmax = -1e9 - loop_tmin = loop_fmin = 1e9 -} -# -# scan all records in file -# -{ - if (NF >= 5) { - loop_count++ - if ($3 > loop_tmax) - loop_tmax = $3 - if ($3 < loop_tmin) - loop_tmin = $3 - if ($4 > loop_fmax) - loop_fmax = $4 - if ($4 < loop_fmin) - loop_fmin = $4 - loop_time += $3 - loop_time_rms += $3 * $3 - loop_freq += $4 - loop_freq_rms += $4 * $4 - } -} END { - if (loop_count > 0) { - loop_time /= loop_count - loop_time_rms = sqrt(loop_time_rms / loop_count - loop_time * loop_time) - loop_freq /= loop_count - loop_freq_rms = sqrt(loop_freq_rms / loop_count - loop_freq * loop_freq) - printf "loop %d, %.0f+/-%.1f, rms %.1f, freq %.2f+/-%0.3f, var %.3f\n", loop_count, (loop_tmax + loop_tmin) / 2 * 1e6, (loop_tmax - loop_tmin) / 2 * 1e6, loop_time_rms * 1e6, (loop_fmax + loop_fmin) / 2, (loop_fmax - loop_fmin) / 2, loop_freq_rms - } -} - diff --git a/usr.sbin/xntpd/scripts/stats/loop.sh b/usr.sbin/xntpd/scripts/stats/loop.sh deleted file mode 100755 index 619eeb8c66af..000000000000 --- a/usr.sbin/xntpd/scripts/stats/loop.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/csh -# -# Script to summarize loopstats files -# -set x = `ls loopstats.*` -foreach dayfile ( $x ) - if ($dayfile == $x[$#x]) continue - echo " " - echo $dayfile - awk -f loop.awk $dayfile - rm -f $dayfile -end - diff --git a/usr.sbin/xntpd/scripts/stats/peer.awk b/usr.sbin/xntpd/scripts/stats/peer.awk deleted file mode 100644 index 4cb48cddb68e..000000000000 --- a/usr.sbin/xntpd/scripts/stats/peer.awk +++ /dev/null @@ -1,57 +0,0 @@ -# awk program to scan peerstats files and report errors/statistics -# -# usage: awk -f peer.awk peerstats -# -# format of peerstats record -# MJD sec ident stat offset (s) delay (s) disp (s) -# 49235 11.632 128.4.2.7 f414 -0.000041 0.21910 0.00084 -# -BEGIN { - n = 0 - MAXDISTANCE = 1.0 -} -# -# scan all records in file -# -{ - if (NF >= 7 && ($7 + $6 / 2) < MAXDISTANCE) { - i = n - for (j = 0; j < n; j++) { - if ($3 == peer_ident[j]) - i = j - } - if (i == n) { - peer_ident[i] = $3 - peer_tmax[i] = peer_dist[i] = -1e9 - peer_tmin[i] = 1e9 - n++ - } - peer_count[i]++ - if ($5 > peer_tmax[i]) - peer_tmax[i] = $5 - if ($5 < peer_tmin[i]) - peer_tmin[i] = $5 - dist = $7 + $6 / 2 - if (dist > peer_dist[i]) - peer_dist[i] = dist - peer_time[i] += $5 - peer_time_rms[i] += $5 * $5 - peer_delay[i] += $6 - peer_disp[i] += $7 - } -} END { - printf " ident cnt mean rms max delay dist disp\n" - printf "==========================================================================\n" - for (i = 0; i < n; i++) { - peer_time[i] /= peer_count[i] - peer_time_rms[i] = sqrt(peer_time_rms[i] / peer_count[i] - peer_time[i] * peer_time[i]) - peer_delay[i] /= peer_count[i] - peer_disp[i] /= peer_count[i] - peer_tmax[i] = peer_tmax[i] - peer_time[i] - peer_tmin[i] = peer_time[i] - peer_tmin[i] - if (peer_tmin[i] > peer_tmax[i]) - peer_tmax[i] = peer_tmin[i] - printf "%15s%5d%9.3f%9.3f%9.3f%9.3f%9.3f%9.3f\n", peer_ident[i], peer_count[i], peer_time[i] * 1e3, peer_time_rms[i] * 1e3, peer_tmax[i] * 1e3, peer_delay[i] * 1e3, peer_dist[i] * 1e3, peer_disp[i] * 1e3 - } -} - diff --git a/usr.sbin/xntpd/scripts/stats/peer.sh b/usr.sbin/xntpd/scripts/stats/peer.sh deleted file mode 100755 index b5d8d29186db..000000000000 --- a/usr.sbin/xntpd/scripts/stats/peer.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/csh -# -# Script to summarize peerstats files -# -set x = `ls peerstats.*` -foreach dayfile ( $x ) - if ($dayfile == $x[$#x]) continue - echo " " - echo $dayfile - awk -f peer.awk $dayfile - rm -f $dayfile -end - diff --git a/usr.sbin/xntpd/scripts/stats/psummary.awk b/usr.sbin/xntpd/scripts/stats/psummary.awk deleted file mode 100644 index 5ef8d8eb5280..000000000000 --- a/usr.sbin/xntpd/scripts/stats/psummary.awk +++ /dev/null @@ -1,43 +0,0 @@ -# program to scan peer_summary file and produce summary of daily summaries -# -# usage: awk -f psummary.awk peer_summary -# -{ - if (NF < 8 || $1 == "ident") - continue - i = n - for (j = 0; j < n; j++) { - if ($1 == peer_ident[j]) - i = j - } - if (i == n) { - peer_ident[i] = $1 - n++ - } - peer_count[i]++ - if (($7 - $6 / 2) < 400) { - peer_count[i]++ - peer_mean[i] += $3 - peer_var[i] += $4 * $4 - if ($5 > peer_max[i]) - peer_max[i] = $5 - if ($5 > 1) - peer_1[i]++ - if ($5 > 5) - peer_2[i]++ - if ($5 > 10) - peer_3[i]++ - if ($5 > 50) - peer_4[i]++ - } -} END { - printf " host cnt mean rms max >1 >5 >10 >50\n" - printf "=================================================================\n" - for (i = 0; i < n; i++) { - if (peer_count[i] <= 0) - continue - peer_mean[i] /= peer_count[i] - peer_var[i] = sqrt(peer_var[i] / peer_count[i]) - printf "%15s%4d%10.3f%10.3f%10.3f%4d%4d%4d%4d\n", peer_ident[i], peer_count[i], peer_mean[i], peer_var[i], peer_max[i], peer_1[i], peer_2[i], peer_3[i], peer_4[i] - } -} diff --git a/usr.sbin/xntpd/scripts/stats/rms.awk b/usr.sbin/xntpd/scripts/stats/rms.awk deleted file mode 100644 index 34d612ab3582..000000000000 --- a/usr.sbin/xntpd/scripts/stats/rms.awk +++ /dev/null @@ -1,41 +0,0 @@ -# program to scan peer_summary file -# -{ - if (NF < 8 || $1 == "ident") - continue - i = n - for (j = 0; j < n; j++) { - if ($1 == peer_ident[j]) - i = j - } - if (i == n) { - peer_ident[i] = $1 - n++ - } - peer_count[i]++ - if (($7 - $6 / 2) < 400) { - peer_count[i]++ - peer_mean[i] += $3 - peer_var[i] += $4 * $4 - if ($5 > peer_max[i]) - peer_max[i] = $5 - if ($5 > 1) - peer_1[i]++ - if ($5 > 5) - peer_2[i]++ - if ($5 > 10) - peer_3[i]++ - if ($5 > 50) - peer_4[i]++ - } -} END { - printf " host cnt mean sd max >1 >5 >10 >50\n" - printf "=================================================================\n" - for (i = 0; i < n; i++) { - if (peer_count[i] <= 0) - continue - peer_mean[i] /= peer_count[i] - peer_var[i] = sqrt(peer_var[i] / peer_count[i]) - printf "%15s%4d%10.3f%10.3f%10.3f%4d%4d%4d%4d\n", peer_ident[i], peer_count[i], peer_mean[i], peer_var[i], peer_max[i], peer_1[i], peer_2[i], peer_3[i], peer_4[i] - } -} diff --git a/usr.sbin/xntpd/scripts/stats/summary.sh b/usr.sbin/xntpd/scripts/stats/summary.sh deleted file mode 100755 index 19b64a01fee1..000000000000 --- a/usr.sbin/xntpd/scripts/stats/summary.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/sh -# -# Script to summarize ipeerstats, loopstats and clockstats files -# -# This script can be run from a cron job once per day, week or month. It -# runs the file-specific summary script and appends the summary data to -# designated files. -# -DATE=`date +%Y%m%d` -SIN=S.in -SOUT=S.out -LOOP=loop_summary -PEER=peer_summary -CLOCK=clock_summary - -rm -f $SIN $SOUT -S=0 -if [ -f `which S | cut -f1 -d" "` ]; then - S=1 -fi -# -# Summarize loopstats files -# -for f in loopstats.????????; do - d=`echo $f | cut -f2 -d.` - if [ $DATE != $d ]; then - echo " " >>$LOOP - echo $f >>$LOOP - awk -f loop.awk $f >>$LOOP - if [ $S ]; then - echo "file1<-"\"${f}\" >>$SIN - echo "source("\""loop.S"\"")" >>$SIN - fi - rm -f $f - fi -done - -# -# Summarize peerstats files -# -for f in peerstats.????????; do - d=`echo $f | cut -f2 -d.` - if [ $DATE != $d ]; then - echo " " >>$PEER - echo $f >>$PEER - awk -f peer.awk $f >>$PEER - rm -f $f - fi -done - -# -# Summarize clockstats files -# -for f in clockstats.????????; do - d=`echo $f | cut -f2 -d.` - if [ $DATE != $d ]; then - echo " " >>$CLOCK - echo $f >>$CLOCK - awk -f clock.awk $f >>$CLOCK - if [ -f /dev/gps* ]; then - awk -f itf.awk $f >itf.$d - awk -f etf.awk $f >etf.$d - awk -f ensemble.awk $f >ensemble.$d - awk -f tdata.awk $f >tdata.$d - fi - rm -f $f - fi -done - -# -# Process clockstat files with S and generate PostScript plots -# -for f in itf etf ensemble tdata; do - for d in ${f}.????????; do - if [ -f $d ]; then - if [ $S ]; then - echo "file1<-"\"${d}\" >>$SIN - echo "source("\"${f}.S\"")" >>$SIN - echo "unix("\""rm ${d}"\"")" >>$SIN - else - rm -f $d - fi - fi - done -done -if [ -f $SIN ]; then - S BATCH $SIN $SOUT -fi diff --git a/usr.sbin/xntpd/scripts/stats/tdata.S b/usr.sbin/xntpd/scripts/stats/tdata.S deleted file mode 100644 index f360a248c06a..000000000000 --- a/usr.sbin/xntpd/scripts/stats/tdata.S +++ /dev/null @@ -1,5 +0,0 @@ -tdata <- scan(file1, list(day=0, sec=0, m=0, w=0, x=0, y=0, z=0)) -str <- paste("eps/", file1, ".eps", sep="") -postscript(str, , , , 5, pointsize=18) -par(mgp=c(1, 0, 0), tck=0.03, mar=c(2, 2, 1, 1)) -plot(tdata$sec, tdata$m, type="l", xlab=paste("MJD", tdata$day, "Time (s)"), ylab="LORAN-M SNR (dB)") diff --git a/usr.sbin/xntpd/scripts/stats/tdata.awk b/usr.sbin/xntpd/scripts/stats/tdata.awk deleted file mode 100644 index 04d7e6ad3242..000000000000 --- a/usr.sbin/xntpd/scripts/stats/tdata.awk +++ /dev/null @@ -1,45 +0,0 @@ -# program to produce loran tdata statistics from clockstats files -# -# usage: awk -f tdata.awk clockstats -# -# format of input record (missing replaced by -40.0) -# 49228 36.852 127.127.10.1 93:241:00:00:20.812 LORAN TDATA -# M OK 0 0 1169.14 -7.4 3.16E-07 .424 -# W CV 0 0 3329.30 -16.4 1.81E-06 -# X OK 0 0 1737.19 -10.5 3.44E-07 .358 -# Y OK 0 0 2182.07 -9.0 4.41E-07 .218 -# -# format of output record (signal values are in dB) -# MJD sec time M W X Y Z -# 49228 36.852 175.0 -7.4 -16.4 -10.5 -9.0 -# -# select LORAN TDATA records with valid format -{ - if (NF >= 7 && $6 == "TDATA") { - m = w = x = y = z = -40.0 - for (i = 7; i < NF - 5; i++) { - if ($i == "M" && $(i+1) == "OK") { - i += 5 - m = $i - } - else if ($i == "W" && $(i+1) == "OK") { - i += 5 - w = $i - } - else if ($i == "X" && $(i+1) == "OK") { - i += 5 - x = $i - } - else if ($i == "Y" && $(i+1) == "OK") { - i += 5 - y = $i - } - else if ($i == "Z" && $(i+1) == "OK") { - i += 5 - z = $i - } - } - printf "%5s %9.3f %6.1f %6.1f %6.1f %6.1f %6.1f\n", $1, $2, m, w, x, y, z - } -} - diff --git a/usr.sbin/xntpd/scripts/support/README b/usr.sbin/xntpd/scripts/support/README deleted file mode 100644 index 812965bd0955..000000000000 --- a/usr.sbin/xntpd/scripts/support/README +++ /dev/null @@ -1,73 +0,0 @@ -The bin and etc directories contain several scripts (sh and perl) that -should ease startup and configuration of NTP sites. - - bin/monl is a monitoring script that prints out new, current and - old customers of an NTP timeserver when monitoring is - in effect. - monl has following options: - -i <regexp> (regular expression matchin IP addres to be ignored - -d <directory> where the current state is kept (default /tmp) - -v debug output - -n do not translate IP addresses into hostnames - <host> host to be analyzed - - monl uses xntpdc for information gathering and is thus - limited to the NTP version xntpdc is compiled for. - - bin/mvstats moves compresses and removes statistics files (useful mainly - for reference servers - - etc/install creates the locally needed directories for NTP (if not residung in /etc) - - etc/rc starts up daemon with configuration file and key file - etc/cron cron called monitor statistic (uses bin/monl) - etc/crontab crontab prototype for reference time servers - etc/setup sh script sourced by the other scripts for variable setup - -YOU MUST EDIT THESE FILES TO REFLECT YOUR LOCAL SETUP ! - -READ THIS BEFORE USING THE STARTUP SCRIPTS - -The startupscript etc/rc has been written for Suns and HPs. They are not -guaranteed to work elsewhere. Following assumptions have been made: - - All NTP related files reside in ONE directory having following structure: - - bin/* - all executables (daemon, control, date, scripts) - etc/* - startup scripts and cron scripts - conf/* - NTP configuration files - -The variable NTPROOT (etc/rc, etc/install) must be edited to reflect -the NTP directory (e.g. /usr/local/NTP) - -NTP config files are located via Suns arch command and have the name -conf/`arch`.`arch -k`. -These are the default configurations (usually clients). If a file with the name -conf/`arch`.`arch -k`.`hostname` is present this file will be preferred (Reference host, -gateway). If the arch command is not available no-arch is used. The arch command -is usually a shell script which echoes a string unique the the current machine -architecture. - -The tickadj command has its own conf/tickconf file which is used to set host -specific tickadj values. The line with DEFAULT specifies the default tickadj -parameters, all other lines consists of <hostname> <hostid> -<tickadj parameters>. These lines need only be entered if the specified host -needs parameters different from the default parameters. - -Reference clock support is provided for DCF77. If you need to initialize -certain things for reference clock support (e.g. loading STREAMS modules), -you need to edit etc/rc. - -The current config files of Erlangen are included in the conf directory. -They are just for reference, but might help you a bit in setting up a -synchronisation network. - -The advantage of keeping all config files centralized is the easier -administration. - -We replicate the NTP directory via NFS and rdist. - -When you have set up the local config files (YOUR OWN!) you can call -<NTPROOT>/etc/rc for daemon startup. - -For more information: time@informatik.uni-erlangen.de diff --git a/usr.sbin/xntpd/scripts/support/bin/monl b/usr.sbin/xntpd/scripts/support/bin/monl deleted file mode 100755 index f0c48dbf5f3f..000000000000 --- a/usr.sbin/xntpd/scripts/support/bin/monl +++ /dev/null @@ -1,213 +0,0 @@ -#!/local/bin/perl - -%service = ( 0, "unspec", - 1, "Active", - 2, "Passive", - 3, "Client", - 4, "Server", - 5, "Broadcast", - 6, "Control", - 7, "Private" ); -%nc = (); -@ignpat = (); -$noname = 0; -$verbose = 0; -$retries = 5; -$lastkey = 0; - -sub timedelta { - local($tm, $days, $h, $m, $s); - - $tm = @_[$[]; - $days = 0; - $days = sprintf("%dd+", $days) if $days = int($tm / (60*60*24)); - $days = "" unless $days; - $tm = $tm % (60*60*24); - $h = int($tm / (60*60)); - $tm = $tm % (60*60); - $m = int($tm / 60); - $s = $tm % 60; - - return sprintf("%s%02d:%02d:%02d", $days, $h, $m, $s); -} - -sub listentry { - local($host, $mode) = split("$;" , @_[$[]); - local($count, $version, $firsttime) = split("$;" , $_[$[+1]); - local($name); - - if (grep($host =~ m/$_/, @ignpat)) - { - print "ignored $host ...\n" if $verbose; - return; - } - - return if ! $count; - - if (defined($nc{$host})) - { - $name = $nc{$host}; - } - else - { - if ($noname) - { - $nc{$host} = $name = $host; - } - else - { - $name = (gethostbyaddr(pack("C4", split(/\./, $host)), 2))[$[]; - $nc{$host} = $name = $host if ! defined($name); - } - } - - printf ($fmt, ($lastkey eq $host) ? "" : $name, $service{$mode}, $count, $version, &timedelta($firsttime), $firsttime / $count); - - if (@_[$[+2]) - { - $hostcnt++ if $lastkey ne $host; - $packcnt += $count; - $maxtime = $firsttime if $firsttime > $maxtime; - } - - $lastkey = $host; -} - -while ($ARGV[$[] =~ /^-[nvid]$/) - { - if ($ARGV[$[] eq "-i") - { - shift; - push(@ignpat, shift) unless ! defined($ARGV[$[]); - } - elsif ($ARGV[$[] eq "-d") - { - shift; - $dir = shift unless ! defined($ARGV[$[]); - } - elsif ($ARGV[$[] eq "-n") - { - shift; - $noname = 1; - } - elsif ($ARGV[$[] eq "-v") - { - shift; - $verbose = 1; - } - } - -$dir = "/tmp" unless defined($dir); -$gone = 60*60*48; -$fmt = "%48s %10s %7d %7d %13s %14.3f\n"; -$sfmt = "%48s %10s %7s %7s %13s %14s\n"; -@lbl = ("Host", "Mode", "Count", "Version", "Time active", "Packetinterval"); - -if (!defined($ARGV[$[])) - { - $hostname = `hostname`; - chop($hostname); - unshift(@ARGV, $hostname); - } - -foreach $hostname (@ARGV) - { - $dbmfile = $dir . "/monlstats-" . $hostname; - $monl = "xntpdc -c 'hostnames no' -c monl $hostname | tail +3 |"; - $hostcnt = 0; - $packcnt = 0; - $maxtime = 0; - %Seen = (); - %New = (); - %Old = (); - - print "Monitor Status of $hostname\n\n"; - - $cnt = $retries; - do - { - open(MONL, $monl) || die("$monl failed $!"); - @monlout = <MONL>; - close(MONL); - } while (! @monlout && $cnt--); - - if (! @monlout) - { - print "not available.\n"; - next; - } - - dbmopen(Clients, $dbmfile, 0644) || die("dbmopen(.., $dbmfile, ...): $!"); - - foreach (@monlout) - { - chop; - split; - ($host, $count, $mode, $version, $lasttime, $firsttime) = - (@_[$[, $[+2 .. $[+4, $#_-1,$#_]); - - $Seen{$host, $mode} = 1; - - if (!defined($Clients{$host, $mode})) - { - if ($lasttime <= $gone) - { - ## got a new one - $Clients{$host, $mode} = $New{$host, $mode} = join("$;", $count, $version, $firsttime, $lasttime); - } - } - else - { - ## throw out the old ones - if ($lasttime > $gone) - { - $Old{$host, $mode} = $Clients{$host, $mode}; - delete $Clients{$host, $mode}; - } - else - { - $Clients{$host, $mode} = join("$;", $count, $version, $firsttime, $lasttime); - } - } - } - - grep(($Seen{$_} || ($Old{$_} = delete $Clients{$_})), keys(%Clients)); - - if (grep(($tmp = $_ , !grep($tmp =~ m/$_/, @ignpat)), keys(%New))) - { - print "New customers\n"; - print "-------------\n"; - printf $sfmt, @lbl; - grep( &listentry($_, $New{$_}, 1), sort(keys(%New)) ); - print "\n"; - } - - - if (grep((!defined($New{$_}) && ($tmp = $_, !grep($tmp =~ m/$_/, @ignpat))), keys(%Clients))) - { - print "Current customers\n"; - print "-----------------\n"; - printf $sfmt, @lbl; - grep( defined($New{$_}) || &listentry($_, $Clients{$_}, 1) , sort(keys(%Clients)) ); - print "\n"; - } - - if (grep(($tmp = $_, !grep($tmp =~ m/$_/, @ignpat)), keys(%Old))) - { - print "Discarded customers\n"; - print "-------------------\n"; - printf $sfmt, @lbl; - grep( &listentry($_, $Old{$_}, 0) , sort(keys(%Old)) ); - print "\n"; - } - - dbmclose(Clients); - - print "\nSummary:\n"; - print "--------\n"; - printf("Elapsed time: %13s\n", &timedelta($maxtime)); - printf(" Hosts: %13d\n", $hostcnt); - printf(" Packets: %13d\n", $packcnt); - printf(" Rate: %13.2f\n", $packcnt / $maxtime) if $maxtime; - print "\n"; - } diff --git a/usr.sbin/xntpd/scripts/support/bin/mvstats b/usr.sbin/xntpd/scripts/support/bin/mvstats deleted file mode 100755 index e33dc792e805..000000000000 --- a/usr.sbin/xntpd/scripts/support/bin/mvstats +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh -# -# mvstats,v 3.1 1993/07/06 01:10:24 jbj Exp -# -# mvstats is called by cron for keeping the log files together -# usually only used on reference hosts -# -# Files reside in /var/NTP -# Files older than 2 days will be compressed, -# Files older than 64 days will be removed. -# -# mvstats,v -# Revision 3.1 1993/07/06 01:10:24 jbj -# XNTP release 3.1 -# -# -# Revision 1.1 1992/12/10 12:58:24 kardel -# Prerelease NTP V3 / DCF -# -# -cd /var/NTP -find . ! -name '*.Z' -mtime +2 -exec compress -f {} \; -find . -mtime +64 -exec rm -f {} \; diff --git a/usr.sbin/xntpd/scripts/support/conf/hp300.hp300 b/usr.sbin/xntpd/scripts/support/conf/hp300.hp300 deleted file mode 100644 index 7b1875842219..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/hp300.hp300 +++ /dev/null @@ -1,70 +0,0 @@ -# -# FAU NTP client configuration file -# -# hp300.hp300,v 3.1 1993/07/06 01:10:27 jbj Exp -# -# hp300.hp300,v -# Revision 3.1 1993/07/06 01:10:27 jbj -# XNTP release 3.1 -# -# -# Revision 1.1 1992/12/10 12:58:29 kardel -# Prerelease NTP V3 / DCF -# -# Revision 1.2 1992/09/24 06:10:46 kardel -# authdelay adjust -# -# Revision 1.1 1992/09/24 06:09:23 kardel -# Initial revision -# -# Revision 1.2 1992/01/14 14:01:35 kardel -# update for joined INF4/INF1 nets -# -# -# Local fall back clock -# -precision -7 -# -# Local clock -# -peer 127.127.1.13 -# -broadcastclient yes -# broadcastdelay must be figured out - -# -# peers - local synch setup -# -#server ntps1-0 version 3 -#server ntps1-1 version 2 -#server ntps2-0 version 3 -# -# files -# -driftfile /+private/local/NTP/xntp.drift -# -# authentication stuff -# -authdelay 0.000436 # hp300 -controlkey 1006 -requestkey 1007 -# -# restrictions -# -# provide cheap services to the world/ prevent modifications from there -# -restrict default notrust lowpriotrap nomodify -# -# hosts on the local networks are allowed unrestricted access -# -restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts -restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.31.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.40.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.60.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.54.0 mask 255.255.255.0 # allow local hosts -# -restrict 127.0.0.1 mask 255.255.255.255 # local config -restrict 127.127.0.0 mask 255.255.0.0 # local clocks diff --git a/usr.sbin/xntpd/scripts/support/conf/hp700.hp700 b/usr.sbin/xntpd/scripts/support/conf/hp700.hp700 deleted file mode 100644 index 911ff10a5005..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/hp700.hp700 +++ /dev/null @@ -1,67 +0,0 @@ -# -# FAU NTP client configuration file -# -# hp700.hp700,v 3.1 1993/07/06 01:10:29 jbj Exp -# -# hp700.hp700,v -# Revision 3.1 1993/07/06 01:10:29 jbj -# XNTP release 3.1 -# -# -# Revision 1.1 1992/12/10 12:58:31 kardel -# Prerelease NTP V3 / DCF -# -# Revision 1.1 1992/09/24 06:09:02 kardel -# Initial revision -# -# Revision 1.2 1992/01/14 14:01:35 kardel -# update for joined INF4/INF1 nets -# -# -# Local fall back clock -# -precision -7 -# -# Local clock -# -peer 127.127.1.13 -# -broadcastclient yes -# broadcastdelay must be figured out - -# -# peers - local synch setup -# -#server ntps1-0 version 3 -#server ntps1-1 version 2 -#server ntps2-0 version 3 -# -# files -# -driftfile /+private/local/NTP/xntp.drift -# -# authentication stuff -# -authdelay 0.000016 # hp700 -controlkey 1006 -requestkey 1007 -# -# restrictions -# -# provide cheap services to the world/ prevent modifications from there -# -restrict default notrust lowpriotrap nomodify -# -# hosts on the local networks are allowed unrestricted access -# -restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts -restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.31.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.40.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.60.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.54.0 mask 255.255.255.0 # allow local hosts -# -restrict 127.0.0.1 mask 255.255.255.255 # local config -restrict 127.127.0.0 mask 255.255.0.0 # local clocks diff --git a/usr.sbin/xntpd/scripts/support/conf/hp700.hp700.faui47 b/usr.sbin/xntpd/scripts/support/conf/hp700.hp700.faui47 deleted file mode 100644 index 80c72a6c2d6d..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/hp700.hp700.faui47 +++ /dev/null @@ -1,71 +0,0 @@ -# -# FAU NTP client configuration file -# -# hp700.hp700.faui47,v 3.1 1993/07/06 01:10:30 jbj Exp -# -# hp700.hp700.faui47,v -# Revision 3.1 1993/07/06 01:10:30 jbj -# XNTP release 3.1 -# -# -# Revision 1.1 1992/12/10 12:58:33 kardel -# Prerelease NTP V3 / DCF -# -# Revision 1.1 1992/09/24 14:53:10 kirschni -# Initial revision -# -# Revision 1.1 1992/09/24 06:09:02 kardel -# Initial revision -# -# Revision 1.2 1992/01/14 14:01:35 kardel -# update for joined INF4/INF1 nets -# -# -# Local fall back clock -# -precision -7 -# -# Local clock -# -peer 127.127.1.13 -# -broadcastclient yes -# broadcastdelay must be figured out -broadcast 131.188.54.255 - -# -# peers - local synch setup -# -#server ntps1-0 version 3 -#server ntps1-1 version 2 -#server ntps2-0 version 3 -# -# files -# -driftfile /+private/local/NTP/xntp.drift -# -# authentication stuff -# -authdelay 0.000016 # hp700 -controlkey 1006 -requestkey 1007 -# -# restrictions -# -# provide cheap services to the world/ prevent modifications from there -# -restrict default notrust lowpriotrap nomodify -# -# hosts on the local networks are allowed unrestricted access -# -restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts -restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.31.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.40.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.60.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.54.0 mask 255.255.255.0 # allow local hosts -# -restrict 127.0.0.1 mask 255.255.255.255 # local config -restrict 127.127.0.0 mask 255.255.0.0 # local clocks diff --git a/usr.sbin/xntpd/scripts/support/conf/hp800.hp800 b/usr.sbin/xntpd/scripts/support/conf/hp800.hp800 deleted file mode 100644 index 58f47062a6fd..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/hp800.hp800 +++ /dev/null @@ -1,70 +0,0 @@ -# -# FAU NTP client configuration file -# -# hp800.hp800,v 3.1 1993/07/06 01:10:31 jbj Exp -# -# hp800.hp800,v -# Revision 3.1 1993/07/06 01:10:31 jbj -# XNTP release 3.1 -# -# -# Revision 1.1 1992/12/10 12:58:35 kardel -# Prerelease NTP V3 / DCF -# -# Revision 1.2 1992/09/24 06:10:46 kardel -# authdelay adjust -# -# Revision 1.1 1992/09/24 06:09:23 kardel -# Initial revision -# -# Revision 1.2 1992/01/14 14:01:35 kardel -# update for joined INF4/INF1 nets -# -# -# Local fall back clock -# -precision -7 -# -# Local clock -# -peer 127.127.1.13 -# -broadcastclient yes -# broadcastdelay must be figured out - -# -# peers - local synch setup -# -#server ntps1-0 version 3 -#server ntps1-1 version 2 -#server ntps2-0 version 3 -# -# files -# -driftfile /+private/local/NTP/xntp.drift -# -# authentication stuff -# -authdelay 0.000088 # hp800 -controlkey 1006 -requestkey 1007 -# -# restrictions -# -# provide cheap services to the world/ prevent modifications from there -# -restrict default notrust lowpriotrap nomodify -# -# hosts on the local networks are allowed unrestricted access -# -restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts -restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.31.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.40.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.60.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.54.0 mask 255.255.255.0 # allow local hosts -# -restrict 127.0.0.1 mask 255.255.255.255 # local config -restrict 127.127.0.0 mask 255.255.0.0 # local clocks diff --git a/usr.sbin/xntpd/scripts/support/conf/ntp.conf b/usr.sbin/xntpd/scripts/support/conf/ntp.conf deleted file mode 100644 index 06f5482c431e..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/ntp.conf +++ /dev/null @@ -1,36 +0,0 @@ -# -# peers - local synch setup -# -#server ntps1-0 key 0 version 2 -#server ntps1-1 key 0 version 2 -#server ntps2-0 key 0 version 2 -#server ntps2-1 key 0 version 2 -broadcastclient yes -#broadcastdelay # use default, until we measure something -# -# files -# -driftfile /+private/local/NTP/xntp.drift -resolver /local/NTP/bin/xntpres -# -# authentication stuff -# -authdelay 0.000629 -requestkey 65634 -controlkey 65635 -# -# restrictions -# -# provide cheap services to the world/ prevent modifications from there -restrict default notrust lowpriotrap nopeer nomodify -# -# hosts on the local networks are allowed unrestricted access -# -restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts -# -restrict 127.127.0.0 mask 255.255.0.0 # allow refclocks -restrict 127.0.0.1 mask 255.255.255.255 # allow local config -# -restrict 131.188.0.0 mask 255.255.0.0 nomodify# allow local hosts diff --git a/usr.sbin/xntpd/scripts/support/conf/ntp.keys b/usr.sbin/xntpd/scripts/support/conf/ntp.keys deleted file mode 100644 index e69de29bb2d1..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/ntp.keys +++ /dev/null diff --git a/usr.sbin/xntpd/scripts/support/conf/ntp.keys.dumb b/usr.sbin/xntpd/scripts/support/conf/ntp.keys.dumb deleted file mode 100644 index e69de29bb2d1..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/ntp.keys.dumb +++ /dev/null diff --git a/usr.sbin/xntpd/scripts/support/conf/sun3.sun3 b/usr.sbin/xntpd/scripts/support/conf/sun3.sun3 deleted file mode 100644 index 06f5482c431e..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/sun3.sun3 +++ /dev/null @@ -1,36 +0,0 @@ -# -# peers - local synch setup -# -#server ntps1-0 key 0 version 2 -#server ntps1-1 key 0 version 2 -#server ntps2-0 key 0 version 2 -#server ntps2-1 key 0 version 2 -broadcastclient yes -#broadcastdelay # use default, until we measure something -# -# files -# -driftfile /+private/local/NTP/xntp.drift -resolver /local/NTP/bin/xntpres -# -# authentication stuff -# -authdelay 0.000629 -requestkey 65634 -controlkey 65635 -# -# restrictions -# -# provide cheap services to the world/ prevent modifications from there -restrict default notrust lowpriotrap nopeer nomodify -# -# hosts on the local networks are allowed unrestricted access -# -restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts -# -restrict 127.127.0.0 mask 255.255.0.0 # allow refclocks -restrict 127.0.0.1 mask 255.255.255.255 # allow local config -# -restrict 131.188.0.0 mask 255.255.0.0 nomodify# allow local hosts diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui01 b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui01 deleted file mode 100644 index 8927535ef80a..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui01 +++ /dev/null @@ -1,83 +0,0 @@ -# -# NTP v3 configuration file for faui01 -# -# sun4.sun4.faui01,v 3.1 1993/07/06 01:10:37 jbj Exp -# -# sun4.sun4.faui01,v -# Revision 3.1 1993/07/06 01:10:37 jbj -# XNTP release 3.1 -# -# -# Revision 1.1 1992/12/10 12:58:44 kardel -# Prerelease NTP V3 / DCF -# -# Revision 1.3 1992/10/15 10:56:01 kardel -# -60 has 0 broadcasts now -# -# Revision 1.2 1992/09/17 12:46:53 kardel -# CIP network broadcasts -# -# Revision 1.1 1992/06/09 13:40:44 kardel -# Initial revision -# -# - -# -# Local clock definitions -# -precision -14 # kernel fix - HIREZ timer - -# -# Local clock -# -peer 127.127.1.6 # Fall back stratum 6 - -# -# get time from local network - hope this is reasonably stable -# -broadcastclient yes - -# -# files / programs -# -driftfile /+private/local/NTP/xntp.drift - -# -# authentication stuff -# -authdelay 0.000076 -requestkey 1007 -controlkey 1006 - -# -# service -# -broadcast 131.188.54.255 key 0 version 3 -broadcast 131.188.60.0 key 0 version 3 -broadcast 131.188.61.0 version 3 # inf1-net.revue (still on 2) -broadcast 131.188.62.0 version 3 # inf4-net1.revue (still on 2) - -# -# Statistics -# -monitor yes -#statfile /var/NTP/statistics - -# -# restrictions -# -# provide cheap services to the world/ prevent modifications from there -restrict default notrust lowpriotrap nomodify - -# -# hosts on the local networks are allowed unrestricted access -# -restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts -restrict 131.188.1.0 mask 255.255.255.0 notrust # allow local hosts -# -restrict 127.127.0.0 mask 255.255.0.0 # local clocks -restrict 127.0.0.1 # localhost does it too -# -restrict 131.188.1.45 mask 255.255.255.255 # ntps1-0 -restrict 131.188.34.45 mask 255.255.255.255 # ntps1-0 -restrict 131.188.44.45 mask 255.255.255.255 # ntps1-0 diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui10 b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui10 deleted file mode 100644 index 3be93a920f9a..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui10 +++ /dev/null @@ -1,176 +0,0 @@ -# -# NTP v3 configuration file for faui45 -# -# sun4.sun4.faui10,v 3.1 1993/07/06 01:10:38 jbj Exp -# -# sun4.sun4.faui10,v -# Revision 3.1 1993/07/06 01:10:38 jbj -# XNTP release 3.1 -# -# -# Revision 1.2 1993/01/19 09:32:31 kardel -# Release 1993/01/19 DCF77/PPS -# -# Revision 1.1 1992/12/10 12:58:46 kardel -# Prerelease NTP V3 / DCF -# -# Revision 1.11 1992/10/28 07:38:09 kardel -# bear.zoo.bt.co.uk now also peer -# -# Revision 1.10 1992/09/17 12:56:22 kardel -# 61 and 62 have ZEROBROADCASTS -# -# Revision 1.9 1992/09/17 12:46:53 kardel -# CIP network broadcasts -# -# Revision 1.8 1992/08/14 21:51:04 kardel -# local clock is now preferred peer -# -# Revision 1.7 1992/07/19 14:19:26 kardel -# fixed broadcasts -# -# Revision 1.6 1992/07/17 17:12:43 kardel -# new statistics support -# -# Revision 1.5 1992/07/10 07:46:03 kardel -# added loopstats statistic file -# -# Revision 1.4 1992/06/26 07:30:32 kardel -# update for reference clock support -# -# Revision 1.3 1992/05/18 13:51:04 kardel -# precision fix -# -# Revision 1.2 1992/03/30 11:16:07 kardel -# ntps1-1 version 3 -# -# Revision 1.1 1992/01/14 12:30:21 kardel -# Initial revision -# -# - -# -# Local clock definitions -# -precision -18 # us resolution - -# DCF77 - 0 - REFERENCE CLOCK / Meinberg PZF 535/OCXO -# -# Supported clock types Base -# Meinberg DCF PZF535 TCXO 0 -# Meinberg DCF PZF535 OCXO 16 -# Meinberg DCF U/A 31 32 -# -# Option PPS support (CLOCKDEFS=-DDCF -DDCFPPS) -# PPS 128 -# -# The device to be used is added to the base (16 devices possible -# /dev/dcf77-0 - /dev/dcf77-15) -# -# If PPS support is to be used 128 has to be added to the base -# thus a DCF77 U/A 31 without PPS would be 127.127.8.32 (device 0 - /dev/dcf77-0) -# a DCF77 PZF535/TCXO with PPS would be 127.127.8.129 (device 1 - /dev/dcf77-1) -# a DCF77 PZF535/OCXO with PPS would be 127.127.8.146 (device 2 - /dev/dcf77-2) -# -peer 127.127.8.144 prefer # PZF 535/OCXO / PPS support -# -# We want to provide timed service too, thus (startup script magic) -# TIMED - -# -# Local clock -# -peer 127.127.1.6 # Fall back stratum 6 - -# -# peers - local synch setup -# -peer ntps1-0 key 0 version 3 -peer ntps2-0 key 0 version 3 - -# -# European servers -# -peer sunmanager.lrz-muenchen.de key 0 version 2 -peer rustime01.rus.uni-stuttgart.de version 2 -peer mailszrz.zrz.tu-berlin.de version 2 - -# -# UK servers -# -peer bear.zoo.bt.co.uk version 3 - -# US Servers -# -server truechimer.cso.uiuc.edu version 2 - -# -# files / programs -# -driftfile /+private/local/NTP/xntp.drift -resolver /local/NTP/bin/xntpres - -# -# authentication stuff -# -authdelay 0.000076 -requestkey 1007 -controlkey 1006 - -# -# service -# -broadcast 131.188.31.0 version 3 # inf1-net.revue -broadcast 131.188.34.0 version 3 # inf4-net1.revue -broadcast 131.188.44.0 version 3 # inf4-net2.revue -broadcast 131.188.1.255 version 3 # revue.revue -broadcast 131.188.54.255 key 0 version 3 -broadcast 131.188.60.255 key 0 version 3 -broadcast 131.188.61.0 key 0 version 3 -broadcast 131.188.62.0 key 0 version 3 - -# -# Statistics -# -monitor yes - -# -# file name prefix -# -statsdir /var/NTP/ -# -# <stat type> file <file name> type <modifier> enable|disable|link|nolink -filegen peerstats file peerstats type day link # generate <statsdir><file>.<YYYYMMDD> and link generic file name (without extension) -filegen loopstats file loopstats type day link -statistics peerstats loopstats # enable statistics - -# -# restrictions -# -# provide cheap services to the world/ prevent modifications from there -restrict default notrust lowpriotrap nomodify - -# -# hosts on the local networks are allowed unrestricted access -# -restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts -restrict 131.188.31.0 mask 255.255.255.0 notrust # allow local hosts -restrict 131.188.34.0 mask 255.255.255.0 notrust # allow local hosts -restrict 131.188.44.0 mask 255.255.255.0 notrust # allow local hosts -restrict 131.188.40.0 mask 255.255.255.0 notrust # allow local hosts -# -restrict 127.127.0.0 mask 255.255.0.0 # local clocks -restrict 127.0.0.1 # localhost does it too -# -restrict 131.188.1.45 mask 255.255.255.255 # ntps1-0 -restrict 131.188.34.45 mask 255.255.255.255 # ntps1-0 -restrict 131.188.44.45 mask 255.255.255.255 # ntps1-0 -restrict 131.188.30.1 mask 255.255.255.255 # ntps1-1 -# -# external trust -# -restrict 130.126.174.40 mask 255.255.255.255 nomodify # truechimer.cso.uiuc.edu -restrict 129.69.1.153 mask 255.255.255.255 nomodify # rustime01.rus.uni-stuttgart.de -restrict 129.187.10.32 mask 255.255.255.255 nomodify # sunmanager.lrz-muenchen.de -restrict 130.149.4.11 mask 255.255.255.255 nomodify # mailszrz.zrz.tu-berlin.de -restrict 132.146.40.28 mask 255.255.255.255 nomodify # bear.zoo.bt.co.uk diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui45 b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui45 deleted file mode 100644 index 57e77f274980..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui45 +++ /dev/null @@ -1,228 +0,0 @@ -# -# NTP v3 configuration file for faui45 -# -# sun4.sun4.faui45,v 3.1 1993/07/06 01:10:39 jbj Exp -# -# sun4.sun4.faui45,v -# Revision 3.1 1993/07/06 01:10:39 jbj -# XNTP release 3.1 -# -# -# Revision 1.2 1993/01/19 09:32:33 kardel -# Release 1993/01/19 DCF77/PPS -# -# Revision 1.1 1992/12/10 12:58:48 kardel -# Prerelease NTP V3 / DCF -# -# Revision 1.28 1992/10/28 07:38:09 kardel -# bear.zoo.bt.co.uk now also peer -# -# Revision 1.27 1992/09/17 12:56:22 kardel -# 61 and 62 have ZEROBROADCASTS -# -# Revision 1.26 1992/09/17 12:46:53 kardel -# CIP network broadcasts -# -# Revision 1.25 1992/09/04 12:48:44 kardel -# dcn1 -> churchy -# -# Revision 1.24 1992/08/14 21:42:20 kardel -# local clock is now preferred peer -# -# Revision 1.23 1992/07/17 17:11:51 kardel -# new statistics support -# -# Revision 1.22 1992/07/05 22:41:18 root -# using default module settings now -# -# Revision 1.21 1992/07/02 11:47:26 root -# loop statistics added -# -# Revision 1.20 1992/06/26 07:30:51 kardel -# corrected examples -# -# Revision 1.19 1992/06/18 16:56:05 kardel -# running timed too (startup script magic) -# -# Revision 1.18 1992/06/18 13:58:45 kardel -# precision adjusted (us resolution) -# clock definition explanation -# -# Revision 1.17 1992/06/13 12:49:35 root -# allowed ntps1-1 -# -# Revision 1.16 1992/06/07 11:44:41 kardel -# switch to PPS support for dcf77-0 -# -# Revision 1.15 1992/06/03 14:02:58 kardel -# new version (fausup notrust) -# -# Revision 1.14 1992/05/18 13:49:45 kardel -# first precision update due to kernel patch -# -# Revision 1.13 1992/05/18 13:48:36 kardel -# more updates -# -# Revision 1.12 1992/03/24 08:43:49 kardel -# now trusting netserv.rz.uni-karlsruhe.de -# -# Revision 1.11 1992/03/23 15:03:43 kardel -# sunmanager.lrz-muenchen.de is a peer -# -# Revision 1.10 1992/03/12 22:49:53 kardel -# well, got to switch fudge too -# -# Revision 1.9 1992/03/12 22:47:07 kardel -# adjust for next xntpv3 alpha release -# -# Revision 1.8 1992/02/07 11:07:35 kardel -# switched to Meinberg PZF 535/OCXO -# -# Revision 1.7 1992/01/21 15:11:38 kardel -# netserv & sunmanager must be configured server (botch on other side) -# -# Revision 1.6 1992/01/17 17:54:34 kardel -# added ntps2-0, ntps2-1 to unrestricted list -# -# Revision 1.5 1992/01/10 10:49:03 kardel -# Authentication correction -# -# Revision 1.4 1992/01/10 08:08:06 kardel -# peer apple.com added -# ntps1-1 added to restrictionlist -# -# Revision 1.3 1991/12/19 10:23:56 kardel -# peers on STRATUM 1 -# add mailszrz -# -# Revision 1.2 1991/12/19 09:57:29 kardel -# upgrade NTP V3 -# -# - -# -# Local clock definitions -# -precision -18 # us resolution - -# DCF77 - 0 - REFERENCE CLOCK / Meinberg PZF 535/OCXO -# -# Supported clock types Base -# Meinberg DCF PZF535 TCXO 0 -# Meinberg DCF PZF535 OCXO 16 -# Meinberg DCF U/A 31 32 -# -# Option PPS support (CLOCKDEFS=-DDCF -DDCFPPS) -# PPS 128 -# -# The device to be used is added to the base (16 devices possible -# /dev/dcf77-0 - /dev/dcf77-15) -# -# If PPS support is to be used 128 has to be added to the base -# thus a DCF77 U/A 31 without PPS would be 127.127.8.32 (device 0 - /dev/dcf77-0) -# a DCF77 PZF535/TCXO with PPS would be 127.127.8.129 (device 1 - /dev/dcf77-1) -# a DCF77 PZF535/OCXO with PPS would be 127.127.8.146 (device 2 - /dev/dcf77-2) -# -peer 127.127.8.144 prefer # PZF 535/OCXO / PPS support -# -# We want to provide timed service too, thus (startup script magic) -# TIMED - -# -# Local clock -# -peer 127.127.1.6 # Fall back stratum 6 - -# -# peers - local synch setup -# -peer ntps1-1 key 0 version 2 # to be upgrade to version 3 -peer ntps2-0 key 0 version 2 # to be upgrade to version 3 - -# -# European servers -# -peer sunmanager.lrz-muenchen.de key 0 version 2 -peer iis.ethz.ch version 3 -server netserv.rz.uni-karlsruhe.de version 2 # sorry configuration error on other side -peer rustime01.rus.uni-stuttgart.de version 2 -peer mailszrz.zrz.tu-berlin.de version 2 - -# -# UK servers -# -peer bear.zoo.bt.co.uk version 3 - -# -# US Servers -# -peer apple.com version 2 -server churchy.udel.edu key 0 version 3 - -# -# files / programs -# -driftfile /+private/local/NTP/xntp.drift -resolver /local/NTP/bin/xntpres - -# -# authentication stuff -# -authdelay 0.000076 -requestkey 1007 -controlkey 1006 - -# -# service -# -broadcast 131.188.1.255 key 0 version 2 # revue.revue (still on 2) -broadcast 131.188.34.0 key 0 version 2 # inf4-net1.revue (still on 2) -broadcast 131.188.44.0 key 0 version 2 # inf4-net2.revue (still on 2) -broadcast 131.188.54.255 key 0 version 3 -broadcast 131.188.60.255 key 0 version 3 -broadcast 131.188.61.0 key 0 version 3 -broadcast 131.188.62.0 key 0 version 3 - -# -# Statistics -# -monitor yes -# -# file name prefix -# -statsdir /var/NTP/ -# -# <stat type> file <file name> type <modifier> enable|disable|link|nolink -filegen peerstats file peerstats type day link # generate <statsdir><file>.<YYYYMMDD> and link generic file name (without extension) -filegen loopstats file loopstats type day link -statistics peerstats loopstats # enable statistics - -# -# restrictions -# -# provide cheap services to the world/ prevent modifications from there -restrict default notrust lowpriotrap nomodify - -# -# hosts on the local networks are allowed unrestricted access -# -restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts -restrict 131.188.34.0 mask 255.255.255.0 notrust # allow local hosts -restrict 131.188.44.0 mask 255.255.255.0 notrust # allow local hosts -# -restrict 127.127.0.0 mask 255.255.0.0 # local clocks -restrict 127.0.0.1 # localhost does it too -# -restrict 131.188.1.41 mask 255.255.255.255 # ntps1-1 -restrict 131.188.31.1 mask 255.255.255.255 # ntps2-0, ntps2-1 -# -# external trust -# -restrict 130.43.2.2 mask 255.255.255.255 nomodify # apple.com -restrict 129.132.2.60 mask 255.255.255.255 nomodify # iis.ethz.ch -restrict 128.4.1.5 mask 255.255.255.255 nomodify # churchy.udel.edu -restrict 129.13.64.5 mask 255.255.255.255 nomodify # netserv.rz.uni-karlsruhe.de -restrict 129.69.1.153 mask 255.255.255.255 nomodify # rustime01.rus.uni-stuttgart.de -restrict 129.187.10.32 mask 255.255.255.255 nomodify # sunmanager.lrz-muenchen.de -restrict 132.146.40.28 mask 255.255.255.255 nomodify # bear.zoo.bt.co.uk -restrict 130.149.4.11 mask 255.255.255.255 nomodify # mailszrz.zrz.tu-berlin.de diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4c b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4c deleted file mode 100644 index e1ff90259077..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4c +++ /dev/null @@ -1,63 +0,0 @@ -# -# FAU NTP client configuration file -# -# sun4.sun4c,v 3.1 1993/07/06 01:10:41 jbj Exp -# -# sun4.sun4c,v -# Revision 3.1 1993/07/06 01:10:41 jbj -# XNTP release 3.1 -# -# -# Revision 1.1 1992/12/10 12:58:50 kardel -# Prerelease NTP V3 / DCF -# -# Revision 1.2 1992/01/14 14:01:35 kardel -# update for joined INF4/INF1 nets -# -# -# Local fall back clock -# -precision -7 -# -# Local clock -# -peer 127.127.1.13 -# -broadcastclient yes -# broadcastdelay must be figured out - -# -# peers - local synch setup -# -#server ntps1-0 version 3 -#server ntps1-1 version 2 -#server ntps2-0 version 3 -# -# files -# -driftfile /+private/local/NTP/xntp.drift -resolver /local/NTP/bin/xntpres -# -# authentication stuff -# -authdelay 0.000144 # sun4c -controlkey 1006 -requestkey 1007 -# -# restrictions -# -# provide cheap services to the world/ prevent modifications from there -# -restrict default notrust lowpriotrap nomodify -# -# hosts on the local networks are allowed unrestricted access -# -restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts -restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.31.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.40.0 mask 255.255.255.0 # allow local hosts -# -restrict 127.0.0.1 mask 255.255.255.255 # local config -restrict 127.127.0.0 mask 255.255.0.0 # local clocks diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4c.Lucifer b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4c.Lucifer deleted file mode 100644 index 78d3ea887958..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4c.Lucifer +++ /dev/null @@ -1,174 +0,0 @@ -# -# NTP v3 configuration file for Lucifer -# -# sun4.sun4c.Lucifer,v 3.1 1993/07/06 01:10:42 jbj Exp -# -# sun4.sun4c.Lucifer,v -# Revision 3.1 1993/07/06 01:10:42 jbj -# XNTP release 3.1 -# -# -# Revision 1.2 1993/01/19 09:32:35 kardel -# Release 1993/01/19 DCF77/PPS -# -# Revision 1.1 1992/12/10 12:58:52 kardel -# Prerelease NTP V3 / DCF -# -# Revision 1.8 1992/10/28 07:38:09 kardel -# bear.zoo.bt.co.uk now also peer -# -# Revision 1.7 1992/09/17 12:56:22 kardel -# 61 and 62 have ZEROBROADCASTS -# -# Revision 1.6 1992/09/17 12:46:53 kardel -# CIP network broadcasts -# -# Revision 1.5 1992/08/14 21:52:02 kardel -# local clock is now preferred peer -# -# Revision 1.4 1992/07/17 17:15:06 kardel -# adedd new statistics support -# -# Revision 1.3 1992/07/12 16:50:16 kardel -# new peers, restrictions, statistics, no timed -# -# Revision 1.2 1992/07/10 07:01:44 kardel -# authdelay fixed -# -# Revision 1.1 1992/07/10 07:00:30 kardel -# Initial revision -# -# -# -# Local clock definitions -# -precision -18 # us resolution - -# DCF77 - 0 - REFERENCE CLOCK / Meinberg PZF 535/OCXO -# -# Supported clock types Base -# Meinberg DCF PZF535 TCXO 0 -# Meinberg DCF PZF535 OCXO 16 -# Meinberg DCF U/A 31 32 -# ELV DCF7000 48 - -# -# Option PPS support (CLOCKDEFS=-DDCF -DDCFPPS) -# PPS 128 -# -# The device to be used is added to the base (16 devices possible -# /dev/dcf77-0 - /dev/dcf77-15) -# -# If PPS support is to be used 128 has to be added to the base -# thus a DCF77 U/A 31 without PPS would be 127.127.8.32 (device 0 - /dev/dcf77-0) -# a DCF77 PZF535/TCXO with PPS would be 127.127.8.129 (device 1 - /dev/dcf77-1) -# a DCF77 PZF535/OCXO with PPS would be 127.127.8.146 (device 2 - /dev/dcf77-2) -# -peer 127.127.8.144 prefer # PZF 535/OCXO / PPS support -# - -# -# Local clock -# -peer 127.127.1.6 # Fall back stratum 6 - -# -# peers - local synch setup -# -peer ntps1-1 key 0 version 3 -peer ntps1-2 key 0 version 3 -peer ntps2-0 key 0 version 3 - -# -# UK servers -# -peer bear.zoo.bt.co.uk version 3 - -# -# European servers -# -peer sunmanager.lrz-muenchen.de key 0 version 2 -peer iis.ethz.ch version 3 -server netserv.rz.uni-karlsruhe.de version 2 # sorry configuration error on other side -peer rustime01.rus.uni-stuttgart.de version 2 -peer mailszrz.zrz.tu-berlin.de version 2 - -# -# US Servers -# -peer apple.com version 2 -server dcn1.udel.edu key 0 version 3 - -# -# files / programs -# -driftfile /+private/local/NTP/xntp.drift -resolver /local/NTP/bin/xntpres - -# -# authentication stuff -# -authdelay 0.000144 # sun4c -requestkey 1007 -controlkey 1006 - -# -# service -# -broadcast 131.188.1.255 key 0 version 3 # revue.revue (still on 2) -broadcast 131.188.34.0 key 0 version 3 # inf4-net1.revue (still on 2) -broadcast 131.188.44.0 key 0 version 3 # inf4-net2.revue (still on 2) -broadcast 131.188.54.255 key 0 version 3 -broadcast 131.188.60.255 key 0 version 3 -broadcast 131.188.61.0 key 0 version 3 -broadcast 131.188.62.0 key 0 version 3 - -# -# Statistics -# -monitor yes - -# -# file name prefix -# -statsdir /var/NTP/ -# -# <stat type> file <file name> type <modifier> enable|disable|link|nolink -filegen peerstats file peerstats type day link # generate <statsdir><file>.<YYYYMMDD> and link generic file name (without extension) -filegen loopstats file loopstats type day link -statistics peerstats loopstats # enable statistics - -# -# restrictions -# -# provide cheap services to the world/ prevent modifications from there -restrict default notrust lowpriotrap nomodify - -# -# hosts on the local networks are allowed unrestricted access -# -restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts -restrict 131.188.34.0 mask 255.255.255.0 notrust # allow local hosts -restrict 131.188.44.0 mask 255.255.255.0 notrust # allow local hosts -# -restrict 127.127.0.0 mask 255.255.0.0 # local clocks -restrict 127.0.0.1 # localhost does it too -# -restrict 131.188.1.45 mask 255.255.255.255 # ntps1-1 -restrict 131.188.34.45 mask 255.255.255.255 # ntps1-1 -restrict 131.188.44.45 mask 255.255.255.255 # ntps1-1 -restrict 131.188.1.31 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 -restrict 131.188.34.31 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 -restrict 131.188.44.31 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 -restrict 131.188.31.1 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 -# -# external trust -# -restrict 130.43.2.2 mask 255.255.255.255 nomodify # apple.com -restrict 129.132.2.60 mask 255.255.255.255 nomodify # iis.ethz.ch -restrict 128.4.0.1 mask 255.255.255.255 nomodify # dcn1.umd.edu -restrict 129.13.64.5 mask 255.255.255.255 nomodify # netserv.rz.uni-karlsruhe.de -restrict 129.69.1.153 mask 255.255.255.255 nomodify # rustime01.rus.uni-stuttgart.de -restrict 129.187.10.32 mask 255.255.255.255 nomodify # sunmanager.lrz-muenchen.de -restrict 132.146.40.28 mask 255.255.255.255 nomodify # bear.zoo.bt.co.uk -restrict 130.149.4.11 mask 255.255.255.255 nomodify # mailszrz.zrz.tu-berlin.de diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m deleted file mode 100644 index cf1e283cb1fd..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m +++ /dev/null @@ -1,69 +0,0 @@ -# -# FAU NTP client configuration file -# -# sun4.sun4m,v 3.1 1993/07/06 01:10:43 jbj Exp -# -# sun4.sun4m,v -# Revision 3.1 1993/07/06 01:10:43 jbj -# XNTP release 3.1 -# -# -# Revision 1.1 1992/12/10 12:58:55 kardel -# Prerelease NTP V3 / DCF -# -# Revision 1.2 1992/10/05 12:48:44 kardel -# sun4m authdelay -# -# Revision 1.1 1992/10/05 12:48:07 kardel -# Initial revision -# -# Revision 1.2 1992/01/14 14:01:35 kardel -# update for joined INF4/INF1 nets -# -# -# Local fall back clock -# -precision -7 -# -# Local clock -# -peer 127.127.1.13 -# -broadcastclient yes -# broadcastdelay must be figured out - -# -# peers - local synch setup -# -#server ntps1-0 version 3 -#server ntps1-1 version 2 -#server ntps2-0 version 3 -# -# files -# -driftfile /+private/local/NTP/xntp.drift -resolver /local/NTP/bin/xntpres -# -# authentication stuff -# -authdelay 0.000033 # sun4c -controlkey 1006 -requestkey 1007 -# -# restrictions -# -# provide cheap services to the world/ prevent modifications from there -# -restrict default notrust lowpriotrap nomodify -# -# hosts on the local networks are allowed unrestricted access -# -restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts -restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.31.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts -restrict 131.188.40.0 mask 255.255.255.0 # allow local hosts -# -restrict 127.0.0.1 mask 255.255.255.255 # local config -restrict 127.127.0.0 mask 255.255.0.0 # local clocks diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m.faui42 b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m.faui42 deleted file mode 100644 index acc919c85f2c..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m.faui42 +++ /dev/null @@ -1,152 +0,0 @@ -# -# NTP v3 configuration file for faui42 -# -# sun4.sun4m.faui42,v 3.1 1993/07/06 01:10:44 jbj Exp -# -# sun4.sun4m.faui42,v -# Revision 3.1 1993/07/06 01:10:44 jbj -# XNTP release 3.1 -# -# -# Revision 1.2 1993/01/19 09:32:36 kardel -# Release 1993/01/19 DCF77/PPS -# -# Revision 1.1 1992/12/10 12:58:57 kardel -# Prerelease NTP V3 / DCF -# -# Revision 1.6 1992/09/15 16:19:10 kardel -# preferrred peer -# -# Revision 1.5 1992/09/15 15:57:36 kardel -# Stratum 1 again (may the Patches be with us...) -# -# Revision 1.4 1992/06/30 08:52:38 kardel -# sun4m machine don't have a clock (SunOS4.1.2) -# soory - just Stratum 2 -# -# Revision 1.3 1992/06/18 13:58:45 kardel -# precision adjusted (us resolution) -# clock definition explanation -# -# Revision 1.2 1992/06/13 11:42:49 kardel -# restrictions changed -# -# Revision 1.1 1992/06/13 11:27:11 kardel -# Initial revision -# -# - -# -# Local clock definitions -# -precision -18 # us resolution - -# -# DCF77 - 0 - REFERENCE CLOCK / Meinberg PZF 535/OCXO -# -# Supported clock types Base -# Meinberg DCF PZF535 TCXO 0 -# Meinberg DCF PZF535 OCXO 16 -# Meinberg DCF U/A 31 32 -# -# Option PPS support (CLOCKDEFS=-DDCF -DDCFPPS) -# PPS 128 -# -# The device to be used is added to the base (16 devices possible -# /dev/dcf77-0 - /dev/dcf77-15) -# -# If PPS support is to be used 128 has to be added to the base -# thus a DCF77 U/A 31 without PPS would be 127.127.8.32 (device 0 - /dev/dcf77-0) -# a DCF77 PZF535/TCXO with PPS would be 127.127.8.129 (device 1 - /dev/dcf77-1) -# a DCF77 PZF535/OCXO with PPS would be 127.127.8.146 (device 2 - /dev/dcf77-2) -# -peer 127.127.8.144 prefer # PZF 535/OCXO / PPS support -# -# Local clock -# -peer 127.127.1.6 # Fall back stratum 6 - -# -# peers - local synch setup -# -peer ntps1-0 key 0 version 2 # to be upgrade to version 3 -peer ntps2-0 key 0 version 2 # to be upgrade to version 3 - -# -# European servers -# -peer sunmanager.lrz-muenchen.de key 0 version 2 -peer iis.ethz.ch version 3 -#server netserv.rz.uni-karlsruhe.de version 2 # sorry configuration error on other side -peer rustime01.rus.uni-stuttgart.de version 2 -#peer mailszrz.zrz.tu-berlin.de version 2 - -# -# US Servers -# -#peer apple.com version 2 -#server dcn1.udel.edu key 0 version 3 - -# -# files / programs -# -driftfile /+private/local/NTP/xntp.drift -resolver /local/NTP/bin/xntpres - -# -# authentication stuff -# -authdelay 0.000047 -requestkey 1007 -controlkey 1006 - -# -# service -# -broadcast 131.188.1.255 key 0 version 3 # revue.revue (still on 2) -broadcast 131.188.40.0 key 0 version 3 # inf4-net2.revue (still on 2) - -# -# Statistics -# -monitor yes - -# -# file name prefix -# -statsdir /var/NTP/ -# -# <stat type> file <file name> type <modifier> enable|disable|link|nolink -filegen peerstats file peerstats type day link # generate <statsdir><file>.<YYYYMMDD> and link generic file name (without extension) -filegen loopstats file loopstats type day link -statistics peerstats loopstats # enable statistics - -# -# restrictions -# -# provide cheap services to the world/ prevent modifications from there -restrict default notrust lowpriotrap nomodify - -# -# hosts on the local networks are allowed unrestricted access -# -restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts -restrict 131.188.40.0 mask 255.255.255.0 nomodify # allow local hosts -restrict 131.188.34.0 mask 255.255.255.0 nomodify # allow local hosts -restrict 131.188.44.0 mask 255.255.255.0 nomodify # allow local hosts -restrict 131.188.31.0 mask 255.255.255.0 nomodify # allow local hosts -restrict 131.188.1.0 mask 255.255.255.0 nomodify # allow local hosts -# -restrict 127.127.0.0 mask 255.255.0.0 # local clocks -restrict 127.0.0.1 # localhost does it too -# -# -# external trust -# -restrict 130.43.2.2 mask 255.255.255.255 nomodify # apple.com -restrict 129.132.2.60 mask 255.255.255.255 nomodify # iis.ethz.ch -restrict 128.4.0.1 mask 255.255.255.255 nomodify # dcn1.umd.edu -restrict 129.13.64.5 mask 255.255.255.255 nomodify # netserv.rz.uni-karlsruhe.de -restrict 129.69.1.153 mask 255.255.255.255 nomodify # rustime01.rus.uni-stuttgart.de -restrict 129.187.10.32 mask 255.255.255.255 nomodify # sunmanager.lrz-muenchen.de -restrict 130.149.4.11 mask 255.255.255.255 nomodify # mailszrz.zrz.tu-berlin.de diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m.faui45m b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m.faui45m deleted file mode 100644 index 2c75f67545f0..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m.faui45m +++ /dev/null @@ -1,165 +0,0 @@ -# -# NTP v3 configuration file for Lucifer -# -# sun4.sun4m.faui45m,v 3.1 1993/07/06 01:10:45 jbj Exp -# -# sun4.sun4m.faui45m,v -# Revision 3.1 1993/07/06 01:10:45 jbj -# XNTP release 3.1 -# -# -# Revision 1.2 1993/01/19 09:32:38 kardel -# Release 1993/01/19 DCF77/PPS -# -# Revision 1.1 1992/12/10 12:58:59 kardel -# Prerelease NTP V3 / DCF -# -# Revision 1.7 1992/09/17 12:56:22 kardel -# 61 and 62 have ZEROBROADCASTS -# -# Revision 1.6 1992/09/17 12:46:53 kardel -# CIP network broadcasts -# -# Revision 1.5 1992/08/14 21:52:02 kardel -# local clock is now preferred peer -# -# Revision 1.4 1992/07/17 17:15:06 kardel -# adedd new statistics support -# -# Revision 1.3 1992/07/12 16:50:16 kardel -# new peers, restrictions, statistics, no timed -# -# Revision 1.2 1992/07/10 07:01:44 kardel -# authdelay fixed -# -# Revision 1.1 1992/07/10 07:00:30 kardel -# Initial revision -# -# -# -# Local clock definitions -# -precision -18 # us resolution - -# DCF77 - 0 - REFERENCE CLOCK / Meinberg PZF 535/OCXO -# -# Supported clock types Base -# Meinberg DCF PZF535 TCXO 0 -# Meinberg DCF PZF535 OCXO 16 -# Meinberg DCF U/A 31 32 -# ELV DCF7000 48 - -# -# Option PPS support (CLOCKDEFS=-DDCF -DDCFPPS) -# PPS 128 -# -# The device to be used is added to the base (16 devices possible -# /dev/dcf77-0 - /dev/dcf77-15) -# -# If PPS support is to be used 128 has to be added to the base -# thus a DCF77 U/A 31 without PPS would be 127.127.8.32 (device 0 - /dev/dcf77-0) -# a DCF77 PZF535/TCXO with PPS would be 127.127.8.129 (device 1 - /dev/dcf77-1) -# a DCF77 PZF535/OCXO with PPS would be 127.127.8.146 (device 2 - /dev/dcf77-2) -# -peer 127.127.8.144 prefer # PZF 535/OCXO / PPS support -# - -# -# Local clock -# -peer 127.127.1.6 # Fall back stratum 6 - -# -# peers - local synch setup -# -peer ntps1-1 key 0 version 3 -peer ntps1-2 key 0 version 3 -peer ntps2-0 key 0 version 3 - -# -# European servers -# -peer sunmanager.lrz-muenchen.de key 0 version 2 -peer iis.ethz.ch version 3 -server netserv.rz.uni-karlsruhe.de version 2 # sorry configuration error on other side -peer rustime01.rus.uni-stuttgart.de version 2 -peer mailszrz.zrz.tu-berlin.de version 2 - -# -# US Servers -# -peer apple.com version 2 -server dcn1.udel.edu key 0 version 3 - -# -# files / programs -# -driftfile /+private/local/NTP/xntp.drift -resolver /local/NTP/bin/xntpres - -# -# authentication stuff -# -authdelay 0.000033 # sun4m -requestkey 1007 -controlkey 1006 - -# -# service -# -broadcast 131.188.1.255 key 0 version 3 # revue.revue (still on 2) -broadcast 131.188.34.0 key 0 version 3 # inf4-net1.revue (still on 2) -broadcast 131.188.44.0 key 0 version 3 # inf4-net2.revue (still on 2) -broadcast 131.188.54.255 key 0 version 3 -broadcast 131.188.60.255 key 0 version 3 -broadcast 131.188.61.0 key 0 version 3 -broadcast 131.188.62.0 key 0 version 3 - -# -# Statistics -# -monitor yes - -# -# file name prefix -# -statsdir /var/NTP/ -# -# <stat type> file <file name> type <modifier> enable|disable|link|nolink -filegen peerstats file peerstats type day link # generate <statsdir><file>.<YYYYMMDD> and link generic file name (without extension) -filegen loopstats file loopstats type day link -statistics peerstats loopstats # enable statistics - -# -# restrictions -# -# provide cheap services to the world/ prevent modifications from there -restrict default notrust lowpriotrap nomodify - -# -# hosts on the local networks are allowed unrestricted access -# -restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts -restrict 131.188.34.0 mask 255.255.255.0 notrust # allow local hosts -restrict 131.188.44.0 mask 255.255.255.0 notrust # allow local hosts -# -restrict 127.127.0.0 mask 255.255.0.0 # local clocks -restrict 127.0.0.1 # localhost does it too -# -restrict 131.188.1.45 mask 255.255.255.255 # ntps1-1 -restrict 131.188.34.45 mask 255.255.255.255 # ntps1-1 -restrict 131.188.44.45 mask 255.255.255.255 # ntps1-1 -restrict 131.188.1.31 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 -restrict 131.188.34.31 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 -restrict 131.188.44.31 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 -restrict 131.188.31.1 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 -# -# external trust -# -restrict 130.43.2.2 mask 255.255.255.255 nomodify # apple.com -restrict 129.132.2.60 mask 255.255.255.255 nomodify # iis.ethz.ch -restrict 128.4.0.1 mask 255.255.255.255 nomodify # dcn1.umd.edu -restrict 129.13.64.5 mask 255.255.255.255 nomodify # netserv.rz.uni-karlsruhe.de -restrict 129.69.1.153 mask 255.255.255.255 nomodify # rustime01.rus.uni-stuttgart.de -restrict 129.187.10.32 mask 255.255.255.255 nomodify # sunmanager.lrz-muenchen.de -restrict 130.149.4.11 mask 255.255.255.255 nomodify # mailszrz.zrz.tu-berlin.de diff --git a/usr.sbin/xntpd/scripts/support/conf/tickconf b/usr.sbin/xntpd/scripts/support/conf/tickconf deleted file mode 100644 index b17dbe834743..000000000000 --- a/usr.sbin/xntpd/scripts/support/conf/tickconf +++ /dev/null @@ -1,19 +0,0 @@ -DEFAULT -A -p -s -q -Lucifer 55406cfa -a 1 -p -s -q -t 10001 -faui45 24000f9b -a 1 -p -s -q -faui10 2440213c -a 1 -p -s -q -faui1b 54001418 -A -p -s -q -t 10001 -faui4p 5100344d -A -p -s -q -t 9999 -faui02g 1200be20 -A -p -s -q -t 9999 -faui02e 1200bbab -A -p -s -q -t 9999 -faui02f 1200bedb -A -p -s -q -t 9999 -faui03b 1200b92b -A -p -s -q -t 9999 -faui45m 726001ac -A -p -s -q -t 10001 -faui45o 72600272 -A -p -s -q -t 10001 -faui45p 7260028f -A -p -s -q -t 10001 -faui45r 72400cc7 -A -p -s -q -t 10001 -faui45s 726045be -A -p -s -q -t 10001 -faui45v 72604487 -A -p -s -q -t 10001 -faui45x 726044eb -A -p -s -q -t 10001 -faui45y 7260476d -A -p -s -q -t 10001 -faui45z 726045a1 -A -p -s -q -t 10001 diff --git a/usr.sbin/xntpd/scripts/support/etc/cron b/usr.sbin/xntpd/scripts/support/etc/cron deleted file mode 100755 index 07ed18949835..000000000000 --- a/usr.sbin/xntpd/scripts/support/etc/cron +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh -# -# cron,v 3.1 1993/07/06 01:10:50 jbj Exp -# -# called by cron for statistics gathering -# -# cron,v -# Revision 3.1 1993/07/06 01:10:50 jbj -# XNTP release 3.1 -# -# -# Revision 1.1 1992/12/10 12:59:18 kardel -# Prerelease NTP V3 / DCF -# -# -PATH="${PATH}:/local/NTP/bin" -export PATH -monl -d /local/NTP/monitor -i '127\.0\.0\.1' faui10 faui45 lucifer rackety.udel.edu diff --git a/usr.sbin/xntpd/scripts/support/etc/crontab b/usr.sbin/xntpd/scripts/support/etc/crontab deleted file mode 100644 index 2b2d19ced76c..000000000000 --- a/usr.sbin/xntpd/scripts/support/etc/crontab +++ /dev/null @@ -1,8 +0,0 @@ -# -# NTP statistics periodic cleanup - REFERENCE SERVER ONLY -# -#55 23 * * * sh /local/NTP/etc/mvstats -# -# gather NTP client statistics - REFERENCE SERVER ONLY -# -0 8,18 * * * /local/NTP/etc/cron 2>/dev/null | /usr/ucb/mail -s "NTP statistics" time@informatik.uni-erlangen.de diff --git a/usr.sbin/xntpd/scripts/support/etc/install b/usr.sbin/xntpd/scripts/support/etc/install deleted file mode 100755 index 169a7e5a06d7..000000000000 --- a/usr.sbin/xntpd/scripts/support/etc/install +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/sh -# -# install,v 3.1 1993/07/06 01:10:53 jbj Exp -# -# install,v -# Revision 3.1 1993/07/06 01:10:53 jbj -# XNTP release 3.1 -# -# -# Revision 1.1 1992/12/10 12:59:21 kardel -# Prerelease NTP V3 / DCF -# -# Revision 1.1 1992/06/18 14:50:08 kardel -# Initial revision -# -# -NTPROOT=/local/NTP # SITE SPECIFIC: where NTP resides -# -# where the local NTP state files reside (xntp.drift) ussualle /etc -# this directory must not be shared as machine dependent data ist stored there -# -NTPDIR="/+private/local/NTP" -# -# get the initial setup -# -if [ ! -r $NTPROOT/etc/setup ]; then - echo "ERROR: $NTPROOT/etc/setup missing - incorrect installation." - exit 1 -else - . $NTPROOT/etc/setup -fi - -umask 022 # SITE SPECIFIC: local policy - watch out for NFS and "root" rights - -Mkdir() { - p="" - IFS="/" - set -- $@ - IFS=' -' - for pnc do - if [ ! -d "$p/$pnc" ]; then - ECHO -n "creating directory $p/$pnc" - if mkdir "$p/$pnc"; then - ECHO "" - else - ECHO " - FAILED" - break; - fi - fi - p="$p/$pnc" - done -} - -if [ ! -d "$NTPDIR" ]; then - ECHO "installing NTP private data area ($NTPDIR)" - if Mkdir "$NTPDIR"; then - chmod 755 "$NTPDIR" - ECHO "$NTPDIR created." - fi -else - ECHO "NTP already installed." - if [ -f "$NTPDIR/xntp.drift" ]; then - ECHO "currently saved drift value:" `cat "$NTPDIR/xntp.drift"` - fi -fi - diff --git a/usr.sbin/xntpd/scripts/support/etc/rc b/usr.sbin/xntpd/scripts/support/etc/rc deleted file mode 100755 index ef8834a69f7b..000000000000 --- a/usr.sbin/xntpd/scripts/support/etc/rc +++ /dev/null @@ -1,198 +0,0 @@ -#!/bin/sh -# NTP time synchronisation -# -# /src/NTP/REPOSITORY/v3/supportscripts/etc/rc,v 1.11 1993/07/09 13:17:00 kardel Exp -# -# rc,v -# Revision 1.11 1993/07/09 13:17:00 kardel -# local NTPROOT -# -# Revision 1.10 1993/07/09 11:37:29 kardel -# Initial restructured version + GPS support -# -# Revision 1.9 1993/06/23 14:10:36 kardel -# June 21st reconcilation -# -# Revision 1.7 1993/06/02 12:04:43 kardel -# May 28th reconcilation & clenaup -# -# -# non reference clock hosts will try to do an ntpdate on NTPSERVERS -# -NTPSERVERS="ntps1-0 ntps1-1 ntps2-0 ntps2-1" -NTPROOT=/local/NTP - -# -# get the initial setup -# -if [ ! -r $NTPROOT/etc/setup ]; then - echo "ERROR: $NTPROOT/etc/setup missing - incorrect installation." - exit 1 -else - . $NTPROOT/etc/setup -fi - -umask 022 # SITE SPECIFIC: local policy - watch out for NFS and "root" rights - -msg="" -# -# default configuration files are named $NTPROOT/conf/<ARCH>.<KARCH> -# -CF=$NTPROOT/conf/$ARCH.$KARCH # default configuration file -# -# Host specific config file (reference clocks) have the hostname tagged on -# -CFH="$CF"."$HOSTNAME" # specific configuration file -# -# where to find the tickadj command -# -KFIX=$NTPROOT/bin/tickadj # kernel variable fix -# -# where to find special tickadj parameters -# -TC=$NTPROOT/conf/tickconf # special tickadj parameters -# -# where to find the keys file (if not found $KEY.dumb will be used) -# -KEY=$NTPROOT/conf/ntp.keys # private key file -# -# the daemon -# -XD=$NTPROOT/bin/xntpd # NTP daemon -# -# HP adjtimed -# -ADJTIMED=$NTPROOT/bin/adjtimed # HP special (adjtime() emulation) -# -# ntpdate command -# -NTPDATE=$NTPROOT/bin/ntpdate - -# -# secondary timed support -# The word "TIMED" must be in the config file for timed to start -# Note that this times is a special version which does not ever set or -# adjust the time. Ask time@informatik.uni-erlangen.de for patches -# -TIMED=$NTPROOT/bin/timed # timed (Berkeley) secondary time service - # here used in a *HARMLESS* version - # to provide time to "inferior" systems -# -# ISREFHOST is a command that returns exit status 0 for a reference host -# Site specific: sample for dcf77 is given -# -ISREFHOST="[ -f $NTPROOT/.karch.$KARCH/sys/OBJ/parsestreams.o -a -f /dev/refclock-0 ]" -# -# SETUP_REFCLOCK -# -# what to do in order to set up a local reference clock -# usually this will load a STREAMS module or initialize other things -# needed -# -SETUP_REFCLOCK() { - if modstat | grep -s 'PARSE'; then - ECHO "loadable PARSER STREAMS module already loaded." - else - ECHO "attempting to load PARSER STREAMS module..." - MDLFILE="/tmp/mdl.$$" - if modload $NTPROOT/.karch.$KARCH/sys/OBJ/parsestreams.o -o $MDLFILE 2>&1; then - modstat - else - echo WARNING: load FAILED - fi | LOG - rm -f $MDLFILE - unset MDLFILE - fi -} - -kargs() { - MATCH=NO - HOSTID="`(hostid) 2>/dev/null || echo 000000`" - if [ -r "$TC" ]; then - exec 0< "$TC" - while [ "$MATCH" != "YES" ] && read HOST ID PARAM; do - if [ "$HOST" = "DEFAULT" ]; then - DEFAULT="$ID $PARAM" - else - if [ "$ID" = "$HOSTID" -o "$HOST" = "$HOSTNAME" ]; then - echo "$PARAM" - MATCH=YES - fi - fi - done - if [ "$MATCH" != "YES" ]; then - if [ -z "$DEFAULT" ]; then - echo "-A -p -s -q"; - else - echo "$DEFAULT"; - fi - fi - else - echo "-A -p -s -q"; - fi -} - -if [ -x $XD ]; then - if [ -x "$ADJTIMED" ]; then - $ADJTIMED && ECHO "adjusttimesupport: adjtimed." - fi - # - # WARNING: check ps command first, or you might kill things you don't want to - # - PID="`(ps -efa 2>/dev/null || ps auxww 2>/dev/null || echo "") | grep xntp | grep -v grep | awk '{ print $2 }'`" - - if [ ! -z "$PID" ]; then - ECHO "killing old NTP daemon (PID=$PID)" - # - # enable this after checking for correctness - # kill $PID - ECHO "should do a kill $PID, if this is the right PID - check rc script" - fi - # - # try an ntpdate when timeservers are configured - # - if [ ! -z "$NTPSERVERS" -a -x $NTPDATE ]; then - ECHO "NTP initial time setting" - $NTPDATE -v $NTPSERVERS | LOG - fi - # - # look for reference clock equipment - # - if $ISREFHOST; then - ECHO "REFERENCE CLOCK SUPPORT (initializing...)" - SETUP_REFCLOCK - fi - - if [ -r "$CFH" ]; then - CF="$CFH" - else - if [ ! -r "$KEY" ]; then - KEY="$KEY.dumb" - fi - fi - - ECHO "NTP configuration file: $CF" - ECHO -n "time daemon startup:" - - if [ -r "$CF" ]; then - if [ -x "$KFIX" ]; then - KARGS="`kargs`" - if [ ! -z "$KARGS" ]; then - $KFIX $KARGS && ECHO -n "tickadj $KARGS" - fi - fi - $XD -c "$CF" -k "$KEY" && ECHO -n ' xntpd' - if [ -x "$TIMED" ] && grep -s TIMED "$CF"; then - $TIMED -M -N && ECHO -n ' timed' - fi - else - msg="configuration file ($CF) not present." - fi -else - msg="daemon binary ($XD) not present." -fi -ECHO "." - -if [ "$msg" ]; then - NLECHO "WARNING: NO NTP time sychronisation: $msg" -fi diff --git a/usr.sbin/xntpd/scripts/support/etc/setup b/usr.sbin/xntpd/scripts/support/etc/setup deleted file mode 100755 index d4ea75ecfaa9..000000000000 --- a/usr.sbin/xntpd/scripts/support/etc/setup +++ /dev/null @@ -1,72 +0,0 @@ -# -# setup,v 3.1 1993/07/06 01:10:55 jbj Exp -# -# /bin/sh sourced file for environment setup -# expects NTPROOT variable initialized -# -# if not set it will be initialized to /usr/local/NTP -# -# setup,v -# Revision 3.1 1993/07/06 01:10:55 jbj -# XNTP release 3.1 -# -# -# Revision 1.1 1992/12/10 12:59:25 kardel -# Prerelease NTP V3 / DCF -# -# Revision 1.1 1992/12/10 10:14:46 kardel -# Initial revision -# -# -NTPROOT=${NTPROOT-/usr/local/NTP} - -# -# we so use our own echos, as we somes want to substitute them with a -# file logging version durin the /etc/rc.local phase -# -set `type ECHO` - -PATH="${PATH}:$NTPROOT/bin" -export PATH - -if [ "$2" = "is" ]; then - : -else - # - # find out the way echos work (Rest of rc thinks BSD echo) - # - ECHOREP="`echo -n x`" - if [ "$ECHOREP" = "-n x" ]; then - ECHO () { - if [ "$1" = "-n" ]; then - shift - echo "$@\c" - else - echo "$@" - fi - } - #ECHO "System V style echo" - else - ECHO () { - echo "$@" - } - #ECHO "BSD style echo" - fi - - NLECHO () { - echo "$@" - } - - LOG () { - while read _line; do - ECHO "$_line" - done - } - # - # carefully find out some configuration Variables - # - ARCH="`(arch) 2>/dev/null || ((uname) > /dev/null && uname -a | awk '{ print $6; }') 2>/dev/null || echo 'no-arch'`" - KARCH="`(arch -k) 2>/dev/null || ((uname) > /dev/null && uname -a | awk '{ print $5 }') || echo 'no-arch'`" - HOSTNAME="`(hostname) 2>/dev/null || uname -n`" -fi - diff --git a/usr.sbin/xntpd/util/Makefile b/usr.sbin/xntpd/util/Makefile deleted file mode 100644 index 4eb52756cfcf..000000000000 --- a/usr.sbin/xntpd/util/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# -# $FreeBSD$ -# - -CFLAGS+= -I${.CURDIR}/../include - -DPADD= ${LIBNTP} -LDADD= ${LIBNTP} - -PROG= tickadj -MAN8= ${.CURDIR}/../doc/tickadj.8 -CLEANFILES+= .version version.c - -SRCS= tickadj.c version.c - -version.c: ${.CURDIR}/../VERSION - sh -e ${.CURDIR}/../scripts/mkversion tickadj - -.include <bsd.prog.mk> diff --git a/usr.sbin/xntpd/util/README b/usr.sbin/xntpd/util/README deleted file mode 100644 index 2aedb006834c..000000000000 --- a/usr.sbin/xntpd/util/README +++ /dev/null @@ -1,67 +0,0 @@ -README file for directory ./util of the NTP Version 3 distribution - -This directory contains the sources for the various utility programs. See -the README and RELNOTES files in the parent directory for directions on -how to make and install these programs. - -The ntptime.c program checks the kernel configuration for the NTP user -interface syscalls ntp_gettime() and ntp_adjtime(). If present, the -current timekeeping data are displayed. If not, a dissapointment is -displayed. Do "make ntptime" in this directory to make the thing, -but be advised that, unless you have installed the kernel support, -there will probably be missing vital header files. See the README.kern -file in the doc directory of this distribution for further details. - -The jitter.c program can be used to determine the timing jitter due to -the operating system in a gettimeofday() call. For most systems the -dominant contribution to the jitter budget is the period of the hardware -interrupt, usually in the range 1-10 ms. For those systems with microsecond -counters, such as recent Sun and certain Ultrix systems, the jitter is -dominated only by the operating system. - -The timetrim.c program can be used with SGI machines to implement a -scheme to discipline the hardware clock frequency. See the source code -for further information. - -The byteorder.c and longsize.c programs are used during the configuration -process to determine the byte order (little or big endian) and longword -size (32 or 64 bits). See the ../scripts/makefile.sh script for further -details. - -The testrs6000.c program is used for testing purposes with the IBM -RS/6000 AIX machines. Bill Jones <jones@chpc.utexas.edu> reports: -"I could not get a tickadj of less then 40 us to work on a RS6000. -If you set it less then 40 us do so at your own risk!" - -The tickadj.c program can be used to read and set various kernel -parameters affecting NTP operations. Comes now the rationale for its use. - -Then daemon's clock adjustment algorithms depend (too) strongly -on the internals of the kernel adjtime() call, and expect it to -match that which comes with Berkeley-flavour operating systems. -The daemon actually reads a couple of values from your kernel -using /dev/kmem (ugh!), the value of `tick' and the value of `tickadj'. -`tick' is expected to be the number of microseconds which are -added to the system time on timer interrupts when the clock isn't -being slewed. `tickadj' is the number of microseconds which are -added or subtracted from tick when the clock is being slewed. - -The program tickadj mimics the daemon's handling of these variables. -If you run it (as root) and it fails or produces bizarre looking -values you may have to torque ntp_unixclock.c in the daemon code. - -You can also use tickadj -a to set tickadj in the running kernel. -In addition, tickadj -A will compute the value to set based on the -kernel's value of tick, while the -t flag allows one to set the -value of tick and the -s flag will set the value of dosynctodr -to zero. This is an alternative for people who can't change the -values in the kernel's disk image. - -In addition, the -p flag will set the noprintf variable. This will -suppress any kernel messages. Kernel message can then only be seen via -syslog(3). This inhibits clockhopping due to kernel printf's. - -The target "ntptime" can only be compiled on systems with kernel PLL -support. This is currently only possible for SunOS4, Ultrix and DECOSF1. -You need the propriatary header files for that. So there is no need to -attempt to compile ntptime unless you have the above configuration. diff --git a/usr.sbin/xntpd/util/byteorder.c b/usr.sbin/xntpd/util/byteorder.c deleted file mode 100644 index ff7d239379ef..000000000000 --- a/usr.sbin/xntpd/util/byteorder.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This works on: - * Crays - * Conven - * sparc's - * Dec mip machines - * Dec alpha machines - * RS6000 - * SGI's - */ - -#include <stdio.h> -main() -{ - int i; - int big; - union { - unsigned long l; - char c[sizeof(long)]; - } u; - -#if defined(LONG8) - u.l = (((long)0x08070605) << 32) | (long)0x04030201; -#else - u.l = 0x04030201; -#endif - if (sizeof(long) > 4) { - if (u.c[0] == 0x08) big = 1; - else big = 0; - } else { - if (u.c[0] == 0x04) big = 1; - else big = 0; - } - for (i=0; i< sizeof(long); i++) { - if (big == 1 && (u.c[i] == (sizeof(long) - i))) { - continue; - } else if (big == 0 && (u.c[i] == (i+1))) { - continue; - } else { - big = -1; - break; - } - } - - if (big == 1) { - printf("XNTP_BIG_ENDIAN\n"); - } else if (big == 0) { - printf("XNTP_LITTLE_ENDIAN\n"); - } - exit(0); -} - diff --git a/usr.sbin/xntpd/util/jitter.c b/usr.sbin/xntpd/util/jitter.c deleted file mode 100644 index 7201e87eba2e..000000000000 --- a/usr.sbin/xntpd/util/jitter.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * This program can be used to calibrate the clock reading jitter of a - * particular CPU and operating system. It first tickles every element - * of an array, in order to force pages into memory, then repeatedly calls - * gettimeofday() and, finally, writes out the time values for later - * analysis. From this you can determine the jitter and if the clock ever - * runs backwards. - */ -#include <sys/time.h> -#include <stdio.h> - -#define NBUF 10001 - -main() -{ - struct timeval tp, ts, tr; - struct timezone tzp; - long temp, j, i, gtod[NBUF]; - - gettimeofday(&ts, &tzp); - ts.tv_usec = 0; - - /* - * Force pages into memory - */ - for (i = 0; i < NBUF; i ++) - gtod[i] = 0; - - /* - * Construct gtod array - */ - for (i = 0; i < NBUF; i ++) { - gettimeofday(&tp, &tzp); - tr = tp; - tr.tv_sec -= ts.tv_sec; - tr.tv_usec -= ts.tv_usec; - if (tr.tv_usec < 0) { - tr.tv_usec += 1000000; - tr.tv_sec--; - } - gtod[i] = tr.tv_sec * 1000000 + tr.tv_usec; - } - - /* - * Write out gtod array for later processing with S - */ - for (i = 0; i < NBUF - 1; i++) { -/* - printf("%lu\n", gtod[i]); -*/ - gtod[i] = gtod[i + 1] - gtod[i]; - printf("%lu\n", gtod[i]); - } - - /* - * Sort the gtod array and display deciles - */ - for (i = 0; i < NBUF - 1; i++) { - for (j = 0; j <= i; j++) { - if (gtod[j] > gtod[i]) { - temp = gtod[j]; - gtod[j] = gtod[i]; - gtod[i] = temp; - } - } - } - fprintf(stderr, "First rank\n"); - for (i = 0; i < 10; i++) - fprintf(stderr, "%10ld%10ld\n", i, gtod[i]); - fprintf(stderr, "Last rank\n"); - for (i = NBUF - 11; i < NBUF - 1; i++) - fprintf(stderr, "%10ld%10ld\n", i, gtod[i]); -} diff --git a/usr.sbin/xntpd/util/kern.c b/usr.sbin/xntpd/util/kern.c deleted file mode 100644 index a2a667203a72..000000000000 --- a/usr.sbin/xntpd/util/kern.c +++ /dev/null @@ -1,210 +0,0 @@ -/* - * This program simulates a first-order, type-II phase-lock loop using - * actual code segments from modified kernel distributions for SunOS, - * Ultrix and OSF/1 kernels. These segments do not use any licensed code. - */ -#include <stdio.h> -#include <ctype.h> -#include <math.h> -#include <sys/time.h> - -#include "timex.h" - -/* - * Phase-lock loop definitions - */ -#define HZ 100 /* timer interrupt frequency (Hz) */ -#define MAXPHASE 512000 /* max phase error (us) */ -#define MAXFREQ 200 /* max frequency error (ppm) */ -#define TAU 2 /* time constant (shift 0 - 6) */ -#define POLL 16 /* interval between updates (s) */ -#define MAXSEC 1200 /* max interval between updates (s) */ - -/* - * Function declarations - */ -void hardupdate(); -void hardclock(); -void second_overflow(); - -/* - * Kernel variables - */ -int tick; /* timer interrupt period (us) */ -int fixtick; /* amortization constant (ppm) */ -struct timeval timex; /* ripoff of kernel time variable */ - -/* - * Phase-lock loop variables - */ -int time_status = TIME_BAD; /* clock synchronization status */ -long time_offset = 0; /* time adjustment (us) */ -long time_constant = 0; /* pll time constant */ -long time_tolerance = MAXFREQ; /* frequency tolerance (ppm) */ -long time_precision = 1000000 / HZ; /* clock precision (us) */ -long time_maxerror = MAXPHASE; /* maximum error (us) */ -long time_esterror = MAXPHASE; /* estimated error (us) */ -long time_phase = 0; /* phase offset (scaled us) */ -long time_freq = 0; /* frequency offset (scaled ppm) */ -long time_adj = 0; /* tick adjust (scaled 1 / HZ) */ -long time_reftime = 0; /* time at last adjustment (s) */ - -/* - * Simulation variables - */ -double timey = 0; /* simulation time (us) */ -long timez = 0; /* current error (us) */ -long poll_interval = 0; /* poll counter */ - -/* - * Simulation test program - */ -void main() -{ - tick = 1000000 / HZ; - fixtick = 1000000 % HZ; - timex.tv_sec = 0; - timex.tv_usec = MAXPHASE; - time_freq = 0; - time_constant = TAU; - printf("tick %d us, fixtick %d us\n", tick, fixtick); - printf(" time offset freq _offset _freq _adj\n"); - - /* - * Grind the loop until ^C - */ - while (1) { - timey += (double)(1000000) / HZ; - if (timey >= 1000000) - timey -= 1000000; - hardclock(); - if (timex.tv_usec >= 1000000) { - timex.tv_usec -= 1000000; - timex.tv_sec++; - second_overflow(); - poll_interval++; - if (!(poll_interval % POLL)) { - timez = (long)timey - timex.tv_usec; - if (timez > 500000) - timez -= 1000000; - if (timez < -500000) - timez += 1000000; - hardupdate(timez); - printf("%10li%10li%10.2f %08lx %08lx %08lx\n", - timex.tv_sec, timez, - (double)time_freq / (1 << SHIFT_KF), - time_offset, time_freq, time_adj); - } - } - } -} - -/* - * This routine simulates the ntp_adjtime() call - * - * For default SHIFT_UPDATE = 12, offset is limited to +-512 ms, the - * maximum interval between updates is 4096 s and the maximum frequency - * offset is +-31.25 ms/s. - */ -void hardupdate(offset) -long offset; -{ - long ltemp, mtemp; - - time_offset = offset << SHIFT_UPDATE; - mtemp = timex.tv_sec - time_reftime; - time_reftime = timex.tv_sec; - if (mtemp > MAXSEC) - mtemp = 0; - - /* ugly multiply should be replaced */ - if (offset < 0) - time_freq -= (-offset * mtemp) >> - (time_constant + time_constant); - else - time_freq += (offset * mtemp) >> - (time_constant + time_constant); - ltemp = time_tolerance << SHIFT_KF; - if (time_freq > ltemp) - time_freq = ltemp; - else if (time_freq < -ltemp) - time_freq = -ltemp; - if (time_status == TIME_BAD) - time_status = TIME_OK; -} - -/* - * This routine simulates the timer interrupt - */ -void hardclock() -{ - int ltemp, time_update; - - time_update = tick; /* computed by adjtime() */ - time_phase += time_adj; - if (time_phase < -FINEUSEC) { - ltemp = -time_phase >> SHIFT_SCALE; - time_phase += ltemp << SHIFT_SCALE; - time_update -= ltemp; - } - else if (time_phase > FINEUSEC) { - ltemp = time_phase >> SHIFT_SCALE; - time_phase -= ltemp << SHIFT_SCALE; - time_update += ltemp; - } - timex.tv_usec += time_update; -} - -/* - * This routine simulates the overflow of the microsecond field - * - * With SHIFT_SCALE = 23, the maximum frequency adjustment is +-256 us - * per tick, or 25.6 ms/s at a clock frequency of 100 Hz. The time - * contribution is shifted right a minimum of two bits, while the frequency - * contribution is a right shift. Thus, overflow is prevented if the - * frequency contribution is limited to half the maximum or 15.625 ms/s. - */ -void second_overflow() -{ - int ltemp; - - time_maxerror += time_tolerance; - if (time_offset < 0) { - ltemp = -time_offset >> - (SHIFT_KG + time_constant); - time_offset += ltemp; - time_adj = -(ltemp << - (SHIFT_SCALE - SHIFT_HZ - SHIFT_UPDATE)); - } else { - ltemp = time_offset >> - (SHIFT_KG + time_constant); - time_offset -= ltemp; - time_adj = ltemp << - (SHIFT_SCALE - SHIFT_HZ - SHIFT_UPDATE); - } - if (time_freq < 0) - time_adj -= -time_freq >> (SHIFT_KF + SHIFT_HZ - SHIFT_SCALE); - else - time_adj += time_freq >> (SHIFT_KF + SHIFT_HZ - SHIFT_SCALE); - time_adj += fixtick << (SHIFT_SCALE - SHIFT_HZ); - - /* ugly divide should be replaced */ - if (timex.tv_sec % 86400 == 0) { - switch (time_status) { - - case TIME_INS: - timex.tv_sec--; /* !! */ - time_status = TIME_OOP; - break; - - case TIME_DEL: - timex.tv_sec++; - time_status = TIME_OK; - break; - - case TIME_OOP: - time_status = TIME_OK; - break; - } - } -} diff --git a/usr.sbin/xntpd/util/longsize.c b/usr.sbin/xntpd/util/longsize.c deleted file mode 100644 index bb884ba3d416..000000000000 --- a/usr.sbin/xntpd/util/longsize.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -main() -{ - if (sizeof(long) == 8) { - printf("-DLONG8\n"); - } else if (sizeof(long) == 4) { - printf("-DLONG4\n"); - } - exit(0); -} diff --git a/usr.sbin/xntpd/util/ntptime.c b/usr.sbin/xntpd/util/ntptime.c deleted file mode 100644 index 38d9a4a3c2d4..000000000000 --- a/usr.sbin/xntpd/util/ntptime.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - * NTP test program - * - * This program tests to see if the NTP user interface routines - * ntp_gettime() and ntp_adjtime() have been implemented in the kernel. - * If so, each of these routines is called to display current timekeeping - * data. - * - * For more information, see the README.kern file in the doc directory - * of the xntp3 distribution. - */ -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> -#include <signal.h> -#include <errno.h> - -#include "ntp_fp.h" -#include "ntp_unixtime.h" -#include "sys/timex.h" -#include "ntp_stdlib.h" - -#ifndef SYS_DECOSF1 -#define BADCALL -1 /* this is supposed to be a bad syscall */ -#endif /* SYS_DECOSF1 */ - -#ifdef KERNEL_PLL -#define ntp_gettime(t) syscall(SYS_ntp_gettime, (t)) -#define ntp_adjtime(t) syscall(SYS_ntp_adjtime, (t)) -#else /* KERNEL_PLL */ -#define SYS_ntp_adjtime NTP_SYSCALL_ADJ -#define SYS_ntp_gettime NTP_SYSCALL_GET -#endif /* KERNEL_PLL */ - -/* - * Function prototypes - */ -extern int sigvec P((int, struct sigvec *, struct sigvec *)); -extern int syscall P((int, void *, ...)); -void pll_trap P((void)); - -static struct sigvec newsigsys; /* new sigvec status */ -static struct sigvec sigsys; /* current sigvec status */ -static int pll_control; /* (0) daemon, (1) kernel loop */ - -static char* progname; -static char optargs[] = "ce:f:hm:o:rs:t:"; - -void -main(argc, argv) - int argc; - char *argv[]; -{ - extern int ntp_optind; - extern char *ntp_optarg; - int status; - struct ntptimeval ntv; - struct timex ntx, _ntx; - int times[20]; - double ftemp, gtemp; - l_fp ts; - int c; - int errflg = 0; - int cost = 0; - int rawtime = 0; - - memset((char *)&ntx, 0, sizeof(ntx)); - progname = argv[0]; - while ((c = ntp_getopt(argc, argv, optargs)) != EOF) switch (c) { - case 'c': - cost++; - break; - case 'e': - ntx.modes |= MOD_ESTERROR; - ntx.esterror = atoi(ntp_optarg); - break; - case 'f': - ntx.modes |= MOD_FREQUENCY; - ntx.freq = (int) (atof(ntp_optarg) * - (1 << SHIFT_USEC)); - if (ntx.freq < (-100 << SHIFT_USEC) - || ntx.freq > ( 100 << SHIFT_USEC)) errflg++; - break; - case 'm': - ntx.modes |= MOD_MAXERROR; - ntx.maxerror = atoi(ntp_optarg); - break; - case 'o': - ntx.modes |= MOD_OFFSET; - ntx.offset = atoi(ntp_optarg); - break; - case 'r': - rawtime++; - break; - case 's': - ntx.modes |= MOD_STATUS; - ntx.status = atoi(ntp_optarg); - if (ntx.status < 0 || ntx.status > 4) errflg++; - break; - case 't': - ntx.modes |= MOD_TIMECONST; - ntx.constant = atoi(ntp_optarg); - if (ntx.constant < 0 || ntx.constant > MAXTC) - errflg++; - break; - default: - errflg++; - } - if (errflg || (ntp_optind != argc)) { - (void) fprintf(stderr, - "usage: %s [-%s]\n\n\ - -c display the time taken to call ntp_gettime (us)\n\ - -e esterror estimate of the error (us)\n\ - -f frequency Frequency error (-100 .. 100) (ppm)\n\ - -h display this help info\n\ - -m maxerror max possible error (us)\n\ - -o offset current offset (ms)\n\ - -r print the unix and NTP time raw\n\ - -l leap Set the leap bits\n\ - -t timeconstant log2 of PLL time constant (0 .. %d)\n", - progname, optargs, MAXTC); - exit(2); - } - - - /* - * Test to make sure the sigvec() works in case of invalid - * syscall codes. - */ - newsigsys.sv_handler = pll_trap; - newsigsys.sv_mask = 0; - newsigsys.sv_flags = 0; - if (sigvec(SIGSYS, &newsigsys, &sigsys)) { - perror("sigvec() fails to save SIGSYS trap"); - exit(1); - } - -#ifdef BADCALL - /* - * Make sure the trapcatcher works. - */ - pll_control = 1; - (void)syscall(BADCALL, &ntv); /* dummy parameter f. ANSI compilers */ - if (pll_control) - printf("sigvec() failed to catch an invalid syscall\n"); -#endif - - if (cost) { - for (c = 0; c < sizeof times / sizeof times[0]; c++) { - (void)ntp_gettime(&ntv); - if (pll_control < 0) - break; - times[c] = ntv.time.tv_usec; - } - if (pll_control >= 0) { - printf("[ us %06d:", times[0]); - for (c = 1; c < sizeof times / sizeof times[0]; c++) - printf(" %d", times[c] - times[c - 1]); - printf(" ]\n"); - } - } - (void)ntp_gettime(&ntv); - _ntx.modes = 0; /* Ensure nothing is set */ - (void)ntp_adjtime(&_ntx); - if (pll_control < 0) { - printf("NTP user interface routines are not configured in this kernel.\n"); - goto lexit; - } - - /* - * Fetch timekeeping data and display. - */ - status = ntp_gettime(&ntv); - if (status < 0) - perror("ntp_gettime() call fails"); - else { - printf("ntp_gettime() returns code %d\n", status); - TVTOTS(&ntv.time, &ts); - ts.l_uf += TS_ROUNDBIT; /* guaranteed not to overflow */ - ts.l_ui += JAN_1970; - ts.l_uf &= TS_MASK; - printf(" time %s, (.%06d),\n", - prettydate(&ts), ntv.time.tv_usec); - printf(" maximum error %ld us, estimated error %ld us.\n", - ntv.maxerror, ntv.esterror); - if (rawtime) printf(" ntptime=%x.%x unixtime=%x.%06d %s", - ts.l_ui, ts.l_uf, ntv.time.tv_sec, ntv.time.tv_usec, - ctime(&ntv.time.tv_sec)); - } - status = ntp_adjtime(&ntx); - if (status < 0) - perror((errno == EPERM) ? - "Must be root to set kernel values\nntp_adjtime() call fails" : - "ntp_adjtime() call fails"); - else { - printf("ntp_adjtime() returns code %d\n", status); - ftemp = ntx.freq; - ftemp /= (1 << SHIFT_USEC); - printf(" modes %04x, offset %ld us, frequency %.3f ppm, interval %d s,\n", - ntx.modes, ntx.offset, ftemp, 1 << ntx.shift); - printf(" maximum error %ld us, estimated error %ld us,\n", - ntx.maxerror, ntx.esterror); - ftemp = ntx.tolerance; - ftemp /= (1 << SHIFT_USEC); - printf(" status %04x, time constant %ld, precision %ld us, tolerance %.0f ppm,\n", - ntx.status, ntx.constant, ntx.precision, ftemp); - if (ntx.shift == 0) - return; - ftemp = ntx.ppsfreq; - ftemp /= (1 << SHIFT_USEC); - gtemp = ntx.stabil; - gtemp /= (1 << SHIFT_USEC); - printf(" pps frequency %.3f ppm, stability %.3f ppm, jitter %ld us,\n", - ftemp, gtemp, ntx.jitter); - printf(" intervals %ld, jitter exceeded %ld, stability exceeded %ld, errors %ld.\n", - ntx.calcnt, ntx.jitcnt, ntx.stbcnt, ntx.errcnt); - } - - /* - * Put things back together the way we found them. - */ -lexit: if (sigvec(SIGSYS, &sigsys, (struct sigvec *)NULL)) { - perror("sigvec() fails to restore SIGSYS trap"); - exit(1); - } - exit(0); -} - -/* - * pll1_trap - trap processor for undefined syscalls - */ -void -pll_trap() -{ - pll_control--; -} diff --git a/usr.sbin/xntpd/util/precision.c b/usr.sbin/xntpd/util/precision.c deleted file mode 100644 index 64fe336fe662..000000000000 --- a/usr.sbin/xntpd/util/precision.c +++ /dev/null @@ -1,150 +0,0 @@ -#include <sys/types.h> -#include <sys/time.h> -#include "ntp_unixtime.h" - -#define DEFAULT_SYS_PRECISION -99 - -int default_get_resolution(); -int default_get_precision(); - -int -main() { - printf("log2(resolution) = %d, log2(precision) = %d\n", - default_get_resolution(), - default_get_precision()); - return 0; -} - -/* Find the resolution of the system clock by watching how the current time - * changes as we read it repeatedly. - * - * struct timeval is only good to 1us, which may cause problems as machines - * get faster, but until then the logic goes: - * - * If a machine has resolution (i.e. accurate timing info) > 1us, then it will - * probably use the "unused" low order bits as a counter (to force time to be - * a strictly increaing variable), incrementing it each time any process - * requests the time [[ or maybe time will stand still ? ]]. - * - * SO: the logic goes: - * - * IF the difference from the last time is "small" (< MINSTEP) - * THEN this machine is "counting" with the low order bits - * ELIF this is not the first time round the loop - * THEN this machine *WAS* counting, and has now stepped - * ELSE this machine has resolution < time to read clock - * - * SO: if it exits on the first loop, assume "full accuracy" (1us) - * otherwise, take the log2(observered difference, rounded UP) - * - * MINLOOPS > 1 ensures that even if there is a STEP between the initial call - * and the first loop, it doesn't stop too early. - * Making it even greater allows MINSTEP to be reduced, assuming that the - * chance of MINSTEP-1 other processes getting in and calling gettimeofday - * between this processes's calls. - * Reducing MINSTEP may be necessary as this sets an upper bound for the time - * to actually call gettimeofday. - */ - -#define DUSECS 1000000 -#define HUSECS (1024 * 1024) -#define MINSTEP 5 /* some systems increment uS on each call */ - /* Don't use "1" as some *other* process may read too*/ - /*We assume no system actually *ANSWERS* in this time*/ -#define MAXSTEP 20000 /* maximum clock increment (us) */ -#define MINLOOPS 5 /* minimum number of step samples */ -#define MAXLOOPS HUSECS /* Assume precision < .1s ! */ - -int default_get_resolution() -{ - struct timeval tp; - struct timezone tzp; - long last; - int i; - long diff; - long val; - int minsteps = MINLOOPS; /* need at least this many steps */ - - gettimeofday(&tp, &tzp); - last = tp.tv_usec; - for (i = - --minsteps; i< MAXLOOPS; i++) { - gettimeofday(&tp, &tzp); - diff = tp.tv_usec - last; - if (diff < 0) diff += DUSECS; - if (diff > MINSTEP) if (minsteps-- <= 0) break; - last = tp.tv_usec; - } - - printf("resolution = %ld usec after %d loop%s\n", - diff, i, (i==1) ? "" : "s"); - - diff = (diff *3)/2; - if (i >= MAXLOOPS) { - printf( - " (Boy this machine is fast ! %d loops without a step)\n", - MAXLOOPS); - diff = 1; /* No STEP, so FAST machine */ - } - if (i == 0) { - printf( -" (The resolution is less than the time to read the clock -- Assume 1us)\n"); - diff = 1; /* time to read clock >= resolution */ - } - for (i=0, val=HUSECS; val>0; i--, val >>= 1) if (diff >= val) return i; - printf(" (Oh dear -- that wasn't expected ! I'll guess !)\n"); - return DEFAULT_SYS_PRECISION /* Something's BUST, so lie ! */; -} - -/* ===== Rest of this code lifted straight from xntpd/ntp_proto.c ! ===== */ - -/* - * This routine calculates the differences between successive calls to - * gettimeofday(). If a difference is less than zero, the us field - * has rolled over to the next second, so we add a second in us. If - * the difference is greater than zero and less than MINSTEP, the - * clock has been advanced by a small amount to avoid standing still. - * If the clock has advanced by a greater amount, then a timer interrupt - * has occurred and this amount represents the precision of the clock. - * In order to guard against spurious values, which could occur if we - * happen to hit a fat interrupt, we do this for MINLOOPS times and - * keep the minimum value obtained. - */ -int default_get_precision() -{ - struct timeval tp; - struct timezone tzp; - long last; - int i; - long diff; - long val; - long usec; - - usec = 0; - val = MAXSTEP; - GETTIMEOFDAY(&tp, &tzp); - last = tp.tv_usec; - for (i = 0; i < MINLOOPS && usec < HUSECS;) { - GETTIMEOFDAY(&tp, &tzp); - diff = tp.tv_usec - last; - last = tp.tv_usec; - if (diff < 0) - diff += DUSECS; - usec += diff; - if (diff > MINSTEP) { - i++; - if (diff < val) - val = diff; - } - } - printf("precision = %ld usec after %d loop%s\n", - val, i, (i == 1) ? "" : "s"); - if (usec >= HUSECS) { - printf(" (Boy this machine is fast ! usec was %ld)\n", - usec); - val = MINSTEP; /* val <= MINSTEP; fast machine */ - } - diff = HUSECS; - for (i = 0; diff > val; i--) - diff >>= 1; - return (i); -} diff --git a/usr.sbin/xntpd/util/testrs6000.c b/usr.sbin/xntpd/util/testrs6000.c deleted file mode 100644 index 0d4bf4fdc6a4..000000000000 --- a/usr.sbin/xntpd/util/testrs6000.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Checks for the RS/6000 AIX adjtime() bug, in which if a negative - * offset is given, the system gets messed up and never completes the - * adjustment. If the problem is fixed, this program will print the - * time, sit there for 10 seconds, and exit. If the problem isn't fixed, - * the program will print an occasional "result=nnnnnn" (the residual - * slew from adjtime()). - * - * Compile this with bsdcc and run it as root! - */ -#include <signal.h> -#include <sys/time.h> -#include <time.h> -#include <stdio.h> -int timeout(); -struct timeval adjustment, result; -main () { - struct itimerval value, oldvalue; - int i; - time_t curtime; - curtime = time(0); - printf("Starting: %s", ctime(&curtime)); - value.it_interval.tv_sec = value.it_value.tv_sec = 1; - value.it_interval.tv_usec = value.it_value.tv_usec = 0; - adjustment.tv_sec = 0; - adjustment.tv_usec = -2000; - signal(SIGALRM, timeout); - setitimer(ITIMER_REAL, &value, &oldvalue); - for (i=0; i<10; i++) { - pause(); - } -} - -int timeout(sig, code, scp) -int sig,code; -struct sigcontext *scp; -{ - signal (SIGALRM, timeout); - if (adjtime(&adjustment, &result)) - printf("adjtime call failed\n"); - if (result.tv_sec != 0 || result.tv_usec != 0) { - printf("result.u = %d.%06.6d ", (int) result.tv_sec, - (int) result.tv_usec); - } -} diff --git a/usr.sbin/xntpd/util/tickadj.c b/usr.sbin/xntpd/util/tickadj.c deleted file mode 100644 index 87ac4f257f80..000000000000 --- a/usr.sbin/xntpd/util/tickadj.c +++ /dev/null @@ -1,559 +0,0 @@ -/* - * tickadj - read, and possibly modify, the kernel `tick' and - * `tickadj' variables, as well as `dosynctodr'. Note that - * this operates on the running kernel only. I'd like to be - * able to read and write the binary as well, but haven't - * mastered this yet. - */ - -#ifndef lint -static const char rcsid[] = - "$FreeBSD$"; -#endif /* not lint */ - -#include <stdio.h> - -#if !defined(SYS_VAX) && !defined(SYS_BSD) -#include <unistd.h> -#endif /* SYS_VAX */ - -#ifdef SYS_LINUX -#include "sys/timex.h" - -struct timex txc; - -int -main(int argc, char ** argv) -{ - if (argc > 2) - { - fprintf(stderr, "Usage: %s [tick_value]\n", argv[0]); - exit(-1); - } - else if (argc == 2) - { - if ( (txc.tick = atoi(argv[1])) < 1 ) - { - fprintf(stderr, "Silly value for tick: %s\n", argv[1]); - exit(-1); - } - txc.mode = ADJ_TICK; - } - else - txc.mode = 0; - - if (__adjtimex(&txc) < 0) - perror("adjtimex"); - else - printf("tick = %d\n", txc.tick); - - return(0); -} -#else /* not Linux... kmem tweaking: */ - -#include <err.h> -#include <sys/types.h> -#ifndef SYS_BSD -#include <sys/file.h> -#endif -#include <sys/stat.h> - -#if defined(SYS_AUX3) || defined(SYS_AUX2) -#include <sys/param.h> -#include <sys/time.h> -#include <sys/resource.h> -#include <sys/file.h> -#include <a.out.h> -#include <sys/var.h> -#else -#include <nlist.h> -#endif - -#include "ntp_io.h" -#include "ntp_stdlib.h" - -#if defined(HAVE_GETBOOTFILE) -#include <paths.h> -#endif - -#ifdef RS6000 -#undef hz -#endif /* RS6000 */ - -#if defined(SOLARIS)||defined(RS6000)||defined(SYS_SINIXM) -#if !defined(_SC_CLK_TCK) -#include <unistd.h> -#endif -#endif - -#if defined(SYS_PTX) || defined(SYS_IX86OSF1) -#define L_SET SEEK_SET -#endif - -#define KMEM "/dev/kmem" -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -int debug; - -int dokmem = 1; -int writetickadj = 0; -int writeopttickadj = 0; -int unsetdosync = 0; -int writetick = 0; -int quiet = 0; -int setnoprintf = 0; - -char *kmem = KMEM; -char *kernel = NULL; -char *file = NULL; -int fd = -1; - -static char * getoffsets P((char *, unsigned long *, unsigned long *, unsigned long *, unsigned long *)); -static int openfile P((char *, int)); -static void writevar P((int, unsigned long, int)); -static void readvar P((int, unsigned long, int *)); - -static void -usage() -{ - fprintf(stderr, "usage: tickadj [-Adkpqs] [-a newadj] [-t newtick]\n"); - exit(2); -} - -/* - * main - parse arguments and handle options - */ -int -main(argc, argv) -int argc; -char *argv[]; -{ - int c; - int errflg = 0; - extern int ntp_optind; - extern char *ntp_optarg; - unsigned long tickadj_offset; - unsigned long tick_offset; - unsigned long dosync_offset; - unsigned long noprintf_offset; - int tickadj; - int tick; - int dosynctodr; - int noprintf; - int hz, hz_hundredths; - int recommend_tickadj; - long tmp; - int openfile(); - char *getoffsets(); - void readvar(); - void writevar(); - - while ((c = ntp_getopt(argc, argv, "a:Adkqpst:")) != EOF) - switch (c) { - case 'd': - ++debug; - break; - case 'k': - dokmem = 1; - break; - case 'p': - setnoprintf = 1; - break; - case 'q': - quiet = 1; - break; - case 'a': - writetickadj = atoi(ntp_optarg); - if (writetickadj <= 0) { - warnx("unlikely value for tickadj: %s", - ntp_optarg); - errflg++; - } - break; - case 'A': - writeopttickadj = 1; - break; - case 's': - unsetdosync = 1; - break; - case 't': - writetick = atoi(ntp_optarg); - if (writetick <= 0) { - warnx("unlikely value for tick: %s", - ntp_optarg); - errflg++; - } - break; - default: - errflg++; - break; - } - if (errflg || ntp_optind != argc) - usage(); - kernel = getoffsets(kernel, &tick_offset, - &tickadj_offset, &dosync_offset, &noprintf_offset); - - if (debug) { - (void) printf("tick offset = %lu\n", tick_offset); - (void) printf("tickadj offset = %lu\n", tickadj_offset); - (void) printf("dosynctodr offset = %lu\n", dosync_offset); - (void) printf("noprintf offset = %lu\n", noprintf_offset); - } - - if (setnoprintf && (noprintf_offset == 0)) { - warnx("no noprintf kernel variable"); - errflg++; - } - - if (unsetdosync && (dosync_offset == 0)) { - warnx("no dosynctodr kernel variable"); - errflg++; - } - - if (writeopttickadj && (tickadj_offset == 0)) { - warnx("no tickadj kernel variable"); - errflg++; - } - - if (writetick && (tick_offset == 0)) { - warnx("no tick kernel variable"); - errflg++; - } - - - if (tickadj_offset != 0) - readvar(fd, tickadj_offset, &tickadj); - -#if defined(SOLARIS)||defined(RS6000)||defined(SYS_SINIXM) - tick = 1000000/sysconf(_SC_CLK_TCK); -#else - readvar(fd, tick_offset, &tick); -#endif - - if (dosync_offset != 0) - readvar(fd, dosync_offset, &dosynctodr); - if (noprintf_offset != 0) - readvar(fd, noprintf_offset, &noprintf); - (void) close(fd); - - if (unsetdosync && dosync_offset == 0) - errx(1, "can't find dosynctodr in namelist"); - - if (!quiet) { - (void) printf("tick = %d us",tick); - if (tickadj_offset != 0) - (void) printf(", tickadj = %d us", tickadj); - if (dosync_offset != 0) - (void) printf(", dosynctodr is %s", dosynctodr ? "on" : "off"); - (void) printf("\n"); - if (noprintf_offset != 0) - (void) printf("kernel level printf's: %s\n", noprintf ? "off" : "on"); - } - - if (tick <= 0) - errx(1, "the value of tick is silly!"); - - hz = (int)(1000000L / (long)tick); - hz_hundredths = (int)((100000000L / (long)tick) - ((long)hz * 100L)); - if (!quiet) - (void) printf("calculated hz = %d.%02d Hz\n", hz, - hz_hundredths); - tmp = (long) tick * 500L; - recommend_tickadj = (int)(tmp / 1000000L); - if (tmp % 1000000L > 0) - recommend_tickadj++; - -#if defined(RS6000) - if (recommend_tickadj < 40) recommend_tickadj = 40; -#endif - - if ((!quiet) && (tickadj_offset != 0)) - (void) printf("recommended value of tickadj = %d us\n", - recommend_tickadj); - - if (writetickadj == 0 && !writeopttickadj && - !unsetdosync && writetick == 0 && !setnoprintf) - exit(errflg ? 1 : 0); - - if (writetickadj == 0 && writeopttickadj) - writetickadj = recommend_tickadj; - - fd = openfile(file, O_WRONLY); - - if (setnoprintf && (dosync_offset != 0)) { - if (!quiet) { - (void) fprintf(stderr, "setting noprintf: "); - (void) fflush(stderr); - } - writevar(fd, noprintf_offset, 1); - if (!quiet) - (void) fprintf(stderr, "done!\n"); - } - - if ((writetick > 0) && (tick_offset != 0)) { - if (!quiet) { - (void) fprintf(stderr, "writing tick, value %d: ", - writetick); - (void) fflush(stderr); - } - writevar(fd, tick_offset, writetick); - if (!quiet) - (void) fprintf(stderr, "done!\n"); - } - - if ((writetickadj > 0) && (tickadj_offset != 0)) { - if (!quiet) { - (void) fprintf(stderr, "writing tickadj, value %d: ", - writetickadj); - (void) fflush(stderr); - } - writevar(fd, tickadj_offset, writetickadj); - if (!quiet) - (void) fprintf(stderr, "done!\n"); - } - - if (unsetdosync && (dosync_offset != 0)) { - if (!quiet) { - (void) fprintf(stderr, "zeroing dosynctodr: "); - (void) fflush(stderr); - } - writevar(fd, dosync_offset, 0); - if (!quiet) - (void) fprintf(stderr, "done!\n"); - } - (void) close(fd); - exit(errflg ? 1 : 0); -} - -/* - * getoffsets - read the magic offsets from the specified file - */ -static char * -getoffsets(filex, tick_off, tickadj_off, dosync_off, noprintf_off) - char *filex; - unsigned long *tick_off; - unsigned long *tickadj_off; - unsigned long *dosync_off; - unsigned long *noprintf_off; -{ - char **kname, *knm; - -#if defined(SYS_AUX3) || defined(SYS_AUX2) -#define X_TICKADJ 0 -#define X_TICK 1 -#define X_DEF - static struct nlist nl[] = - { {"tickadj"}, - {"tick"}, - {""}, - }; -#endif - -#ifdef NeXT -#define X_TICKADJ 0 -#define X_TICK 1 -#define X_DOSYNC 2 -#define X_NOPRINTF 3 -#define X_DEF - static struct nlist nl[] = - { {{"_tickadj"}}, - {{"_tick"}}, - {{"_dosynctodr"}}, - {{"_noprintf"}}, - {{""}}, - }; -#endif - -#if defined(SYS_SVR4) || defined(SYS_PTX) -#define X_TICKADJ 0 -#define X_TICK 1 -#define X_DOSYNC 2 -#define X_NOPRINTF 3 -#define X_DEF - static struct nlist nl[] = - { {{"tickadj"}}, - {{"tick"}}, - {{"doresettodr"}}, - {{"noprintf"}}, - {{""}}, - }; -#endif /* SYS_SVR4 */ - -#if defined(SOLARIS)||defined(RS6000)||defined(SYS_SINIXM) -#ifndef SOLARIS_HRTIME -#define X_TICKADJ 0 -#endif -#define X_DOSYNC 1 -#define X_NOPRINTF 2 -#define X_DEF - static struct nlist nl[] = - { {"tickadj"}, - {"dosynctodr"}, - {"noprintf"}, - {""}, - }; - -#if defined(RS6000) - int i; -#endif -#endif - -#if defined(SYS_HPUX) -#define X_TICKADJ 0 -#define X_TICK 1 -#define X_DEF - static struct nlist nl[] = -#ifdef hp9000s300 - { {"_tickadj"}, - {"_old_tick"}, -#else - { {"tickadj"}, - {"old_tick"}, -#endif - {""}, - }; -#endif - -#if !defined(X_DEF) -#define X_TICKADJ 0 -#define X_TICK 1 -#define X_DOSYNC 2 -#define X_NOPRINTF 3 - static struct nlist nl[] = - { {"_tickadj"}, - {"_tick"}, - {"_dosynctodr"}, - {"_noprintf"}, - {""}, - }; -#endif -#ifndef HAVE_GETBOOTFILE - static char *kernels[] = { - "/kernel", - "/vmunix", - "/unix", - "/mach", - "/kernel/unix", - "/386bsd", - "/netbsd", - NULL - }; -#endif - struct stat stbuf; - -#ifdef HAVE_GETBOOTFILE - /* XXX bogus cast to avoid `const' poisoning. */ - kname = &knm; - *kname = (char *)getbootfile(); - if (stat(*kname, &stbuf) == -1 || nlist(*kname, nl) == -1) - *kname = NULL; -#else - for (kname = kernels; *kname != NULL; kname++) { - if (stat(*kname, &stbuf) == -1) - continue; - if (nlist(*kname, nl) >= 0) - break; - } -#endif - if (*kname == NULL) - errx(1, "nlist fails: can't find/read kernel boot file name"); - - if (dokmem) - file = kmem; - else - file = kernel; - - fd = openfile(file, O_RDONLY); -#if defined(RS6000) - /* - * Go one more round of indirection. - */ - for (i=0; i<(sizeof(nl)/sizeof(struct nlist)); i++) { - if (nl[i].n_value) { - readvar(fd, nl[i].n_value, &nl[i].n_value); - } - } -#endif - *tickadj_off = 0; - *tick_off = 0; - *dosync_off = 0; - *noprintf_off = 0; - -#if defined(X_TICKADJ) - *tickadj_off = nl[X_TICKADJ].n_value; -#endif - -#if defined(X_TICK) - *tick_off = nl[X_TICK].n_value; -#endif - -#if defined(X_DOSYNC) - *dosync_off = nl[X_DOSYNC].n_value; -#endif - -#if defined(X_NOPRINTF) - *noprintf_off = nl[X_NOPRINTF].n_value; -#endif - return *kname; -} - -#undef X_TICKADJ -#undef X_TICK -#undef X_DOSYNC -#undef X_NOPRINTF - - -/* - * openfile - open the file, check for errors - */ -static int -openfile(name, mode) - char *name; - int mode; -{ - int fd; - - fd = open(name, mode); - if (fd < 0) - err(1, "open %s", name); - return fd; -} - - -/* - * writevar - write a variable into the file - */ -static void -writevar(fd, off, var) - int fd; - unsigned long off; - int var; -{ - - if (lseek(fd, off, L_SET) == -1) - err(1, "lseek fails"); - if (write(fd, (char *)&var, sizeof(int)) != sizeof(int)) - err(1, "write fails"); -} - - -/* - * readvar - read a variable from the file - */ -static void -readvar(fd, off, var) - int fd; - unsigned long off; - int *var; -{ - int i; - - if (lseek(fd, off, L_SET) == -1) - err(1, "lseek fails"); - i = read(fd, (char *)var, sizeof(int)); - if (i < 0) - err(1, "read fails"); - if (i != sizeof(int)) - errx(1, "read expected %d, got %d", (int)sizeof(int), i); -} -#endif /* not Linux */ diff --git a/usr.sbin/xntpd/util/timetrim.c b/usr.sbin/xntpd/util/timetrim.c deleted file mode 100644 index 7b9413f66b57..000000000000 --- a/usr.sbin/xntpd/util/timetrim.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - * timetrim.c - * - * "timetrim" allows setting and adjustment of the system clock frequency - * trim parameter on Silicon Graphics machines. The trim value native - * units are nanoseconds per second (10**-9), so a trim value of 1 makes - * the system clock step ahead 1 nanosecond more per second than a value - * of zero. Xntpd currently uses units of 2**-20 secs for its frequency - * offset (drift) values; to convert to a timetrim value, multiply by - * 1E9 / 2**20 (about 954). - * - * "timetrim" with no arguments just prints out the current kernel value. - * With a numeric argument, the kernel value is set to the supplied value. - * The "-i" flag causes the supplied value to be added to the kernel value. - * The "-n" option causes all input and output to be in xntpd units rather - * than timetrim native units. - * - * Note that there is a limit of +-3000000 (0.3%) on the timetrim value - * which is (silently?) enforced by the kernel. - * - */ - -#include <stdio.h> -#include <ctype.h> -#include <sys/syssgi.h> - -#define abs(X) (((X) < 0) ? -(X) : (X)) -#define USAGE "usage: timetrim [-n] [[-i] value]\n" -#define SGITONTP(X) ((double)(X) * 1048576.0/1.0e9) -#define NTPTOSGI(X) ((LONG)((X) * 1.0e9/1048576.0)) - -main(argc, argv) -int argc; -char **argv; -{ - char *rem; - int c, incremental = 0, ntpunits = 0; - LONG timetrim; - double value, strtod(); - - while (--argc && **++argv == '-' && isalpha(argv[0][1])) { - switch (argv[0][1]) { - case 'i': - incremental++; - break; - case 'n': - ntpunits++; - break; - default: - fprintf(stderr, USAGE); - exit(1); - } - } - - if (syssgi(SGI_GETTIMETRIM, &timetrim) < 0) { - perror("syssgi"); - exit(2); - } - - if (argc == 0) { - if (ntpunits) - fprintf(stdout, "%0.5lf\n", SGITONTP(timetrim)); - else - fprintf(stdout, "%ld\n", timetrim); - } else if (argc != 1) { - fprintf(stderr, USAGE); - exit(1); - } else { - value = strtod(argv[0], &rem); - if (*rem != '\0') { - fprintf(stderr, USAGE); - exit(1); - } - if (ntpunits) - value = NTPTOSGI(value); - if (incremental) - timetrim += value; - else - timetrim = value; - if (syssgi(SGI_SETTIMETRIM, timetrim) < 0) { - perror("syssgi"); - exit(2); - } - } -} diff --git a/usr.sbin/xntpd/xntpd/Makefile b/usr.sbin/xntpd/xntpd/Makefile deleted file mode 100644 index 0b655841a23e..000000000000 --- a/usr.sbin/xntpd/xntpd/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# -# $FreeBSD$ -# - -CFLAGS+= -I${.CURDIR}/../include - -.if exists(${.OBJDIR}/../parse) -LIBPARSE= ${.OBJDIR}/../parse/libparse.a -.else -LIBPARSE= ${.CURDIR}/../parse/libparse.a -.endif - -DPADD= ${LIBNTP} ${LIBPARSE} ${LIBKVM} -LDADD= ${LIBNTP} ${LIBPARSE} -lkvm - -PROG= xntpd -MAN8= ${.CURDIR}/../doc/xntpd.8 -CLEANFILES+= .version version.c - -SRCS= ntp_config.c ntp_control.c ntp_io.c ntp_leap.c \ - ntp_loopfilter.c ntp_monitor.c ntp_peer.c ntp_proto.c \ - ntp_refclock.c ntp_request.c ntp_restrict.c ntp_timer.c \ - ntp_unixclock.c ntp_util.c ntpd.c ntp_intres.c \ - ntp_filegen.c version.c - -# refclocks -SRCS+= refclock_acts.c refclock_as2201.c refclock_atom.c refclock_chu.c \ - refclock_conf.c refclock_datum.c refclock_goes.c refclock_gpstm.c \ - refclock_heath.c refclock_leitch.c refclock_local.c refclock_moto.c \ - refclock_msfees.c refclock_mx4200.c refclock_nmea.c refclock_omega.c \ - refclock_parse.c refclock_pst.c refclock_trak.c refclock_wwvb.c - -version.c: ${.CURDIR}/../VERSION - sh -e ${.CURDIR}/../scripts/mkversion xntpd - -.include <bsd.prog.mk> diff --git a/usr.sbin/xntpd/xntpd/README b/usr.sbin/xntpd/xntpd/README deleted file mode 100644 index 45512762d187..000000000000 --- a/usr.sbin/xntpd/xntpd/README +++ /dev/null @@ -1,6 +0,0 @@ -README file for directory ./xntpd of the NTP Version 3 distribution - -This directory contains the sources for the xntpd daemon for Unix. See -the README and RELNOTES files in the parent directory for directions on -how to make and install this program. The current version number of this -program is in the version.c file. diff --git a/usr.sbin/xntpd/xntpd/minpoll b/usr.sbin/xntpd/xntpd/minpoll deleted file mode 100644 index e69de29bb2d1..000000000000 --- a/usr.sbin/xntpd/xntpd/minpoll +++ /dev/null diff --git a/usr.sbin/xntpd/xntpd/ntp_config.c b/usr.sbin/xntpd/xntpd/ntp_config.c deleted file mode 100644 index bc88b5af38b8..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_config.c +++ /dev/null @@ -1,1717 +0,0 @@ -/* - k ntp_config.c - read and apply configuration information - */ -#include <stdio.h> -#include <ctype.h> -#include <sys/types.h> -#include <signal.h> -#include <sys/wait.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_unixtime.h" -#include "ntp_refclock.h" -#include "ntp_filegen.h" -#include "ntp_stdlib.h" - -/* - * These routines are used to read the configuration file at - * startup time. An entry in the file must fit on a single line. - * Entries are processed as multiple tokens separated by white space - * Lines are considered terminated when a '#' is encountered. Blank - * lines are ignored. - */ - -/* - * Configuration file name - */ -#ifndef CONFIG_FILE -#if defined(__bsdi__) -#define CONFIG_FILE "/usr/local/etc/xntp.conf" -#else -#define CONFIG_FILE "/etc/ntp.conf" -#endif -#endif /* CONFIG_FILE */ - -/* - * We understand the following configuration entries and defaults. - * - * peer [ addr ] [ version 3 ] [ key 0 ] [ minpoll 6 ] [ maxpoll 10 ] - * server [ addr ] [ version 3 ] [ key 0 ] [ minpoll 6 ] [ maxpoll 10 ] - * precision -7 - * broadcast [ addr ] [ version 3 ] [ key 0 ] [ ttl 1 ] - * broadcastclient - * multicastclient [224.0.1.1] - * broadcastdelay 0.0102 - * authenticate yes|no XXX depredated - * monitor yes|no XXX depredated - * authdelay 0.00842 - * restrict [ addr ] [ mask 255.255.255.0 ] ignore|noserve|notrust|noquery - * driftfile file_name - * keys file_name - * statsdir /var/NTP/ - * filegen peerstats [ file peerstats ] [ type day ] [ link ] - * clientlimit [ n ] - * clientperiod [ 3600 ] - * trustedkey [ key ] - * requestkey [ key] - * controlkey [ key ] - * trap [ addr ] - * fudge [ addr ] [ stratum ] [ refid ] ... - * pidfile [ ] - * setvar [ ] - * enable auth|bclient|pll|pps|monitor|stats - * disable auth|bclient|pll|pps|monitor|stats - * phone ... - */ - -/* - * Types of entries we understand. - */ -#define CONFIG_UNKNOWN 0 - -#define CONFIG_PEER 1 -#define CONFIG_SERVER 2 -#define CONFIG_PRECISION 3 -#define CONFIG_DRIFTFILE 4 -#define CONFIG_BROADCAST 5 -#define CONFIG_BROADCASTCLIENT 6 -#define CONFIG_AUTHENTICATE 7 -#define CONFIG_KEYS 8 -#define CONFIG_MONITOR 9 -#define CONFIG_AUTHDELAY 10 -#define CONFIG_RESTRICT 11 -#define CONFIG_BDELAY 12 -#define CONFIG_TRUSTEDKEY 13 -#define CONFIG_REQUESTKEY 14 -#define CONFIG_CONTROLKEY 15 -#define CONFIG_TRAP 16 -#define CONFIG_FUDGE 17 -#define CONFIG_RESOLVER 18 -#define CONFIG_STATSDIR 19 -#define CONFIG_FILEGEN 20 -#define CONFIG_STATISTICS 21 -#define CONFIG_PIDFILE 22 -#define CONFIG_SETVAR 23 -#define CONFIG_CLIENTLIMIT 24 -#define CONFIG_CLIENTPERIOD 25 -#define CONFIG_MULTICASTCLIENT 26 -#define CONFIG_ENABLE 27 -#define CONFIG_DISABLE 28 -#define CONFIG_PHONE 29 - -#define CONF_MOD_VERSION 1 -#define CONF_MOD_KEY 2 -#define CONF_MOD_MINPOLL 3 -#define CONF_MOD_MAXPOLL 4 -#define CONF_MOD_PREFER 5 -#define CONF_MOD_TTL 6 -#define CONF_MOD_MODE 7 - -#define CONF_RES_MASK 1 -#define CONF_RES_IGNORE 2 -#define CONF_RES_NOSERVE 3 -#define CONF_RES_NOTRUST 4 -#define CONF_RES_NOQUERY 5 -#define CONF_RES_NOMODIFY 6 -#define CONF_RES_NOPEER 7 -#define CONF_RES_NOTRAP 8 -#define CONF_RES_LPTRAP 9 -#define CONF_RES_NTPPORT 10 -#define CONF_RES_LIMITED 11 - -#define CONF_TRAP_PORT 1 -#define CONF_TRAP_INTERFACE 2 - -#define CONF_FDG_TIME1 1 -#define CONF_FDG_TIME2 2 -#define CONF_FDG_STRATUM 3 -#define CONF_FDG_REFID 4 -#define CONF_FDG_FLAG1 5 -#define CONF_FDG_FLAG2 6 -#define CONF_FDG_FLAG3 7 -#define CONF_FDG_FLAG4 8 - -#define CONF_FGEN_FILE 1 -#define CONF_FGEN_TYPE 2 -#define CONF_FGEN_FLAG_LINK 3 -#define CONF_FGEN_FLAG_NOLINK 4 -#define CONF_FGEN_FLAG_ENABLE 5 -#define CONF_FGEN_FLAG_DISABLE 6 - -/* - * Translation table - keywords to function index - */ -struct keyword { - char *text; - int keytype; -}; - -/* - * Command keywords - */ -static struct keyword keywords[] = { - { "peer", CONFIG_PEER }, - { "server", CONFIG_SERVER }, - { "precision", CONFIG_PRECISION }, - { "driftfile", CONFIG_DRIFTFILE }, - { "broadcast", CONFIG_BROADCAST }, - { "broadcastclient", CONFIG_BROADCASTCLIENT }, - { "multicastclient", CONFIG_MULTICASTCLIENT }, - { "authenticate", CONFIG_AUTHENTICATE }, - { "keys", CONFIG_KEYS }, - { "monitor", CONFIG_MONITOR }, - { "authdelay", CONFIG_AUTHDELAY }, - { "restrict", CONFIG_RESTRICT }, - { "broadcastdelay", CONFIG_BDELAY }, - { "trustedkey", CONFIG_TRUSTEDKEY }, - { "requestkey", CONFIG_REQUESTKEY }, - { "controlkey", CONFIG_CONTROLKEY }, - { "trap", CONFIG_TRAP }, - { "fudge", CONFIG_FUDGE }, - { "statsdir", CONFIG_STATSDIR }, - { "filegen", CONFIG_FILEGEN }, - { "statistics", CONFIG_STATISTICS }, - { "pidfile", CONFIG_PIDFILE }, - { "setvar", CONFIG_SETVAR }, - { "clientlimit", CONFIG_CLIENTLIMIT }, - { "clientperiod", CONFIG_CLIENTPERIOD }, - { "enable", CONFIG_ENABLE }, - { "disable", CONFIG_DISABLE }, - { "phone", CONFIG_PHONE }, - { "", CONFIG_UNKNOWN } -}; - -/* - * "peer", "server", "broadcast" modifier keywords - */ -static struct keyword mod_keywords[] = { - { "version", CONF_MOD_VERSION }, - { "key", CONF_MOD_KEY }, - { "minpoll", CONF_MOD_MINPOLL }, - { "maxpoll", CONF_MOD_MAXPOLL }, - { "prefer", CONF_MOD_PREFER }, - { "mode", CONF_MOD_MODE }, /* reference clocks */ - { "ttl", CONF_MOD_TTL }, /* NTP peers */ - { "", CONFIG_UNKNOWN } -}; - -/* - * "restrict" modifier keywords - */ -static struct keyword res_keywords[] = { - { "mask", CONF_RES_MASK }, - { "ignore", CONF_RES_IGNORE }, - { "noserve", CONF_RES_NOSERVE }, - { "notrust", CONF_RES_NOTRUST }, - { "noquery", CONF_RES_NOQUERY }, - { "nomodify", CONF_RES_NOMODIFY }, - { "nopeer", CONF_RES_NOPEER }, - { "notrap", CONF_RES_NOTRAP }, - { "lowpriotrap", CONF_RES_LPTRAP }, - { "ntpport", CONF_RES_NTPPORT }, - { "limited", CONF_RES_LIMITED }, - { "", CONFIG_UNKNOWN } -}; - -/* - * "trap" modifier keywords - */ -static struct keyword trap_keywords[] = { - { "port", CONF_TRAP_PORT }, - { "interface", CONF_TRAP_INTERFACE }, - { "", CONFIG_UNKNOWN } -}; - - -/* - * "fudge" modifier keywords - */ -static struct keyword fudge_keywords[] = { - { "time1", CONF_FDG_TIME1 }, - { "time2", CONF_FDG_TIME2 }, - { "stratum", CONF_FDG_STRATUM }, - { "refid", CONF_FDG_REFID }, - { "flag1", CONF_FDG_FLAG1 }, - { "flag2", CONF_FDG_FLAG2 }, - { "flag3", CONF_FDG_FLAG3 }, - { "flag4", CONF_FDG_FLAG4 }, - { "", CONFIG_UNKNOWN } -}; - - -/* - * "filegen" modifier keywords - */ -static struct keyword filegen_keywords[] = { - { "file", CONF_FGEN_FILE }, - { "type", CONF_FGEN_TYPE }, - { "link", CONF_FGEN_FLAG_LINK }, - { "nolink", CONF_FGEN_FLAG_NOLINK }, - { "enable", CONF_FGEN_FLAG_ENABLE }, - { "disable", CONF_FGEN_FLAG_DISABLE }, - { "", CONFIG_UNKNOWN } -}; - -/* - * "type" modifier keywords - */ -static struct keyword fgen_types[] = { - { "none", FILEGEN_NONE }, - { "pid", FILEGEN_PID }, - { "day", FILEGEN_DAY }, - { "week", FILEGEN_WEEK }, - { "month", FILEGEN_MONTH }, - { "year", FILEGEN_YEAR }, - { "age", FILEGEN_AGE }, - { "", CONFIG_UNKNOWN} -}; - -/* - * "enable", "disable" modifier keywords - */ -static struct keyword flags_keywords[] = { - { "auth", PROTO_AUTHENTICATE }, - { "bclient", PROTO_BROADCLIENT }, - { "pll", PROTO_PLL }, - { "pps", PROTO_PPS }, - { "monitor", PROTO_MONITOR }, - { "stats", PROTO_FILEGEN }, - { "", CONFIG_UNKNOWN } -}; - -/* - * Limits on things - */ -#define MAXTOKENS 20 /* 20 tokens on line */ -#define MAXLINE 1024 /* maximum length of line */ -#define MAXPHONE 5 /* maximum number of phone strings */ -#define MAXFILENAME 128 /* maximum length of a file name (alloca()?) */ - - -/* - * Miscellaneous macros - */ -#define STRSAME(s1, s2) (*(s1) == *(s2) && strcmp((s1), (s2)) == 0) -#define ISEOL(c) ((c) == '#' || (c) == '\n' || (c) == '\0') -#define ISSPACE(c) ((c) == ' ' || (c) == '\t') -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -/* - * File descriptor used by the resolver save routines, and temporary file - * name. - */ -static FILE *res_fp; -static char res_file[20]; /* enough for /tmp/xntpXXXXXX\0 */ -#define RES_TEMPFILE "/tmp/xntpXXXXXX" - -/* - * Definitions of things either imported from or exported to outside - */ -#ifdef DEBUG -extern int debug; -#endif -extern char *FindConfig(); - char *progname; - char sys_phone[MAXPHONE][MAXDIAL]; /* ACTS phone numbers */ -static char *xntp_options = "abc:dD:e:f:k:l:mp:r:s:t:v:V:"; - -/* - * Function prototypes - */ -static int gettokens P((FILE *, char *, char **, int *)); -static int matchkey P((char *, struct keyword *)); -static int getnetnum P((char *, struct sockaddr_in *, int)); -static void save_resolve P((char *, int, int, int, int, int, int, u_long)); -static void do_resolve_internal P((void)); -static void abort_resolve P((void)); -static RETSIGTYPE catchchild P((int)); - -/* - * getstartup - search through the options looking for a debugging flag - */ -void -getstartup(argc, argv) - int argc; - char *argv[]; -{ -#ifdef DEBUG - int errflg; - int c; - extern int ntp_optind; - extern char *ntp_optarg; - - debug = 0; /* no debugging by default */ - - /* - * This is a big hack. We don't really want to read command line - * configuration until everything else is initialized, since - * the ability to configure the system may depend on storage - * and the like having been initialized. Except that we also - * don't want to initialize anything until after detaching from - * the terminal, but we won't know to do that until we've - * parsed the command line. Do that now, crudely, and do it - * again later. Our ntp_getopt() is explicitly reusable, by the - * way. Your own mileage may vary. - */ - errflg = 0; - progname = argv[0]; - - /* - * Decode argument list - */ - while ((c = ntp_getopt(argc, argv, xntp_options)) != EOF) - switch (c) { - case 'd': - ++debug; - break; - case 'D': - debug = strtol(ntp_optarg, 0, 0); - printf("Debug1: %s -> %x = %d\n", ntp_optarg, debug, debug); - break; - case '?': - ++errflg; - break; - default: - break; - } - - if (errflg || ntp_optind != argc) { - (void) fprintf(stderr, "usage: %s [ -abd ] [ -c config_file ] [ -e encryption delay ]\n", progname); - (void) fprintf(stderr, "\t\t[ -f frequency file ] [ -k key file ] [ -l log file ]\n"); - (void) fprintf(stderr, "\t\t[ -p pid file ] [ -r broadcast delay ] [ -s status directory ]\n"); - (void) fprintf(stderr, "\t\t[ -t trusted key ] [ -v sys variable ] [ -V default sys variable ]\n"); - exit(2); - } - ntp_optind = 0; /* reset ntp_optind to restart ntp_getopt */ - - if (debug) { -#ifdef NTP_POSIX_SOURCE - static char buf[BUFSIZ]; - setvbuf(stdout, buf, _IOLBF, BUFSIZ); -#else - setlinebuf(stdout); -#endif - } - -#endif /* DEBUG */ -} - -/* - * getconfig - get command line options and read the configuration file - */ -void -getconfig(argc, argv) - int argc; - char *argv[]; -{ - register int i; - int c; - int errflg; - int peerversion; - int minpoll; - int maxpoll; - int ttl; - u_long peerkey; - int peerflags; - int hmode; - struct sockaddr_in peeraddr; - struct sockaddr_in maskaddr; - FILE *fp; - char line[MAXLINE]; - char *(tokens[MAXTOKENS]); - int ntokens; - int tok; - struct interface *localaddr; - char *config_file; - struct refclockstat clock; - int have_keyfile; - char keyfile[MAXFILENAME]; - extern int ntp_optind; - extern char *ntp_optarg; - extern char *Version; - extern u_long info_auth_keyid; - FILEGEN *filegen; - - /* - * Initialize, initialize - */ - errflg = 0; -#ifdef DEBUG - debug = 0; -#endif /* DEBUG */ - config_file = CONFIG_FILE; - progname = argv[0]; - res_fp = NULL; - have_keyfile = 0; - memset((char *)sys_phone, 0, sizeof(sys_phone)); - - /* - * install a non default variable with this daemon version - */ - (void) sprintf(line, "daemon_version=\"%s\"", Version); - set_sys_var(line, strlen(line)+1, RO); - - /* - * Decode argument list - */ - while ((c = ntp_getopt(argc, argv, xntp_options)) != EOF) { - switch (c) { - case 'a': - proto_config(PROTO_AUTHENTICATE, 1); - break; - - case 'b': - proto_config(PROTO_BROADCLIENT, 1); - break; - - case 'c': - config_file = ntp_optarg; - break; - - case 'd': -#ifdef DEBUG - debug++; -#else - errflg++; -#endif /* DEBUG */ - break; - case 'D': -#ifdef DEBUG - debug = strtol(ntp_optarg, 0, 0); - printf("Debug2: %s -> %x = %d\n", ntp_optarg, debug, debug); -#endif /* DEBUG */ - break; - - case 'e': - do { - l_fp tmp; - - if (!atolfp(ntp_optarg, &tmp)) { - syslog(LOG_ERR, - "command line encryption delay value %s undecodable", - ntp_optarg); - errflg++; - } else if (tmp.l_ui != 0) { - syslog(LOG_ERR, - "command line encryption delay value %s is unlikely", - ntp_optarg); - errflg++; - } else { - proto_config(PROTO_AUTHDELAY, tmp.l_f); - } - } while (0); - break; - - case 'f': - stats_config(STATS_FREQ_FILE, ntp_optarg); - break; - - case 'k': - getauthkeys(ntp_optarg); - if ((int)strlen(ntp_optarg) >= MAXFILENAME) { - syslog(LOG_ERR, - "key file name too long (>%d, sigh), no name resolution possible", - MAXFILENAME); - } else { - have_keyfile = 1; - (void)strcpy(keyfile, ntp_optarg); - } - break; - - case 'm': - proto_config(PROTO_MULTICAST_ADD, htonl(INADDR_NTP)); - break; - - case 'p': - stats_config(STATS_PID_FILE, ntp_optarg); - break; - - case 'r': - do { - l_fp tmp; - - if (!atolfp(ntp_optarg, &tmp)) { - syslog(LOG_ERR, - "command line broadcast delay value %s undecodable", - ntp_optarg); - } else if (tmp.l_ui != 0) { - syslog(LOG_ERR, - "command line broadcast delay value %s is unlikely", - ntp_optarg); - } else { - proto_config(PROTO_BROADDELAY, tmp.l_f); - } - } while (0); - break; - - case 's': - stats_config(STATS_STATSDIR, ntp_optarg); - break; - - case 't': - do { - u_long tkey; - - tkey = atol(ntp_optarg); - if (tkey <= 0 || tkey > NTP_MAXKEY) { - syslog(LOG_ERR, - "command line trusted key %s is unlikely", - ntp_optarg); - } else { - authtrust(tkey, 1); - } - } while (0); - break; - - case 'v': - case 'V': - set_sys_var(ntp_optarg, strlen(ntp_optarg)+1, - RW | ((c == 'V') ? DEF : 0)); - break; - - default: - errflg++; - break; - } - } - - if (errflg || ntp_optind != argc) { - (void) fprintf(stderr, - "usage: %s [ -bd ] [ -c config_file ]\n", progname); - exit(2); - } - - if ((fp = fopen(FindConfig(config_file), "r")) == NULL) { - /* - * Broadcast clients can sometimes run without - * a configuration file. - */ - return; - } - - while ((tok = gettokens(fp, line, tokens, &ntokens)) - != CONFIG_UNKNOWN) { - switch(tok) { - case CONFIG_PEER: - case CONFIG_SERVER: - case CONFIG_BROADCAST: - if (tok == CONFIG_PEER) - hmode = MODE_ACTIVE; - else if (tok == CONFIG_SERVER) - hmode = MODE_CLIENT; - else - hmode = MODE_BROADCAST; - - if (ntokens < 2) { - syslog(LOG_ERR, - "No address for %s, line ignored", - tokens[0]); - break; - } - - if (!getnetnum(tokens[1], &peeraddr, 0)) { - errflg = -1; - } else { - errflg = 0; - - if ( -#ifdef REFCLOCK - !ISREFCLOCKADR(&peeraddr) && -#endif - ISBADADR(&peeraddr)) { - syslog(LOG_ERR, - "attempt to configure invalid address %s", - ntoa(&peeraddr)); - break; - } - } - - peerversion = NTP_VERSION; - minpoll = NTP_MINDPOLL; - maxpoll = NTP_MAXDPOLL; - peerkey = 0; - peerflags = 0; - ttl = 0; - for (i = 2; i < ntokens; i++) - switch (matchkey(tokens[i], mod_keywords)) { - case CONF_MOD_VERSION: - if (i >= ntokens-1) { - syslog(LOG_ERR, - "peer/server version requires an argument"); - errflg = 1; - break; - } - peerversion = atoi(tokens[++i]); - if ((u_char)peerversion > NTP_VERSION - || (u_char)peerversion < NTP_OLDVERSION) { - syslog(LOG_ERR, - "inappropriate version number %s, line ignored", - tokens[i]); - errflg = 1; - } - break; - - case CONF_MOD_KEY: - if (i >= ntokens-1) { - syslog(LOG_ERR, - "key: argument required"); - errflg = 1; - break; - } - peerkey = atol(tokens[++i]); - peerflags |= FLAG_AUTHENABLE; - break; - - case CONF_MOD_MINPOLL: - if (i >= ntokens-1) { - syslog(LOG_ERR, - "minpoll: argument required"); - errflg = 1; - break; - } - minpoll = atoi(tokens[++i]); - if (minpoll < NTP_MINPOLL) - minpoll = NTP_MINPOLL; - break; - - case CONF_MOD_MAXPOLL: - if (i >= ntokens-1) { - syslog(LOG_ERR, - "maxpoll: argument required" -); - errflg = 1; - break; - } - maxpoll = atoi(tokens[++i]); - if (maxpoll > NTP_MAXPOLL) - maxpoll = NTP_MAXPOLL; - break; - - case CONF_MOD_PREFER: - peerflags |= FLAG_PREFER; - break; - - case CONF_MOD_TTL: - if (i >= ntokens-1) { - syslog(LOG_ERR, - "ttl: argument required"); - errflg = 1; - break; - } - ttl = atoi(tokens[++i]); - break; - - case CONF_MOD_MODE: - if (i >= ntokens-1) { - syslog(LOG_ERR, - "mode: argument required"); - errflg = 1; - break; - } - ttl = atoi(tokens[++i]); - break; - - case CONFIG_UNKNOWN: - errflg = 1; - break; - } - if (minpoll > maxpoll) { - syslog(LOG_ERR, "config error: minpoll > maxpoll"); - errflg = 1; - } - if (errflg == 0) { - if (peer_config(&peeraddr, - (struct interface *)0, hmode, peerversion, - minpoll, maxpoll, peerflags, ttl, peerkey) - == 0) { - syslog(LOG_ERR, - "configuration of %s failed", - ntoa(&peeraddr)); - } - } else if (errflg == -1) { - save_resolve(tokens[1], hmode, peerversion, - minpoll, maxpoll, peerflags, ttl, peerkey); - } - break; - - case CONFIG_PRECISION: - if (ntokens >= 2) { - i = atoi(tokens[1]); - if (i >= 0 || i < -25) - syslog(LOG_ERR, - "unlikely precision %s, line ignored", - tokens[1]); - else - proto_config(PROTO_PRECISION, i); - } - break; - - case CONFIG_DRIFTFILE: - if (ntokens >= 2) - stats_config(STATS_FREQ_FILE, tokens[1]); - else - stats_config(STATS_FREQ_FILE, (char *)0); - break; - - case CONFIG_PIDFILE: - if (ntokens >= 2) - stats_config(STATS_PID_FILE, tokens[1]); - else - stats_config(STATS_PID_FILE, (char *)0); - break; - - case CONFIG_BROADCASTCLIENT: - proto_config(PROTO_BROADCLIENT, 1); - break; - - case CONFIG_MULTICASTCLIENT: - if (ntokens > 1) { - for (i = 1; i < ntokens; i++) { - if (getnetnum(tokens[i], &peeraddr, 1)) - proto_config(PROTO_MULTICAST_ADD, - peeraddr.sin_addr.s_addr); - } - } else - proto_config(PROTO_MULTICAST_ADD, htonl(INADDR_NTP)); - break; - - case CONFIG_AUTHENTICATE: - errflg = 0; - if (ntokens >= 2) { - if (STREQ(tokens[1], "yes")) - proto_config(PROTO_AUTHENTICATE, 1); - else if (STREQ(tokens[1], "no")) - proto_config(PROTO_AUTHENTICATE, 0); - else - errflg++; - } else { - errflg++; - } - - if (errflg) - syslog(LOG_ERR, - "should be `authenticate yes|no'"); - break; - - case CONFIG_KEYS: - if (ntokens >= 2) { - getauthkeys(tokens[1]); - if ((int)strlen(tokens[1]) >= MAXFILENAME) { - syslog(LOG_ERR, - "key file name too long (>%d, sigh), no name resolution possible", - MAXFILENAME); - } else { - have_keyfile = 1; - (void)strcpy(keyfile, tokens[1]); - } - } - break; - - case CONFIG_MONITOR: - errflg = 0; - if (ntokens >= 2) { - if (STREQ(tokens[1], "yes")) - mon_start(MON_ON); - else if (STREQ(tokens[1], "no")) - mon_stop(MON_ON); - else - errflg++; - } else { - errflg++; - } - - if (errflg) - syslog(LOG_ERR, - "should be `monitor yes|no'"); - break; - - case CONFIG_AUTHDELAY: - if (ntokens >= 2) { - l_fp tmp; - - if (!atolfp(tokens[1], &tmp)) { - syslog(LOG_ERR, - "authdelay value %s undecodable", - tokens[1]); - } else if (tmp.l_ui != 0) { - syslog(LOG_ERR, - "authdelay value %s is unlikely", - tokens[1]); - } else { - proto_config(PROTO_AUTHDELAY, tmp.l_f); - } - } - break; - - case CONFIG_RESTRICT: - if (ntokens < 2) { - syslog(LOG_ERR, "restrict requires an address"); - break; - } - if (STREQ(tokens[1], "default")) - peeraddr.sin_addr.s_addr = htonl(INADDR_ANY); - else if (!getnetnum(tokens[1], &peeraddr, 1)) - break; - - /* - * Use peerversion as flags, peerkey as mflags. Ick. - */ - peerversion = 0; - peerkey = 0; - errflg = 0; - maskaddr.sin_addr.s_addr = ~0; - for (i = 2; i < ntokens; i++) { - switch (matchkey(tokens[i], res_keywords)) { - case CONF_RES_MASK: - if (i >= ntokens-1) { - syslog(LOG_ERR, - "mask keyword needs argument"); - errflg++; - break; - } - i++; - if (!getnetnum(tokens[i], &maskaddr, 1)) - errflg++; - break; - - case CONF_RES_IGNORE: - peerversion |= RES_IGNORE; - break; - - case CONF_RES_NOSERVE: - peerversion |= RES_DONTSERVE; - break; - - case CONF_RES_NOTRUST: - peerversion |= RES_DONTTRUST; - break; - - case CONF_RES_NOQUERY: - peerversion |= RES_NOQUERY; - break; - - case CONF_RES_NOMODIFY: - peerversion |= RES_NOMODIFY; - break; - - case CONF_RES_NOPEER: - peerversion |= RES_NOPEER; - break; - - case CONF_RES_NOTRAP: - peerversion |= RES_NOTRAP; - break; - - case CONF_RES_LPTRAP: - peerversion |= RES_LPTRAP; - break; - - case CONF_RES_NTPPORT: - peerkey |= RESM_NTPONLY; - break; - - case CONF_RES_LIMITED: - peerversion |= RES_LIMITED; - break; - - case CONFIG_UNKNOWN: - errflg++; - break; - } - } - if (SRCADR(&peeraddr) == htonl(INADDR_ANY)) - maskaddr.sin_addr.s_addr = 0; - if (!errflg) - restrict(RESTRICT_FLAGS, &peeraddr, &maskaddr, - (int)peerkey, peerversion); - break; - - case CONFIG_BDELAY: - if (ntokens >= 2) { - l_fp tmp; - - if (!atolfp(tokens[1], &tmp)) { - syslog(LOG_ERR, - "broadcastdelay value %s undecodable", - tokens[1]); - } else if (tmp.l_ui != 0) { - syslog(LOG_ERR, - "broadcastdelay value %s is unlikely", - tokens[1]); - } else { - proto_config(PROTO_BROADDELAY, tmp.l_f); - } - } - break; - - case CONFIG_TRUSTEDKEY: - for (i = 1; i < ntokens; i++) { - u_long tkey; - - tkey = atol(tokens[i]); - if (tkey == 0) { - syslog(LOG_ERR, - "trusted key %s unlikely", - tokens[i]); - } else { - authtrust(tkey, 1); - } - } - break; - - case CONFIG_REQUESTKEY: - if (ntokens >= 2) { - u_long rkey; - - if (!atouint(tokens[1], &rkey)) { - syslog(LOG_ERR, - "%s is undecodeable as request key", - tokens[1]); - } else if (rkey == 0) { - syslog(LOG_ERR, - "%s makes a poor request keyid", - tokens[1]); - } else { -#ifdef DEBUG - if (debug > 3) - printf( - "set info_auth_key to %lu\n", rkey); -#endif - info_auth_keyid = rkey; - } - } - break; - - case CONFIG_CONTROLKEY: - if (ntokens >= 2) { - u_long ckey; - extern u_long ctl_auth_keyid; - - ckey = atol(tokens[1]); - if (ckey == 0) { - syslog(LOG_ERR, - "%s makes a poor control keyid", - tokens[1]); - } else { - ctl_auth_keyid = ckey; - } - } - break; - - case CONFIG_TRAP: - if (ntokens < 2) { - syslog(LOG_ERR, - "no address for trap command, line ignored"); - break; - } - if (!getnetnum(tokens[1], &peeraddr, 1)) - break; - - /* - * Use peerversion for port number. Barf. - */ - errflg = 0; - peerversion = 0; - localaddr = 0; - for (i = 2; i < ntokens-1; i++) - switch (matchkey(tokens[i], trap_keywords)) { - case CONF_TRAP_PORT: - if (i >= ntokens-1) { - syslog(LOG_ERR, - "trap port requires an argument"); - errflg = 1; - break; - } - peerversion = atoi(tokens[++i]); - if (peerversion <= 0 - || peerversion > 32767) { - syslog(LOG_ERR, - "invalid port number %s, trap ignored", - tokens[i]); - errflg = 1; - } - break; - - case CONF_TRAP_INTERFACE: - if (i >= ntokens-1) { - syslog(LOG_ERR, - "trap interface requires an argument"); - errflg = 1; - break; - } - - if (!getnetnum(tokens[++i], - &maskaddr, 1)) { - errflg = 1; - break; - } - - localaddr = findinterface(&maskaddr); - if (localaddr == NULL) { - syslog(LOG_ERR, - "can't find interface with address %s", - ntoa(&maskaddr)); - errflg = 1; - } - break; - - case CONFIG_UNKNOWN: - errflg++; - break; - } - - if (!errflg) { - extern struct interface *any_interface; - - if (peerversion != 0) - peeraddr.sin_port = htons(peerversion); - else - peeraddr.sin_port = htons(TRAPPORT); - if (localaddr == NULL) - localaddr = any_interface; - if (!ctlsettrap(&peeraddr, localaddr, 0, - NTP_VERSION)) - syslog(LOG_ERR, - "can't set trap for %s, no resources", - ntoa(&peeraddr)); - } - break; - - case CONFIG_FUDGE: - if (ntokens < 2) { - syslog(LOG_ERR, - "no address for fudge command, line ignored"); - break; - } - if (!getnetnum(tokens[1], &peeraddr, 1)) - break; - - if (!ISREFCLOCKADR(&peeraddr)) { - syslog(LOG_ERR, - "%s is inappropriate address for the fudge command, line ignored", - ntoa(&peeraddr)); - break; - } - - memset((char *)&clock, 0, sizeof clock); - errflg = 0; - for (i = 2; i < ntokens-1; i++) { - switch (c = matchkey(tokens[i], - fudge_keywords)) { - case CONF_FDG_TIME1: - if (!atolfp(tokens[++i], - &clock.fudgetime1)) { - syslog(LOG_ERR, - "fudge %s time1 value in error", - ntoa(&peeraddr)); - errflg = i; - break; - } - clock.haveflags |= CLK_HAVETIME1; - break; - - case CONF_FDG_TIME2: - if (!atolfp(tokens[++i], - &clock.fudgetime2)) { - syslog(LOG_ERR, - "fudge %s time2 value in error", - ntoa(&peeraddr)); - errflg = i; - break; - } - clock.haveflags |= CLK_HAVETIME2; - break; - - case CONF_FDG_STRATUM: - if (!atoint(tokens[++i], - (long *)&clock.fudgeval1)) { - syslog(LOG_ERR, - "fudge %s stratum value in error", - ntoa(&peeraddr)); - errflg = i; - break; - } - clock.haveflags |= CLK_HAVEVAL1; - break; - - case CONF_FDG_REFID: - strncpy((char *)&clock.fudgeval2, - tokens[++i], 4); - clock.haveflags |= CLK_HAVEVAL2; - break; - - case CONF_FDG_FLAG1: - case CONF_FDG_FLAG2: - case CONF_FDG_FLAG3: - case CONF_FDG_FLAG4: - if (!atouint(tokens[++i], &peerkey) - || peerkey > 1) { - syslog(LOG_ERR, - "fudge %s flag value in error", - ntoa(&peeraddr)); - errflg = i; - break; - } - switch(c) { - case CONF_FDG_FLAG1: - c = CLK_FLAG1; - clock.haveflags|=CLK_HAVEFLAG1; - break; - case CONF_FDG_FLAG2: - c = CLK_FLAG2; - clock.haveflags|=CLK_HAVEFLAG2; - break; - case CONF_FDG_FLAG3: - c = CLK_FLAG3; - clock.haveflags|=CLK_HAVEFLAG3; - break; - case CONF_FDG_FLAG4: - c = CLK_FLAG4; - clock.haveflags|=CLK_HAVEFLAG4; - break; - } - if (peerkey == 0) - clock.flags &= ~c; - else - clock.flags |= c; - break; - - case CONFIG_UNKNOWN: - errflg = -1; - break; - } - } - -#ifdef REFCLOCK - /* - * If reference clock support isn't defined the - * fudge line will still be accepted and syntax - * checked, but will essentially do nothing. - */ - if (!errflg) { - refclock_control(&peeraddr, &clock, - (struct refclockstat *)0); - } -#endif - break; - - case CONFIG_STATSDIR: - if (ntokens >= 2) { - stats_config(STATS_STATSDIR,tokens[1]); - } - break; - - case CONFIG_STATISTICS: - for (i = 1; i < ntokens; i++) { - filegen = filegen_get(tokens[i]); - - if (filegen == NULL) { - syslog(LOG_ERR, - "no statistics named %s available", - tokens[i]); - continue; - } -#ifdef DEBUG - if (debug > 3) - printf("enabling filegen for %s statistics \"%s%s\"\n", - tokens[i], filegen->prefix, filegen->basename); -#endif - filegen->flag |= FGEN_FLAG_ENABLED; - } - break; - - case CONFIG_FILEGEN: - if (ntokens < 2) { - syslog(LOG_ERR, - "no id for filegen command, line ignored"); - break; - } - - filegen = filegen_get(tokens[1]); - if (filegen == NULL) { - syslog(LOG_ERR, - "unknown filegen \"%s\" ignored", - tokens[1]); - break; - } - /* - * peerversion is (ab)used for filegen file (index) - * peerkey is (ab)used for filegen type - * peerflags is (ab)used for filegen flags - */ - peerversion = 0; - peerkey = filegen->type; - peerflags = filegen->flag; - errflg = 0; - - for (i = 2; i < ntokens; i++) { - switch (matchkey(tokens[i], filegen_keywords)) { - case CONF_FGEN_FILE: - if (i >= ntokens - 1) { - syslog(LOG_ERR, - "filegen %s file requires argument", - tokens[1]); - errflg = i; - break; - } - peerversion = ++i; - break; - case CONF_FGEN_TYPE: - if (i >= ntokens -1) { - syslog(LOG_ERR, - "filegen %s type requires argument", - tokens[1]); - errflg = i; - break; - } - peerkey = matchkey(tokens[++i], fgen_types); - if (peerkey == CONFIG_UNKNOWN) { - syslog(LOG_ERR, - "filegen %s unknown type \"%s\"", - tokens[1], tokens[i]); - errflg = i; - break; - } - break; - - case CONF_FGEN_FLAG_LINK: - peerflags |= FGEN_FLAG_LINK; - break; - - case CONF_FGEN_FLAG_NOLINK: - peerflags &= ~FGEN_FLAG_LINK; - break; - - case CONF_FGEN_FLAG_ENABLE: - peerflags |= FGEN_FLAG_ENABLED; - break; - - case CONF_FGEN_FLAG_DISABLE: - peerflags &= ~FGEN_FLAG_ENABLED; - break; - } - } - if (!errflg) { - filegen_config(filegen, tokens[peerversion], - (u_char)peerkey, (u_char)peerflags); - } - break; - - case CONFIG_SETVAR: - if (ntokens < 2) { - syslog(LOG_ERR, - "no value for setvar command - line ignored"); - } else { - set_sys_var(tokens[1], strlen(tokens[1])+1, RW | - ((((ntokens > 2) && !strcmp(tokens[2], - "default"))) ? DEF : 0)); - } - break; - - case CONFIG_CLIENTLIMIT: - if (ntokens < 2) { - syslog(LOG_ERR, - "no value for clientlimit command - line ignored"); - } else { - u_long i; - if (!atouint(tokens[1], &i) || !i) { - syslog(LOG_ERR, - "illegal value for clientlimit command - line ignored"); - } else { - extern u_long client_limit; - char bp[80]; - -#ifdef DEBUG - if (debug) - sprintf(bp, "client_limit=%lu", i); -#endif - set_sys_var(bp, strlen(bp)+1, RO); - client_limit = i; - } - } - break; - - case CONFIG_CLIENTPERIOD: - if (ntokens < 2) { - syslog(LOG_ERR, - "no value for clientperiod command - line ignored"); - } else { - u_long i; - - if (!atouint(tokens[1], &i) || i < 64) { - syslog(LOG_ERR, - "illegal value for clientperiod command - line ignored"); - } else { - extern u_long client_limit_period; - char bp[80]; - - sprintf(bp, "client_limit_period=%ld", i); - set_sys_var(bp, strlen(bp)+1, RO); - client_limit_period = i; - } - } - break; - - case CONFIG_ENABLE: - for (i = 1; i < ntokens; i++) { - int flag; - - flag = matchkey(tokens[i], flags_keywords); - if (flag == CONFIG_UNKNOWN) { - syslog(LOG_ERR, - "enable unknown flag %s", - tokens[i]); - errflg = 1; - break; - } - proto_config(flag, 1L); - } - break; - - case CONFIG_DISABLE: - for (i = 1; i < ntokens; i++) { - int flag; - - flag = matchkey(tokens[i], flags_keywords); - if (flag == CONFIG_UNKNOWN) { - syslog(LOG_ERR, - "disable unknown flag %s", - tokens[i]); - errflg = 1; - break; - } - proto_config(flag, 0L); - } - break; - - case CONFIG_PHONE: - for (i = 1; i < ntokens && i < MAXPHONE; i++) { - (void)strncpy(sys_phone[i - 1], - tokens[i], MAXDIAL); - } - sys_phone[i - 1][0] = '\0'; - break; - } - } - (void) fclose(fp); - - if (res_fp != NULL) { - /* - * Need name resolution - */ - do_resolve_internal(); - } -} - - - -/* - * gettokens - read a line and return tokens - */ -static int -gettokens(fp, line, tokenlist, ntokens) - FILE *fp; - char *line; - char **tokenlist; - int *ntokens; -{ - register char *cp; - register int eol; - register int ntok; - register int quoted = 0; - - /* - * Find start of first token - */ -again: - while ((cp = fgets(line, MAXLINE, fp)) != NULL) { - cp = line; - while (ISSPACE(*cp)) - cp++; - if (!ISEOL(*cp)) - break; - } - if (cp == NULL) { - *ntokens = 0; - return CONFIG_UNKNOWN; /* hack. Is recognized as EOF */ - } - - /* - * Now separate out the tokens - */ - eol = 0; - ntok = 0; - while (!eol) { - tokenlist[ntok++] = cp; - while (!ISEOL(*cp) && (!ISSPACE(*cp) || quoted)) - quoted ^= (*cp++ == '"'); - - if (ISEOL(*cp)) { - *cp = '\0'; - eol = 1; - } else { /* must be space */ - *cp++ = '\0'; - while (ISSPACE(*cp)) - cp++; - if (ISEOL(*cp)) - eol = 1; - } - if (ntok == MAXTOKENS) - eol = 1; - } - - /* - * Return the match - */ - *ntokens = ntok; - ntok = matchkey(tokenlist[0], keywords); - if (ntok == CONFIG_UNKNOWN) - goto again; - return ntok; -} - - - -/* - * matchkey - match a keyword to a list - */ -static int -matchkey(word, keys) - register char *word; - register struct keyword *keys; -{ - for (;;) { - if (keys->keytype == CONFIG_UNKNOWN) { - syslog(LOG_ERR, - "configure: keyword \"%s\" unknown, line ignored", - word); - return CONFIG_UNKNOWN; - } - if (STRSAME(word, keys->text)) - return keys->keytype; - keys++; - } -} - - -/* - * getnetnum - return a net number (this is crude, but careful) - */ -static int -getnetnum(num, addr, complain) - char *num; - struct sockaddr_in *addr; - int complain; -{ - register char *cp; - register char *bp; - register int i; - register int temp; - char buf[80]; /* will core dump on really stupid stuff */ - u_long netnum; - -/* XXX ELIMINATE replace with decodenetnum */ - cp = num; - netnum = 0; - for (i = 0; i < 4; i++) { - bp = buf; - while (isdigit(*cp)) - *bp++ = *cp++; - if (bp == buf) - break; - - if (i < 3) { - if (*cp++ != '.') - break; - } else if (*cp != '\0') - break; - - *bp = '\0'; - temp = atoi(buf); - if (temp > 255) - break; - netnum <<= 8; - netnum += temp; -#ifdef DEBUG - if (debug > 3) - printf("getnetnum %s step %d buf %s temp %d netnum %lu\n", - num, i, buf, temp, netnum); -#endif - } - - if (i < 4) { - if (complain) - syslog(LOG_ERR, - "configure: \"%s\" not valid host number, line ignored", - num); -#ifdef DEBUG - if (debug > 3) - printf( - "configure: \"%s\" not valid host number, line ignored\n", - num); -#endif - return 0; - } - - /* - * make up socket address. Clear it out for neatness. - */ - memset((char *)addr, 0, sizeof(struct sockaddr_in)); - addr->sin_family = AF_INET; - addr->sin_port = htons(NTP_PORT); - addr->sin_addr.s_addr = htonl(netnum); -#ifdef DEBUG - if (debug > 1) - printf("getnetnum given %s, got %s (%lx)\n", - num, ntoa(addr), netnum); -#endif - return 1; -} - - -/* - * catchchild - receive the resolver's exit status - */ -static RETSIGTYPE -catchchild(sig) -int sig; -{ - /* - * We only start up one child, and if we're here - * it should have already exited. Hence the following - * shouldn't hang. If it does, please tell me. - */ - (void) wait(0); -} - - -/* - * save_resolve - save configuration info into a file for later name resolution - */ -static void -save_resolve(name, mode, version, minpoll, maxpoll, flags, ttl, keyid) - char *name; - int mode; - int version; - int minpoll; - int maxpoll; - int flags; - int ttl; - u_long keyid; -{ - if (res_fp == NULL) { - (void) strcpy(res_file, RES_TEMPFILE); - (void) mktemp(res_file); - res_fp = fopen(res_file, "w"); - if (res_fp == NULL) { - syslog(LOG_ERR, "open failed for %s: %m", res_file); - return; - } - } - -#ifdef DEBUG - if (debug) { - printf("resolving %s\n", name); - } -#endif - - (void) fprintf(res_fp, "%s %d %d %d %d %d %d %lu\n", name, mode, - version, minpoll, maxpoll, flags, ttl, keyid); -} - - -/* - * abort_resolve - terminate the resolver stuff and delete the file - */ -static void -abort_resolve() -{ - /* - * In an ideal world we would might reread the file and - * log the hosts which aren't getting configured. Since - * this is too much work, however, just close and delete - * the temp file. - */ - if (res_fp != NULL) - (void) fclose(res_fp); - res_fp = NULL; - - (void) unlink(res_file); -} - - -#define KEY_TYPE_MD5 4 - -/* - * do_resolve_internal - start up the resolver function (not program) - */ -static void -do_resolve_internal() -{ - int i; - - extern u_long req_keyid; /* request keyid */ - extern char *req_file; /* name of the file with config info */ - extern u_long info_auth_keyid; - - if (res_fp == NULL) { - /* belch */ - syslog(LOG_ERR, - "internal error in do_resolve_internal: res_fp == NULL"); - exit(1); - } - - /* we are done with this now */ - (void) fclose(res_fp); - res_fp = NULL; - - /* find a keyid */ - if (info_auth_keyid == 0) - req_keyid = 65535; - else - req_keyid = info_auth_keyid; - - /* if doesn't exist, make up one at random */ - if (!authhavekey(req_keyid)) { - char rankey[9]; - struct timeval now; - - /* generate random key */ - GETTIMEOFDAY(&now, (struct timezone *)0); - srand(now.tv_sec * now.tv_usec); - for (i = 0; i < 8; i++) - rankey[i] = (rand() % 255) + 1; - rankey[8] = 0; - authusekey(req_keyid, KEY_TYPE_MD5, rankey); - } - - /* save keyid so we will accept config requests with it */ - info_auth_keyid = req_keyid; - req_file = res_file; /* set up pointer to res file */ - (void) signal_no_reset(SIGCHLD, catchchild); - - i = fork(); - if (i == 0) { - /* - * this used to close everything - * I don't think this is necessary - */ - (void) signal_no_reset(SIGCHLD, SIG_DFL); - ntp_intres(); - - /* - * If we got here, the intres code screwed up. - * Print something so we don't die without complaint - */ - syslog(LOG_ERR, "call to ntp_intres lost"); - abort_resolve(); - exit(1); - } - if (i == -1) { - syslog(LOG_ERR, "fork() failed, can't start ntp_intres"); - (void) signal_no_reset(SIGCHLD, SIG_DFL); - abort_resolve(); - } -} diff --git a/usr.sbin/xntpd/xntpd/ntp_control.c b/usr.sbin/xntpd/xntpd/ntp_control.c deleted file mode 100644 index af4365c9e3d1..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_control.c +++ /dev/null @@ -1,2690 +0,0 @@ -/* - * ntp_control.c - respond to control messages and send async traps - */ -#include <stdio.h> -#include <ctype.h> -#include <sys/types.h> -#include <signal.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_control.h" -#include "ntp_stdlib.h" - -/* - * Structure to hold request procedure information - */ -#define NOAUTH 0 -#define AUTH 1 - -#define NO_REQUEST (-1) - -struct ctl_proc { - short control_code; /* defined request code */ - u_short flags; /* flags word */ - void (*handler)(); /* routine to handle request */ -}; - -/* - * Only one flag. Authentication required or not. - */ -#define NOAUTH 0 -#define AUTH 1 - -/* - * Request processing routines - */ -static void ctl_error P((int)); -static u_short ctlclkstatus P((struct refclockstat *)); -static void ctl_flushpkt P((int)); -static void ctl_putdata P((char *, int, int)); -static void ctl_putstr P((char *, char *, int)); -static void ctl_putlfp P((char *, l_fp *)); -static void ctl_putfp P((char *, s_fp)); -static void ctl_putufp P((char *, u_fp)); -static void ctl_putuint P((char *, u_long)); -static void ctl_puthex P((char *, u_long)); -static void ctl_putint P((char *, long)); -static void ctl_putts P((char *, l_fp *)); -static void ctl_putadr P((char *, u_long)); -static void ctl_putid P((char *, char *)); -static void ctl_putarray P((char *, s_fp *, int)); -static void ctl_putsys P((int)); -static void ctl_putpeer P((int, struct peer *)); -#ifdef REFCLOCK -static void ctl_putclock P((int, struct refclockstat *, int)); -#endif /* REFCLOCK */ -static struct ctl_var *ctl_getitem P((struct ctl_var *, char **)); -static u_long count_var P((struct ctl_var *)); -static void control_unspec P((struct recvbuf *, int)); -static void read_status P((struct recvbuf *, int)); -static void read_variables P((struct recvbuf *, int)); -static void write_variables P((struct recvbuf *, int)); -static void read_clock_status P((struct recvbuf *, int)); -static void write_clock_status P((struct recvbuf *, int)); -static void set_trap P((struct recvbuf *, int)); -static void unset_trap P((struct recvbuf *, int)); -static struct ctl_trap *ctlfindtrap P((struct sockaddr_in *, struct interface *)); - -static struct ctl_proc control_codes[] = { - { CTL_OP_UNSPEC, NOAUTH, control_unspec }, - { CTL_OP_READSTAT, NOAUTH, read_status }, - { CTL_OP_READVAR, NOAUTH, read_variables }, - { CTL_OP_WRITEVAR, AUTH, write_variables }, - { CTL_OP_READCLOCK, NOAUTH, read_clock_status }, - { CTL_OP_WRITECLOCK, NOAUTH, write_clock_status }, - { CTL_OP_SETTRAP, NOAUTH, set_trap }, - { CTL_OP_UNSETTRAP, NOAUTH, unset_trap }, - { NO_REQUEST, 0 } -}; - -/* - * System variable values. The array can be indexed by - * the variable index to find the textual name. - */ -static struct ctl_var sys_var[] = { - { 0, PADDING, "" }, /* 0 */ - { CS_LEAP, RW, "leap" }, /* 1 */ - { CS_STRATUM, RO, "stratum" }, /* 2 */ - { CS_PRECISION, RO, "precision" }, /* 3 */ - { CS_ROOTDELAY, RO, "rootdelay" }, /* 4 */ - { CS_ROOTDISPERSION, RO, "rootdispersion" }, /* 5 */ - { CS_REFID, RO, "refid" }, /* 6 */ - { CS_REFTIME, RO, "reftime" }, /* 7 */ - { CS_POLL, RO, "poll" }, /* 8 */ - { CS_PEERID, RO, "peer" }, /* 9 */ - { CS_OFFSET, RO, "phase" }, /* 10 */ - { CS_DRIFT, RO, "freq" }, /* 11 */ - { CS_COMPLIANCE, RO, "error" }, /* 12 */ - { CS_CLOCK, RO, "clock" }, /* 13 */ - { CS_LEAPIND, RW, "leapindicator" }, /* 14 */ - { CS_LEAPWARNING, RW, "leapwarning" }, /* 15 */ - { CS_PROCESSOR, RO, "processor" }, /* 16 */ - { CS_SYSTEM, RO, "system" }, /* 17 */ - { CS_KEYID, RO, "keyid" }, /* 18 */ - { CS_REFSKEW, RO, "refskew" }, /* 19 */ - { CS_VARLIST, RO, "sys_var_list" },/* 20 */ - { 0, EOV, "" } -}; - -static struct ctl_var *ext_sys_var = (struct ctl_var *)0; - -/* - * System variables we print by default (in fuzzball order, more-or-less) - */ -static u_char def_sys_var[] = { - CS_SYSTEM, - CS_LEAP, - CS_STRATUM, - CS_ROOTDELAY, - CS_ROOTDISPERSION, - CS_PEERID, - CS_REFID, - CS_REFTIME, - CS_POLL, - CS_CLOCK, - CS_OFFSET, - CS_DRIFT, - CS_COMPLIANCE, - 0 -}; - - -/* - * Peer variable list - */ -static struct ctl_var peer_var[] = { - { 0, PADDING, "" }, /* 0 */ - { CP_CONFIG, RO, "config" }, /* 1 */ - { CP_AUTHENABLE, RO, "authenable" }, /* 2 */ - { CP_AUTHENTIC, RO, "authentic" }, /* 3 */ - { CP_SRCADR, RO, "srcadr" }, /* 4 */ - { CP_SRCPORT, RO, "srcport" }, /* 5 */ - { CP_DSTADR, RO, "dstadr" }, /* 6 */ - { CP_DSTPORT, RO, "dstport" }, /* 7 */ - { CP_LEAP, RO, "leap" }, /* 8 */ - { CP_HMODE, RO, "hmode" }, /* 9 */ - { CP_STRATUM, RO, "stratum" }, /* 10 */ - { CP_PPOLL, RO, "ppoll" }, /* 11 */ - { CP_HPOLL, RO, "hpoll" }, /* 12 */ - { CP_PRECISION, RO, "precision" }, /* 13 */ - { CP_ROOTDELAY, RO, "rootdelay" }, /* 14 */ - { CP_ROOTDISPERSION, RO, "rootdispersion" }, /* 15 */ - { CP_REFID, RO, "refid" }, /* 16 */ - { CP_REFTIME, RO, "reftime" }, /* 17 */ - { CP_ORG, RO, "org" }, /* 18 */ - { CP_REC, RO, "rec" }, /* 19 */ - { CP_XMT, RO, "xmt" }, /* 20 */ - { CP_REACH, RO, "reach" }, /* 21 */ - { CP_VALID, RO, "valid" }, /* 22 */ - { CP_TIMER, RO, "timer" }, /* 23 */ - { CP_DELAY, RO, "delay" }, /* 24 */ - { CP_OFFSET, RO, "offset" }, /* 25 */ - { CP_DISPERSION,RO, "dispersion" }, /* 26 */ - { CP_KEYID, RO, "keyid" }, /* 27 */ - { CP_FILTDELAY, RO, "filtdelay" }, /* 28 */ - { CP_FILTOFFSET, RO, "filtoffset" }, /* 29 */ - { CP_PMODE, RO, "pmode" }, /* 30 */ - { CP_RECEIVED, RO, "received" }, /* 31 */ - { CP_SENT, RO, "sent" }, /* 32 */ - { CP_FILTERROR, RO, "filterror" }, /* 33 */ - { CP_FLASH, RO, "flash" }, /* 34 */ - { CP_DISP, PADDING,"" }, /* 35 */ - { CP_VARLIST, RO, "peer_var_list" }, /* 36 */ - { 0, EOV, "" } -}; - - -/* - * Peer variables we print by default - */ -static u_char def_peer_var[] = { - CP_SRCADR, - CP_SRCPORT, - CP_DSTADR, - CP_DSTPORT, - CP_KEYID, - CP_STRATUM, - CP_PRECISION, - CP_ROOTDELAY, - CP_ROOTDISPERSION, - CP_REFID, - CP_REFTIME, - CP_DELAY, - CP_OFFSET, - CP_DISPERSION, - CP_REACH, - CP_VALID, - CP_HMODE, - CP_PMODE, - CP_HPOLL, - CP_PPOLL, - CP_LEAP, - CP_FLASH, - CP_ORG, - CP_REC, - CP_XMT, - CP_FILTDELAY, - CP_FILTOFFSET, - CP_FILTERROR, - 0 -}; - - -#ifdef REFCLOCK -/* - * Clock variable list - */ -static struct ctl_var clock_var[] = { - { 0, PADDING, "" }, /* 0 */ - { CC_TYPE, RO, "type" }, /* 1 */ - { CC_TIMECODE, RO, "timecode" }, /* 2 */ - { CC_POLL, RO, "poll" }, /* 3 */ - { CC_NOREPLY, RO, "noreply" }, /* 4 */ - { CC_BADFORMAT, RO, "badformat" }, /* 5 */ - { CC_BADDATA, RO, "baddata" }, /* 6 */ - { CC_FUDGETIME1, RO, "fudgetime1" }, /* 7 */ - { CC_FUDGETIME2, RO, "fudgetime2" }, /* 8 */ - { CC_FUDGEVAL1, RO, "stratum" }, /* 9 */ - { CC_FUDGEVAL2, RO, "refid" }, /* 10 */ - { CC_FLAGS, RO, "flags" }, /* 11 */ - { CC_DEVICE, RO, "device" }, /* 12 */ - { CC_VARLIST, RO, "clock_var_list" },/* 13 */ - { 0, EOV, "" } -}; - - -/* - * Clock variables printed by default - */ -static u_char def_clock_var[] = { - CC_DEVICE, - CC_TYPE, /* won't be output if device= known */ - CC_TIMECODE, - CC_POLL, - CC_NOREPLY, - CC_BADFORMAT, - CC_BADDATA, - CC_FUDGETIME1, - CC_FUDGETIME2, - CC_FUDGEVAL1, - CC_FUDGEVAL2, - CC_FLAGS, - 0 -}; -#endif - - -/* - * System and processor definitions. These will change for the gizmo board. - */ -#ifndef HAVE_UNAME -#ifndef STR_SYSTEM -#define STR_SYSTEM "UNIX" -#endif -#ifndef STR_PROCESSOR -#define STR_PROCESSOR "unknown" -#endif - -static char str_system[] = STR_SYSTEM; -static char str_processor[] = STR_PROCESSOR; -#else -#include <sys/utsname.h> -static struct utsname utsname; -#endif /* HAVE_UNAME */ - -/* - * Trap structures. We only allow a few of these, and send - * a copy of each async message to each live one. Traps time - * out after an hour, it is up to the trap receipient to - * keep resetting it to avoid being timed out. - */ -/* ntp_request.c */ - struct ctl_trap ctl_trap[CTL_MAXTRAPS]; - int num_ctl_traps; - -/* - * Type bits, for ctlsettrap() call. - */ -#define TRAP_TYPE_CONFIG 0 /* used by configuration code */ -#define TRAP_TYPE_PRIO 1 /* priority trap */ -#define TRAP_TYPE_NONPRIO 2 /* nonpriority trap */ - - -/* - * List relating reference clock types to control message time sources. - * Index by the reference clock type. - * This list will only be used iff the reference clock driver doesn't - * set peer->sstclktype to something different than CTL_SST_TS_UNSPEC. - */ -static u_char clocktypes[] = { - CTL_SST_TS_NTP, /* REFCLK_NONE (0) */ - CTL_SST_TS_LOCAL, /* REFCLK_LOCALCLOCK (1) */ - CTL_SST_TS_UHF, /* REFCLK_GPS_TRAK (2) */ - CTL_SST_TS_HF, /* REFCLK_WWV_PST (3) */ - CTL_SST_TS_LF, /* REFCLK_WWVB_SPECTRACOM (4) */ - CTL_SST_TS_UHF, /* REFCLK_GOES_TRUETIME (5) */ - CTL_SST_TS_UHF, /* REFCLK_GOES_TRAK (6) */ - CTL_SST_TS_HF, /* REFCLK_CHU (7) */ - CTL_SST_TS_LF, /* REFCLOCK_PARSE - default value - driver supplies actual value in peer->sstclktype */ - CTL_SST_TS_LF, /* REFCLK_GPS_MX4200 (9) */ - CTL_SST_TS_UHF, /* REFCLK_GPS_AS2201 (10) */ - CTL_SST_TS_LF, /* REFCLK_OMEGA_TRUETIME (11) */ - CTL_SST_TS_UHF, /* REFCLK_IRIG_TPRO (12) */ - CTL_SST_TS_ATOM, /* REFCLK_ATOM_LEITCH (13) */ - CTL_SST_TS_LF, /* REFCLK_MSF_EES (14) */ - CTL_SST_TS_UHF, /* REFCLK_GPSTM_TRUETIME (15) */ - CTL_SST_TS_UHF, /* REFCLK_IRIG_BANCOMM (16) */ - CTL_SST_TS_UHF, /* REFCLK_GPS_DATU (17) */ - CTL_SST_TS_TELEPHONE, /* REFCLK_NIST_ACT (18) */ - CTL_SST_TS_HF, /* REFCLK_WWV_HEATH (19) */ - CTL_SST_TS_UHF, /* REFCLK_GPS_NMEA (20) */ - CTL_SST_TS_UHF, /* REFCLK_GPS_MOTO (21) */ - CTL_SST_TS_ATOM /* REFCLK_ATOM_PPS (22) */ -}; - - -/* - * Keyid used for authenticating write requests. - */ -u_long ctl_auth_keyid; - -/* - * We keep track of the last error reported by the system internally - */ -static u_char ctl_sys_last_event; -static u_char ctl_sys_num_events; - - -/* - * Statistic counters to keep track of requests and responses. - */ -u_long ctltimereset; /* time stats reset */ -u_long numctlreq; /* number of requests we've received */ -u_long numctlbadpkts; /* number of bad control packets */ -u_long numctlresponses; /* number of resp packets sent with data */ -u_long numctlfrags; /* number of fragments sent */ -u_long numctlerrors; /* number of error responses sent */ -u_long numctltooshort; /* number of too short input packets */ -u_long numctlinputresp; /* number of responses on input */ -u_long numctlinputfrag; /* number of fragments on input */ -u_long numctlinputerr; /* number of input pkts with err bit set */ -u_long numctlbadoffset; /* number of input pkts with nonzero offset */ -u_long numctlbadversion; /* number of input pkts with unknown version */ -u_long numctldatatooshort; /* data too short for count */ -u_long numctlbadop; /* bad op code found in packet */ -u_long numasyncmsgs; /* number of async messages we've sent */ - -/* - * Imported from the I/O module - */ -extern struct interface *any_interface; - -/* - * Imported from the main routines - */ -extern int debug; - -/* - * Imported from the timer module - */ -extern u_long current_time; - -extern struct peer *assoc_hash[]; -extern int pps_control; /* flag for 1-pps signal present */ -/* - * Importations from the protocol module - */ -extern u_char sys_leap; -extern u_char sys_stratum; -extern s_char sys_precision; -extern s_fp sys_rootdelay; -extern u_fp sys_rootdispersion; -extern u_long sys_refid; -extern l_fp sys_reftime; -extern l_fp sys_refskew; -extern u_char sys_poll; -extern struct peer *sys_peer; -/* - * Imported from the loop filter module - */ -extern l_fp last_offset; -extern s_fp drift_comp; -extern u_fp sys_maxd; -extern int pll_control; -/* - * Imported from the leap module - */ -extern u_char leap_indicator; -extern u_char leap_warning; - -/* - * Response packet used by these routines. Also some state information - * so that we can handle packet formatting within a common set of - * subroutines. Note we try to enter data in place whenever possible, - * but the need to set the more bit correctly means we occasionally - * use the extra buffer and copy. - */ -static struct ntp_control rpkt; -static u_char res_version; -static u_char res_opcode; -static u_short res_associd; -static int res_offset; -static u_char * datapt; -static u_char * dataend; -static int datalinelen; -static int datanotbinflag; -static struct sockaddr_in *rmt_addr; -static struct interface *lcl_inter; - -static u_char res_authenticate; -static u_char res_authokay; -static u_long res_keyid; - -#define MAXDATALINELEN (72) - -static u_char res_async; /* set to 1 if this is async trap response */ - -/* - * Pointers for saving state when decoding request packets - */ -static char *reqpt; -static char *reqend; - -/* - * init_control - initialize request data - */ -void -init_control() -{ - int i; - -#ifdef HAVE_UNAME - uname(&utsname); -#endif /* HAVE_UNAME */ - - ctl_clr_stats(); - - ctl_auth_keyid = 0; - ctl_sys_last_event = EVNT_UNSPEC; - ctl_sys_num_events = 0; - - num_ctl_traps = 0; - for (i = 0; i < CTL_MAXTRAPS; i++) - ctl_trap[i].tr_flags = 0; -} - - -/* - * ctl_error - send an error response for the current request - */ -static void -ctl_error(errcode) - int errcode; -{ -#ifdef DEBUG - if (debug >= 4) - printf("sending control error %d\n", errcode); -#endif - /* - * fill in the fields. We assume rpkt.sequence and rpkt.associd - * have already been filled in. - */ - rpkt.r_m_e_op = CTL_RESPONSE|CTL_ERROR|(res_opcode & CTL_OP_MASK); - rpkt.status = htons((errcode<<8) & 0xff00); - rpkt.count = 0; - - /* - * send packet and bump counters - */ - if (res_authenticate) { - int maclen; - - *(u_long *)((u_char *)&rpkt + CTL_HEADER_LEN) - = htonl(res_keyid); - maclen = - authencrypt(res_keyid, (U_LONG *)&rpkt, CTL_HEADER_LEN); - sendpkt(rmt_addr, lcl_inter, -2, (struct pkt *)&rpkt, - CTL_HEADER_LEN + maclen); - } else { - sendpkt(rmt_addr, lcl_inter, -3, (struct pkt *)&rpkt, - CTL_HEADER_LEN); - } - numctlerrors++; -} - - -/* - * process_control - process an incoming control message - */ -void -process_control(rbufp, restrict) - struct recvbuf *rbufp; - int restrict; -{ - register struct ntp_control *pkt; - register int req_count; - register int req_data; - register struct ctl_proc *cc; - int properlen; - int maclen; - -#ifdef DEBUG - if (debug) - printf("in process_control()\n"); -#endif - - /* - * Save the addresses for error responses - */ - numctlreq++; - rmt_addr = &rbufp->recv_srcadr; - lcl_inter = rbufp->dstadr; - pkt = (struct ntp_control *)&rbufp->recv_pkt; - - /* - * If the length is less than required for the header, or - * it is a response or a fragment, ignore this. - */ - if (rbufp->recv_length < CTL_HEADER_LEN - || pkt->r_m_e_op & (CTL_RESPONSE|CTL_MORE|CTL_ERROR) - || pkt->offset != 0) { -#ifdef DEBUG - if (debug) - printf("invalid format in control packet\n"); -#endif - if (rbufp->recv_length < CTL_HEADER_LEN) - numctltooshort++; - if (pkt->r_m_e_op & CTL_RESPONSE) - numctlinputresp++; - if (pkt->r_m_e_op & CTL_MORE) - numctlinputfrag++; - if (pkt->r_m_e_op & CTL_ERROR) - numctlinputerr++; - if (pkt->offset != 0) - numctlbadoffset++; - return; - } - res_version = PKT_VERSION(pkt->li_vn_mode); - if (res_version > NTP_VERSION || res_version < NTP_OLDVERSION) { -#ifdef DEBUG - if (debug) - printf("unknown version %d in control packet\n", - res_version); -#endif - numctlbadversion++; - return; - } - - /* - * Pull enough data from the packet to make intelligent responses - */ - rpkt.li_vn_mode = PKT_LI_VN_MODE(sys_leap, res_version, MODE_CONTROL); - res_opcode = pkt->r_m_e_op; - rpkt.sequence = pkt->sequence; - rpkt.associd = pkt->associd; - rpkt.status = 0; - res_offset = 0; - res_associd = htons(pkt->associd); - res_async = 0; - res_authenticate = 0; - res_keyid = 0; - res_authokay = 0; - req_count = (int)htons(pkt->count); - datanotbinflag = 0; - datalinelen = 0; - datapt = rpkt.data; - dataend = &(rpkt.data[CTL_MAX_DATA_LEN]); - - /* - * We're set up now. Make sure we've got at least - * enough incoming data space to match the count. - */ - req_data = rbufp->recv_length - CTL_HEADER_LEN; - if (req_data < req_count || rbufp->recv_length & 0x3) { - ctl_error(CERR_BADFMT); - numctldatatooshort++; - return; - } - - properlen = req_count + CTL_HEADER_LEN; -#ifdef DEBUG - if (debug >= 2 && (rbufp->recv_length & 0x3) != 0) - printf("Packet length %d unrounded\n", rbufp->recv_length); -#endif - /* round up proper len to a 8 octet boundary */ - - properlen = (properlen + 7) & ~7; - - if ((rbufp->recv_length & (sizeof(u_long)-1)) == 0 - && (maclen = (rbufp->recv_length - properlen)) >= MIN_MAC_LEN - && maclen <= MAX_MAC_LEN) { - - res_authenticate = 1; - res_keyid = ntohl(*(u_long *)((u_char *)pkt + properlen)); - -#ifdef DEBUG - if (debug >= 3) - printf( - "recv_len %d, properlen %d, wants auth with keyid %ld, MAC length=%d\n", - rbufp->recv_length, properlen, res_keyid, maclen); -#endif - if (!authhavekey(res_keyid)) { -#ifdef DEBUG - if (debug >= 2) - printf("keyid %lu unknown\n", res_keyid); -#endif - } else if (authdecrypt(res_keyid, (U_LONG *)pkt, - rbufp->recv_length - maclen)) { -#ifdef DEBUG - if (debug >= 3) - printf("authenticated okay\n"); -#endif - res_authokay = 1; - } else { -#ifdef DEBUG - if (debug >= 3) - printf("authentication failed\n"); -#endif - res_keyid = 0; - } - } - - /* - * Set up translate pointers - */ - reqpt = (char *)pkt->data; - reqend = reqpt + req_count; - - /* - * Look for the opcode processor - */ - for (cc = control_codes; cc->control_code != NO_REQUEST; cc++) { - if (cc->control_code == res_opcode) { -#ifdef DEBUG - if (debug >= 2) - printf("opcode %d, found command handler\n", - res_opcode); -#endif - if (cc->flags == AUTH && (!res_authokay - || res_keyid != ctl_auth_keyid)) { - ctl_error(CERR_PERMISSION); - return; - } - (cc->handler)(rbufp, restrict); - return; - } - } - - /* - * Can't find this one, return an error. - */ - numctlbadop++; - ctl_error(CERR_BADOP); - return; -} - - -/* - * ctlpeerstatus - return a status word for this peer - */ -u_short -ctlpeerstatus(peer) - register struct peer *peer; -{ - register u_short status; - - status = CTL_PST_SEL_REJECT; - if (peer->was_sane != 0) - status = CTL_PST_SEL_SANE; - if (peer->correct != 0) - status = CTL_PST_SEL_CORRECT; - if (peer->candidate != 0) - status = CTL_PST_SEL_SELCAND; - if (peer->select != 0) - status = CTL_PST_SEL_SYNCCAND; - if (peer == sys_peer) { - status = CTL_PST_SEL_DISTSYSPEER; - if (peer->synch < NTP_MAXDISTANCE) { - status = CTL_PST_SEL_SYSPEER; - if (pps_control) - status = CTL_PST_SEL_PPS; - } - } - if (peer->flags & FLAG_CONFIG) - status |= CTL_PST_CONFIG; - if (peer->flags & FLAG_AUTHENABLE) { - status |= CTL_PST_AUTHENABLE; - if (peer->flags & FLAG_AUTHENTIC) - status |= CTL_PST_AUTHENTIC; - } - if (peer->reach != 0) - status |= CTL_PST_REACH; - - return (u_short)CTL_PEER_STATUS(status, peer->num_events, - peer->last_event); -} - - -/* - * ctlclkstatus - return a status word for this clock - */ -static u_short -ctlclkstatus(clock) - struct refclockstat *clock; -{ - return ((u_short)(clock->currentstatus) << 8) - | (u_short)(clock->lastevent); -} - - - -/* - * ctlsysstatus - return the system status word - */ -u_short -ctlsysstatus() -{ - register u_char clock; - - clock = CTL_SST_TS_UNSPEC; - if (sys_peer != 0) { - if (sys_peer->sstclktype != CTL_SST_TS_UNSPEC) { - clock = sys_peer->sstclktype; - if (pps_control) - clock |= CTL_SST_TS_PPS; - } else { - if (sys_peer->refclktype < sizeof(clocktypes)) - clock = clocktypes[sys_peer->refclktype]; - if (pps_control) - clock |= CTL_SST_TS_PPS; - } - } - return (u_short)CTL_SYS_STATUS(sys_leap, clock, - ctl_sys_num_events, ctl_sys_last_event); -} - - - -/* - * ctl_flushpkt - write out the current packet and prepare - * another if necessary. - */ -static void -ctl_flushpkt(more) - int more; -{ - int dlen; - int sendlen; - - if (!more && datanotbinflag) { - /* - * Big hack, output a trailing \r\n - */ - *datapt++ = '\r'; - *datapt++ = '\n'; - } - dlen = datapt - (u_char *)rpkt.data; - sendlen = dlen + CTL_HEADER_LEN; - - /* - * Pad to a multiple of 32 bits - */ - while (sendlen & 0x3) { - *datapt++ = '\0'; - sendlen++; - } - - /* - * Fill in the packet with the current info - */ - rpkt.r_m_e_op = CTL_RESPONSE|more|(res_opcode & CTL_OP_MASK); - rpkt.count = htons((u_short)dlen); - rpkt.offset = htons(res_offset); - if (res_async) { - register int i; - - for (i = 0; i < CTL_MAXTRAPS; i++) { - if (ctl_trap[i].tr_flags & TRAP_INUSE) { - rpkt.li_vn_mode = PKT_LI_VN_MODE(sys_leap, - ctl_trap[i].tr_version, MODE_CONTROL); - rpkt.sequence = htons(ctl_trap[i].tr_sequence); - sendpkt(&ctl_trap[i].tr_addr, - ctl_trap[i].tr_localaddr, - -4, - (struct pkt *)&rpkt, sendlen); - if (!more) - ctl_trap[i].tr_sequence++; - numasyncmsgs++; - } - } - } else { - if (res_authenticate) { - int maclen; - int totlen = sendlen; - - /* - * If we are going to authenticate, then there is - * an additional requirement that the MAC begin on - * a 64 bit boundary. - */ - while (totlen & 7) { - *datapt++ = '\0'; - totlen++; - } - *(u_long *)datapt = htonl(res_keyid); - maclen = - authencrypt(res_keyid, (U_LONG *)&rpkt, totlen); - - sendpkt(rmt_addr, lcl_inter, -5, (struct pkt *)&rpkt, - totlen + maclen); - } else { - sendpkt(rmt_addr, lcl_inter, -6, (struct pkt *)&rpkt, - sendlen); - } - if (more) - numctlfrags++; - else - numctlresponses++; - } - - /* - * Set us up for another go around. - */ - res_offset += dlen; - datapt = (u_char *)rpkt.data; -} - - -/* - * ctl_putdata - write data into the packet, fragmenting and - * starting another if this one is full. - */ -static void -ctl_putdata(dp, dlen, bin) - char *dp; - int dlen; - int bin; /* set to 1 when data is binary */ -{ - int overhead; - - overhead = 0; - if (!bin) { - datanotbinflag = 1; - overhead = 3; - if (datapt != rpkt.data) { - *datapt++ = ','; - datalinelen++; - if ((dlen + datalinelen + 1) >= MAXDATALINELEN) { - *datapt++ = '\r'; - *datapt++ = '\n'; - datalinelen = 0; - } else { - *datapt++ = ' '; - datalinelen++; - } - } - } - - /* - * Save room for trailing junk - */ - if (dlen + overhead + datapt > dataend) { - /* - * Not enough room in this one, flush it out. - */ - ctl_flushpkt(CTL_MORE); - } - - memmove((char *)datapt, dp, dlen); - datapt += dlen; - datalinelen += dlen; -} - - -/* - * ctl_putstr - write a tagged string into the response packet - */ -static void -ctl_putstr(tag, data, len) - char *tag; - char *data; - int len; -{ - register char *cp, *cq; - char buffer[400]; - - cp = buffer; - cq = tag; - while (*cq != '\0') - *cp++ = *cq++; - - if (len > 0) { - *cp++ = '='; - *cp++ = '"'; - if (len > (sizeof(buffer) - (cp - buffer) - 1)) - len = sizeof(buffer) - (cp - buffer) - 1; - memmove(cp, data, len); - cp += len; - *cp++ = '"'; - } - - ctl_putdata(buffer, cp - buffer, 0); -} - - - -/* - * ctl_putlfp - write a tagged, signed l_fp into the response packet - */ -static void -ctl_putlfp(tag, ts) - char *tag; - l_fp *ts; -{ - register char *cp, *cq; - char buffer[200]; - - cp = buffer; - cq = tag; - while (*cq != '\0') - *cp++ = *cq++; - - *cp++ = '='; - cq = lfptoms(ts, 3); - while (*cq != '\0') - *cp++ = *cq++; - - ctl_putdata(buffer, cp - buffer, 0); -} - - -/* - * ctl_putfp - write a tagged s_fp number into the response - */ -static void -ctl_putfp(tag, fp) - char *tag; - s_fp fp; -{ - register char *cp, *cq; - char buffer[200]; - - cp = buffer; - cq = tag; - while (*cq != '\0') - *cp++ = *cq++; - - *cp++ = '='; - cq = fptoms(fp, 2); - while (*cq != '\0') - *cp++ = *cq++; - - ctl_putdata(buffer, cp - buffer, 0); -} - - -/* - * ctl_putufp - write a tagged u_fp number into the response - */ -static void -ctl_putufp(tag, ufp) - char *tag; - u_fp ufp; -{ - register char *cp, *cq; - char buffer[200]; - - cp = buffer; - cq = tag; - while (*cq != '\0') - *cp++ = *cq++; - - *cp++ = '='; - cq = ufptoms(ufp, 2); - while (*cq != '\0') - *cp++ = *cq++; - - ctl_putdata(buffer, cp - buffer, 0); -} - - -/* - * ctl_putuint - write a tagged unsigned integer into the response - */ -static void -ctl_putuint(tag, uval) - char *tag; - u_long uval; -{ - register char *cp, *cq; - char buffer[200]; - - cp = buffer; - cq = tag; - while (*cq != '\0') - *cp++ = *cq++; - - *cp++ = '='; - (void) sprintf(cp, "%lu", uval); - while (*cp != '\0') - cp++; - - ctl_putdata(buffer, cp - buffer, 0); -} - - -/* - * ctl_puthex - write a tagged unsigned integer, in hex, into the response - */ -static void -ctl_puthex(tag, uval) - char *tag; - u_long uval; -{ - register char *cp, *cq; - char buffer[200]; - - cp = buffer; - cq = tag; - while (*cq != '\0') - *cp++ = *cq++; - - *cp++ = '='; - (void) sprintf(cp, "0x%lx", uval); - while (*cp != '\0') - cp++; - - ctl_putdata(buffer, cp - buffer, 0); -} - - -/* - * ctl_putint - write a tagged signed integer into the response - */ -static void -ctl_putint(tag, ival) - char *tag; - long ival; -{ - register char *cp, *cq; - char buffer[200]; - - cp = buffer; - cq = tag; - while (*cq != '\0') - *cp++ = *cq++; - - *cp++ = '='; - (void) sprintf(cp, "%ld", ival); - while (*cp != '\0') - cp++; - - ctl_putdata(buffer, cp - buffer, 0); -} - - -/* - * ctl_putts - write a tagged timestamp, in hex, into the response - */ -static void -ctl_putts(tag, ts) - char *tag; - l_fp *ts; -{ - register char *cp, *cq; - char buffer[200]; - - cp = buffer; - cq = tag; - while (*cq != '\0') - *cp++ = *cq++; - - *cp++ = '='; - (void) sprintf(cp, "0x%08lx.%08lx", ts->l_ui & 0xffffffffL, - ts->l_uf & 0xffffffffL); - while (*cp != '\0') - cp++; - - ctl_putdata(buffer, cp - buffer, 0); -} - - -/* - * ctl_putadr - write a dotted quad IP address into the response - */ -static void -ctl_putadr(tag, addr) - char *tag; - u_long addr; -{ - register char *cp, *cq; - char buffer[200]; - - cp = buffer; - cq = tag; - while (*cq != '\0') - *cp++ = *cq++; - - *cp++ = '='; - cq = numtoa(addr); - while (*cq != '\0') - *cp++ = *cq++; - - ctl_putdata(buffer, cp - buffer, 0); -} - - -/* - * ctl_putid - write a tagged clock ID into the response - */ -static void -ctl_putid(tag, id) - char *tag; - char *id; -{ - register char *cp, *cq; - char buffer[200]; - - cp = buffer; - cq = tag; - while (*cq != '\0') - *cp++ = *cq++; - - *cp++ = '='; - cq = id; - while (*cq != '\0' && (cq - id) < 4) - *cp++ = *cq++; - - ctl_putdata(buffer, cp - buffer, 0); -} - - -/* - * ctl_putarray - write a tagged eight element s_fp array into the response - */ -static void -ctl_putarray(tag, arr, start) - char *tag; - s_fp *arr; - int start; -{ - register char *cp, *cq; - char buffer[200]; - int i, ind; - int len; - - cp = buffer; - cq = tag; - while (*cq != '\0') - *cp++ = *cq++; - *cp++ = '='; - /* - * Hack. We know the tag is either filtdelay, filtoffset, - * or filterror. Space over the shorter words one space. - */ - if ((cp - buffer) < 11) - *cp++ = ' '; - - i = start; - ind = 0; - do { - if (i == 0) - i = NTP_SHIFT; - i--; - if (ind) { - *cp++ = ' '; - } else { - ind = 1; - } - cq = fptoms(arr[i], 2); - len = strlen(cq); - while (len < 7) { - *cp++ = ' '; - len++; - } - while (*cq != '\0') - *cp++ = *cq++; - } while(i != start); - - ctl_putdata(buffer, cp - buffer, 0); -} - - -/* - * ctl_putsys - output a system variable - */ -static void -ctl_putsys(varid) - int varid; -{ - l_fp tmp; - - switch (varid) { - case CS_LEAP: - ctl_putuint(sys_var[CS_LEAP].text, sys_leap); - break; - case CS_STRATUM: - ctl_putuint(sys_var[CS_STRATUM].text, sys_stratum); - break; - case CS_PRECISION: - ctl_putint(sys_var[CS_PRECISION].text, sys_precision); - break; - case CS_ROOTDELAY: - ctl_putfp(sys_var[CS_ROOTDELAY].text, sys_rootdelay); - break; - case CS_ROOTDISPERSION: - ctl_putufp(sys_var[CS_ROOTDISPERSION].text, - sys_rootdispersion); - break; - case CS_REFID: - if (sys_stratum > 1) - ctl_putadr(sys_var[CS_REFID].text, sys_refid); - else - ctl_putid(sys_var[CS_REFID].text, (char *)&sys_refid); - break; - case CS_REFTIME: - ctl_putts(sys_var[CS_REFTIME].text, &sys_reftime); - break; - case CS_POLL: - ctl_putuint(sys_var[CS_POLL].text, sys_poll); - break; - case CS_PEERID: - if (sys_peer == NULL) - ctl_putuint(sys_var[CS_PEERID].text, 0); - else - ctl_putuint(sys_var[CS_PEERID].text, - sys_peer->associd); - break; - case CS_OFFSET: - ctl_putlfp(sys_var[CS_OFFSET].text, &last_offset); - break; - case CS_DRIFT: - ctl_putfp(sys_var[CS_DRIFT].text, drift_comp); - break; - case CS_COMPLIANCE: - ctl_putufp(sys_var[CS_COMPLIANCE].text, sys_maxd); - break; - case CS_CLOCK: - get_systime(&tmp); - ctl_putts(sys_var[CS_CLOCK].text, &tmp); - break; - case CS_LEAPIND: - ctl_putuint(sys_var[CS_LEAPIND].text, leap_indicator); - break; - case CS_LEAPWARNING: - ctl_putuint(sys_var[CS_LEAPWARNING].text, leap_warning); - break; - case CS_PROCESSOR: -#ifndef HAVE_UNAME - ctl_putstr(sys_var[CS_PROCESSOR].text, str_processor, - sizeof(str_processor) - 1); -#else - ctl_putstr(sys_var[CS_PROCESSOR].text, utsname.machine, - strlen(utsname.machine)); -#endif /* HAVE_UNAME */ - break; - case CS_SYSTEM: -#ifndef HAVE_UNAME - ctl_putstr(sys_var[CS_SYSTEM].text, str_system, - sizeof(str_system) - 1); -#else - ctl_putstr(sys_var[CS_SYSTEM].text, utsname.sysname, - strlen(utsname.sysname)); -#endif /* HAVE_UNAME */ - break; - case CS_KEYID: - ctl_putuint(sys_var[CS_KEYID].text, 0); - break; - case CS_REFSKEW: - ctl_putlfp(sys_var[CS_REFSKEW].text, &sys_refskew); - break; - case CS_VARLIST: - { - char buf[CTL_MAX_DATA_LEN]; - register char *s, *ss, *t, *be; - register int i; - register struct ctl_var *k; - - s = buf; - be = buf + sizeof(buf) - strlen(sys_var[CS_VARLIST].text) - 4; - if (s > be) - break; /* really long var name 8-( - Killer */ - - strcpy(s, sys_var[CS_VARLIST].text); - strcat(s, "=\""); - s += strlen(s); - t = s; - - for (k = sys_var; !(k->flags &EOV); k++) - { - if (k->flags & PADDING) - continue; - - i = strlen(k->text); - if (s+i+1 >= be) - break; - if (s != t) - *s++ = ','; - strcpy(s, k->text); - s += i; - } - - for (k = ext_sys_var; k && !(k->flags &EOV); k++) - { - if (k->flags & PADDING) - continue; - - ss = k->text; - if (!ss) - continue; - - while (*ss && *ss != '=') - ss++; - - i = ss - k->text; - if (s+i+1 >= be) - break; - if (s != t) - *s++ = ','; - strncpy(s, k->text, i); - s += i; - } - - if (s+2 >= be) - break; - - *s++ = '"'; - *s = '\0'; - - ctl_putdata(buf, s - buf, 0); - } - break; - } -} - - -/* - * ctl_putpeer - output a peer variable - */ -static void -ctl_putpeer(varid, peer) - int varid; - struct peer *peer; -{ - switch (varid) { - case CP_CONFIG: - ctl_putuint(peer_var[CP_CONFIG].text, - ((peer->flags & FLAG_CONFIG) != 0)); - break; - case CP_AUTHENABLE: - ctl_putuint(peer_var[CP_AUTHENABLE].text, - ((peer->flags & FLAG_AUTHENABLE) != 0)); - break; - case CP_AUTHENTIC: - ctl_putuint(peer_var[CP_AUTHENTIC].text, - ((peer->flags & FLAG_AUTHENTIC) != 0)); - break; - case CP_SRCADR: - ctl_putadr(peer_var[CP_SRCADR].text, - peer->srcadr.sin_addr.s_addr); - break; - case CP_SRCPORT: - ctl_putuint(peer_var[CP_SRCPORT].text, - ntohs(peer->srcadr.sin_port)); - break; - case CP_DSTADR: - ctl_putadr(peer_var[CP_DSTADR].text, - peer->processed ? - peer->cast_flags & MDF_BCAST ? - peer->dstadr->bcast.sin_addr.s_addr: - peer->cast_flags ? - peer->dstadr->sin.sin_addr.s_addr ? - peer->dstadr->sin.sin_addr.s_addr: - peer->dstadr->bcast.sin_addr.s_addr: - 8 : 12); - break; - case CP_DSTPORT: - ctl_putuint(peer_var[CP_DSTPORT].text, - ntohs(peer->dstadr->sin.sin_port)); - break; - case CP_LEAP: - ctl_putuint(peer_var[CP_LEAP].text, peer->leap); - break; - case CP_HMODE: - ctl_putuint(peer_var[CP_HMODE].text, peer->hmode); - break; - case CP_STRATUM: - ctl_putuint(peer_var[CP_STRATUM].text, peer->stratum); - break; - case CP_PPOLL: - ctl_putuint(peer_var[CP_PPOLL].text, peer->ppoll); - break; - case CP_HPOLL: - ctl_putuint(peer_var[CP_HPOLL].text, peer->hpoll); - break; - case CP_PRECISION: - ctl_putint(peer_var[CP_PRECISION].text, peer->precision); - break; - case CP_ROOTDELAY: - ctl_putfp(peer_var[CP_ROOTDELAY].text, peer->rootdelay); - break; - case CP_ROOTDISPERSION: - ctl_putufp(peer_var[CP_ROOTDISPERSION].text, - peer->rootdispersion); - break; - case CP_REFID: - if (peer->stratum > 1) - if (peer->flags & FLAG_REFCLOCK) - ctl_putadr(peer_var[CP_REFID].text, - peer->srcadr.sin_addr.s_addr); - else - ctl_putadr(peer_var[CP_REFID].text, - peer->refid); - else - ctl_putid(peer_var[CP_REFID].text, - (char *)&peer->refid); - break; - case CP_REFTIME: - ctl_putts(peer_var[CP_REFTIME].text, &peer->reftime); - break; - case CP_ORG: - ctl_putts(peer_var[CP_ORG].text, &peer->org); - break; - case CP_REC: - ctl_putts(peer_var[CP_REC].text, &peer->rec); - break; - case CP_XMT: - ctl_putts(peer_var[CP_XMT].text, &peer->xmt); - break; - case CP_REACH: - ctl_puthex(peer_var[CP_REACH].text, peer->reach); - break; - case CP_FLASH: - ctl_puthex(peer_var[CP_FLASH].text, peer->flash); - break; - case CP_VALID: - ctl_putuint(peer_var[CP_VALID].text, peer->valid); - break; - case CP_TIMER: - ctl_putuint(peer_var[CP_TIMER].text, - peer->event_timer.event_time - current_time); - break; - case CP_DELAY: - ctl_putfp(peer_var[CP_DELAY].text, peer->delay); - break; - case CP_OFFSET: - ctl_putlfp(peer_var[CP_OFFSET].text, &peer->offset); - break; - case CP_DISPERSION: - ctl_putufp(peer_var[CP_DISPERSION].text, peer->dispersion); - break; - case CP_KEYID: - ctl_putuint(peer_var[CP_KEYID].text, peer->keyid); - break; - case CP_FILTDELAY: - ctl_putarray(peer_var[CP_FILTDELAY].text, - peer->filter_delay, (int)peer->filter_nextpt); - break; - case CP_FILTOFFSET: - ctl_putarray(peer_var[CP_FILTOFFSET].text, - peer->filter_soffset, (int)peer->filter_nextpt); - break; - case CP_FILTERROR: - ctl_putarray(peer_var[CP_FILTERROR].text, - (s_fp *)peer->filter_error, (int)peer->filter_nextpt); - break; - case CP_PMODE: - ctl_putuint(peer_var[CP_PMODE].text, peer->pmode); - break; - case CP_RECEIVED: - ctl_putuint(peer_var[CP_RECEIVED].text, peer->received); - break; - case CP_SENT: - ctl_putuint(peer_var[CP_SENT].text, peer->sent); - break; - case CP_VARLIST: - { - char buf[CTL_MAX_DATA_LEN]; - register char *s, *t, *be; - register int i; - register struct ctl_var *k; - - s = buf; - be = buf + sizeof(buf) - strlen(peer_var[CP_VARLIST].text) - 4; - if (s > be) - break; /* really long var name 8-( - Killer */ - - strcpy(s, peer_var[CP_VARLIST].text); - strcat(s, "=\""); - s += strlen(s); - t = s; - - for (k = peer_var; !(k->flags &EOV); k++) - { - if (k->flags & PADDING) - continue; - - i = strlen(k->text); - if (s+i+1 >= be) - break; - if (s != t) - *s++ = ','; - strcpy(s, k->text); - s += i; - } - - if (s+2 >= be) - break; - - *s++ = '"'; - *s = '\0'; - - ctl_putdata(buf, s - buf, 0); - } - break; - } -} - - -#ifdef REFCLOCK -/* - * ctl_putclock - output clock variables - */ -static void -ctl_putclock(varid, clock, mustput) - int varid; - struct refclockstat *clock; - int mustput; -{ - switch(varid) { - case CC_TYPE: - if (mustput || clock->clockdesc == NULL - || *(clock->clockdesc) == '\0') { - ctl_putuint(clock_var[CC_TYPE].text, clock->type); - } - break; - case CC_TIMECODE: - ctl_putstr(clock_var[CC_TIMECODE].text, clock->lastcode, - (int)clock->lencode); - break; - case CC_POLL: - ctl_putuint(clock_var[CC_POLL].text, clock->polls); - break; - case CC_NOREPLY: - ctl_putuint(clock_var[CC_NOREPLY].text, clock->noresponse); - break; - case CC_BADFORMAT: - ctl_putuint(clock_var[CC_BADFORMAT].text, clock->badformat); - break; - case CC_BADDATA: - ctl_putuint(clock_var[CC_BADDATA].text, clock->baddata); - break; - case CC_FUDGETIME1: - if (mustput || (clock->haveflags & CLK_HAVETIME1)) - ctl_putlfp(clock_var[CC_FUDGETIME1].text, - &clock->fudgetime1); - break; - case CC_FUDGETIME2: - if (mustput || (clock->haveflags & CLK_HAVETIME2)) - ctl_putlfp(clock_var[CC_FUDGETIME2].text, - &clock->fudgetime2); - break; - case CC_FUDGEVAL1: - if (mustput || (clock->haveflags & CLK_HAVEVAL1)) - ctl_putint(clock_var[CC_FUDGEVAL1].text, - clock->fudgeval1); - break; - case CC_FUDGEVAL2: - if (mustput || (clock->haveflags & CLK_HAVEVAL2)) - if (clock->fudgeval1 > 1) - ctl_putadr(clock_var[CC_FUDGEVAL2].text, - clock->fudgeval2); - else - ctl_putid(clock_var[CC_FUDGEVAL2].text, - (char *)&clock->fudgeval2); - break; - case CC_FLAGS: - if (mustput || (clock->haveflags & - (CLK_HAVEFLAG1|CLK_HAVEFLAG2|CLK_HAVEFLAG3|CLK_HAVEFLAG4))) - ctl_putuint(clock_var[CC_FLAGS].text, clock->flags); - break; - case CC_DEVICE: - if (clock->clockdesc == NULL || *(clock->clockdesc) == '\0') { - if (mustput) - ctl_putstr(clock_var[CC_DEVICE].text, "", 0); - } else { - ctl_putstr(clock_var[CC_DEVICE].text, clock->clockdesc, - strlen(clock->clockdesc)); - } - break; - case CC_VARLIST: - { - char buf[CTL_MAX_DATA_LEN]; - register char *s, *ss, *t, *be; - register int i; - register struct ctl_var *k; - - s = buf; - be = buf + sizeof(buf) - strlen(clock_var[CC_VARLIST].text) - 4; - if (s > be) - break; /* really long var name 8-( - Killer */ - - strcpy(s, clock_var[CC_VARLIST].text); - strcat(s, "=\""); - s += strlen(s); - t = s; - - for (k = clock_var; !(k->flags &EOV); k++) - { - if (k->flags & PADDING) - continue; - - i = strlen(k->text); - if (s+i+1 >= be) - break; - if (s != t) - *s++ = ','; - strcpy(s, k->text); - s += i; - } - - for (k = clock->kv_list; k && !(k->flags &EOV); k++) - { - if (k->flags & PADDING) - continue; - - ss = k->text; - if (!ss) - continue; - - while (*ss && *ss != '=') - ss++; - - i = ss - k->text; - if (s+i+1 >= be) - break; - if (s != t) - *s++ = ','; - strncpy(s, k->text, i); - s += i; - *s = '\0'; - } - - if (s+2 >= be) - break; - - *s++ = '"'; - *s = '\0'; - - ctl_putdata(buf, s - buf, 0); - } - break; - } -} -#endif - - - -/* - * ctl_getitem - get the next data item from the incoming packet - */ -static struct ctl_var * -ctl_getitem(var_list, data) - struct ctl_var *var_list; - char **data; -{ - register struct ctl_var *v; - register char *cp, *tp; - static struct ctl_var eol = { 0, EOV, }; - static char buf[128]; - - /* - * Delete leading commas and white space - */ - while (reqpt < reqend && (*reqpt == ',' || isspace(*reqpt))) { - reqpt++; - } - - if (reqpt >= reqend) - return 0; - - if (var_list == (struct ctl_var *)0) - return &eol; - - /* - * Look for a first character match on the tag. If we find - * one, see if it is a full match. - */ - v = var_list; - cp = reqpt; - while (!(v->flags & EOV)) { - if (!(v->flags & PADDING) && *cp == *(v->text)) { - tp = v->text; - while (*tp != '\0' && *tp != '=' && cp < reqend && *cp == *tp) { - cp++; - tp++; - } - if ((*tp == '\0') || (*tp == '=')) { - while (cp < reqend && isspace(*cp)) - cp++; - if (cp == reqend || *cp == ',') { - buf[0] = '\0'; - *data = buf; - if (cp < reqend) - cp++; - reqpt = cp; - return v; - } - if (*cp == '=') { - cp++; - tp = buf; - while (cp < reqend && isspace(*cp)) - cp++; - while (cp < reqend && *cp != ',') - *tp++ = *cp++; - if (cp < reqend) - cp++; - *tp = '\0'; - while (isspace(*(tp-1))) - *(--tp) = '\0'; - reqpt = cp; - *data = buf; - return v; - } - } - cp = reqpt; - } - v++; - } - return v; -} - - -/* - * control_unspec - response to an unspecified op-code - */ -/*ARGSUSED*/ -static void -control_unspec(rbufp, restrict) - struct recvbuf *rbufp; - int restrict; -{ - struct peer *peer; - - /* - * What is an appropriate response to an unspecified op-code? - * I return no errors and no data, unless a specified assocation - * doesn't exist. - */ - if (res_associd != 0) { - if ((peer = findpeerbyassoc((int)res_associd)) == 0) { - ctl_error(CERR_BADASSOC); - return; - } - rpkt.status = htons(ctlpeerstatus(peer)); - } else { - rpkt.status = htons(ctlsysstatus()); - } - ctl_flushpkt(0); -} - - -/* - * read_status - return either a list of associd's, or a particular - * peer's status. - */ -/*ARGSUSED*/ -static void -read_status(rbufp, restrict) - struct recvbuf *rbufp; - int restrict; -{ - register int i; - register struct peer *peer; - u_short ass_stat[CTL_MAX_DATA_LEN/sizeof(u_short)]; - -#ifdef DEBUG - if (debug >= 2) - printf("read_status: ID %d\n", res_associd); -#endif - /* - * Two choices here. If the specified association ID is - * zero we return all known assocation ID's. Otherwise - * we return a bunch of stuff about the particular peer. - */ - if (res_associd == 0) { - register int n; - - n = 0; - rpkt.status = htons(ctlsysstatus()); - for (i = 0; i < HASH_SIZE; i++) { - for (peer = assoc_hash[i]; peer != 0; - peer = peer->ass_next) { - ass_stat[n++] = htons(peer->associd); - ass_stat[n++] = htons(ctlpeerstatus(peer)); - if (n == CTL_MAX_DATA_LEN/sizeof(u_short)) { - ctl_putdata((char *)ass_stat, - n * sizeof(u_short), 1); - n = 0; - } - } - } - - if (n != 0) - ctl_putdata((char *)ass_stat, n * sizeof(u_short), 1); - ctl_flushpkt(0); - } else { - peer = findpeerbyassoc((int)res_associd); - if (peer == 0) { - ctl_error(CERR_BADASSOC); - } else { - register u_char *cp; - - rpkt.status = htons(ctlpeerstatus(peer)); - if (res_authokay) - peer->num_events = 0; - /* - * For now, output everything we know about the peer. - * May be more selective later. - */ - for (cp = def_peer_var; *cp != 0; cp++) - ctl_putpeer((int)*cp, peer); - ctl_flushpkt(0); - } - } -} - - -/* - * read_variables - return the variables the caller asks for - */ -/*ARGSUSED*/ -static void -read_variables(rbufp, restrict) - struct recvbuf *rbufp; - int restrict; -{ - register struct ctl_var *v; - register int i; - char *valuep; - u_char *wants; - int gotvar = (CS_MAXCODE>CP_MAXCODE) ? (CS_MAXCODE+1) : (CP_MAXCODE+1); - - if (res_associd == 0) { - /* - * Wants system variables. Figure out which he wants - * and give them to him. - */ - rpkt.status = htons(ctlsysstatus()); - if (res_authokay) - ctl_sys_num_events = 0; - gotvar += count_var(ext_sys_var); - wants = (u_char *)emalloc(gotvar); - memset((char *)wants, 0, gotvar); - gotvar = 0; - while ((v = ctl_getitem(sys_var, &valuep)) != 0) { - if (v->flags & EOV) { - if ((v = ctl_getitem(ext_sys_var, &valuep)) != 0) { - if (v->flags & EOV) { - ctl_error(CERR_UNKNOWNVAR); - free((char *)wants); - return; - } - wants[CS_MAXCODE+1+v->code] = 1; - gotvar = 1; - continue; - } else { - break; /* shouldn't happen ! */ - } - } - wants[v->code] = 1; - gotvar = 1; - } - if (gotvar) { - for (i = 1; i <= CS_MAXCODE; i++) - if (wants[i]) - ctl_putsys(i); - for (i = 0; ext_sys_var && !(ext_sys_var[i].flags & EOV); i++) - if (wants[i+CS_MAXCODE+1]) - ctl_putdata(ext_sys_var[i].text, - strlen(ext_sys_var[i].text), 0); - } else { - register u_char *cs; - register struct ctl_var *kv; - - for (cs = def_sys_var; *cs != 0; cs++) - ctl_putsys((int)*cs); - for (kv = ext_sys_var; kv && !(kv->flags & EOV); kv++) - if (kv->flags & DEF) - ctl_putdata(kv->text, strlen(kv->text), 0); - } - free((char *)wants); - } else { - register struct peer *peer; - - /* - * Wants info for a particular peer. See if we know - * the guy. - */ - peer = findpeerbyassoc((int)res_associd); - if (peer == 0) { - ctl_error(CERR_BADASSOC); - return; - } - - rpkt.status = htons(ctlpeerstatus(peer)); - if (res_authokay) - peer->num_events = 0; - wants = (u_char *)emalloc(gotvar); - memset((char*)wants, 0, gotvar); - gotvar = 0; - while ((v = ctl_getitem(peer_var, &valuep)) != 0) { - if (v->flags & EOV) { - ctl_error(CERR_UNKNOWNVAR); - free((char *)wants); - return; - } - wants[v->code] = 1; - gotvar = 1; - } - if (gotvar) { - for (i = 1; i <= CP_MAXCODE; i++) - if (wants[i]) - ctl_putpeer(i, peer); - } else { - register u_char *cp; - - for (cp = def_peer_var; *cp != 0; cp++) - ctl_putpeer((int)*cp, peer); - } - free((char *)wants); - } - ctl_flushpkt(0); -} - - -/* - * write_variables - write into variables. We only allow leap bit writing - * this way. - */ -/*ARGSUSED*/ -static void -write_variables(rbufp, restrict) - struct recvbuf *rbufp; - int restrict; -{ - register struct ctl_var *v; - register int ext_var; - char *valuep; - long val; - int leapind, leapwarn; - - /* - * If he's trying to write into a peer tell him no way - */ - if (res_associd != 0) { - ctl_error(CERR_PERMISSION); - return; - } - - /* - * Set status - */ - rpkt.status = htons(ctlsysstatus()); - - /* - * Set flags to not-in-sync so we can tell when we get something. - */ - leapind = ~0; - leapwarn = ~0; - - /* - * Look through the variables. Dump out at the first sign of trouble. - */ - while ((v = ctl_getitem(sys_var, &valuep)) != 0) { - ext_var = 0; - if (v->flags & EOV) { - if ((v = ctl_getitem(ext_sys_var, &valuep)) != 0) { - if (v->flags & EOV) { - ctl_error(CERR_UNKNOWNVAR); - return; - } - ext_var = 1; - } else { - break; - } - } - if (!(v->flags & CAN_WRITE)) { - ctl_error(CERR_PERMISSION); - return; - } - if (!ext_var && (*valuep == '\0' || !atoint(valuep, &val))) { - ctl_error(CERR_BADFMT); - return; - } - if (!ext_var && (val & ~LEAP_NOTINSYNC) != 0) { - ctl_error(CERR_BADVALUE); - return; - } - - if (ext_var) { - char *s = emalloc(strlen(v->text)+strlen(valuep)+2); - char *t, *tt = s; - - t = v->text; - while (*t && *t != '=') - *tt++ = *t++; - - *tt++ = '='; - strcat(tt, valuep); - - set_sys_var(s, strlen(s)+1, v->flags); - free(s); - } else { - /* - * This one seems sane. Save it. - */ - switch(v->code) { - case CS_LEAP: - case CS_LEAPIND: - leapind = val; - break; - case CS_LEAPWARNING: - leapwarn = val; - break; - default: - ctl_error(CERR_UNSPEC); /* our fault, really */ - return; - } - } - } - - /* - * If we got anything, do it. - */ - if (leapind != ~0 || leapwarn != ~0) { - if (!leap_setleap((int)leapind, (int)leapwarn)) { - ctl_error(CERR_PERMISSION); - return; - } - } - ctl_flushpkt(0); -} - - -/* - * read_clock_status - return clock radio status - */ -/*ARGSUSED*/ -static void -read_clock_status(rbufp, restrict) - struct recvbuf *rbufp; - int restrict; -{ -#ifndef REFCLOCK - /* - * If no refclock support, no data to return - */ - ctl_error(CERR_BADASSOC); -#else - register struct ctl_var *v; - register int i; - register struct peer *peer; - char *valuep; - u_char *wants; - int gotvar; - struct refclockstat clock; - - if (res_associd == 0) { - /* - * Find a clock for this jerk. If the system peer - * is a clock use it, else search the hash tables - * for one. - */ - if (sys_peer != 0 && (sys_peer->flags & FLAG_REFCLOCK)) { - peer = sys_peer; - } else { - peer = 0; - for (i = 0; peer == 0 && i < HASH_SIZE; i++) { - for (peer = assoc_hash[i]; peer != 0; - peer = peer->ass_next) { - if (peer->flags & FLAG_REFCLOCK) - break; - } - } - if (peer == 0) { - ctl_error(CERR_BADASSOC); - return; - } - } - } else { - peer = findpeerbyassoc((int)res_associd); - if (peer == 0 || !(peer->flags & FLAG_REFCLOCK)) { - ctl_error(CERR_BADASSOC); - return; - } - } - - /* - * If we got here we have a peer which is a clock. Get his status. - */ - clock.kv_list = (struct ctl_var *)0; - - refclock_control(&peer->srcadr, (struct refclockstat *)0, &clock); - - /* - * Look for variables in the packet. - */ - rpkt.status = htons(ctlclkstatus(&clock)); - gotvar = CC_MAXCODE+1+count_var(clock.kv_list); - wants = (u_char *)emalloc(gotvar); - memset((char*)wants, 0, gotvar); - gotvar = 0; - while ((v = ctl_getitem(clock_var, &valuep)) != 0) { - if (v->flags & EOV) { - if ((v = ctl_getitem(clock.kv_list, &valuep)) != 0) { - if (v->flags & EOV) { - ctl_error(CERR_UNKNOWNVAR); - free((char*)wants); - free_varlist(clock.kv_list); - return; - } - wants[CC_MAXCODE+1+v->code] = 1; - gotvar = 1; - continue; - } else { - break; /* shouldn't happen ! */ - } - } - wants[v->code] = 1; - gotvar = 1; - } - - if (gotvar) { - for (i = 1; i <= CC_MAXCODE; i++) - if (wants[i]) - ctl_putclock(i, &clock, 1); - for (i = 0; clock.kv_list && !(clock.kv_list[i].flags & EOV); i++) - if (wants[i+CC_MAXCODE+1]) - ctl_putdata(clock.kv_list[i].text, - strlen(clock.kv_list[i].text), 0); - } else { - register u_char *cc; - register struct ctl_var *kv; - - for (cc = def_clock_var; *cc != 0; cc++) - ctl_putclock((int)*cc, &clock, 0); - for (kv = clock.kv_list; kv && !(kv->flags & EOV); kv++) - if (kv->flags & DEF) - ctl_putdata(kv->text, strlen(kv->text), 0); - } - - free((char*)wants); - free_varlist(clock.kv_list); - - ctl_flushpkt(0); -#endif -} - - -/* - * write_clock_status - we don't do this - */ -/*ARGSUSED*/ -static void -write_clock_status(rbufp, restrict) - struct recvbuf *rbufp; - int restrict; -{ - ctl_error(CERR_PERMISSION); -} - -/* - * Trap support from here on down. We send async trap messages when the - * upper levels report trouble. Traps can by set either by control - * messages or by configuration. - */ - -/* - * set_trap - set a trap in response to a control message - */ -static void -set_trap(rbufp, restrict) - struct recvbuf *rbufp; - int restrict; -{ - int traptype; - - /* - * See if this guy is allowed - */ - if (restrict & RES_NOTRAP) { - ctl_error(CERR_PERMISSION); - return; - } - - /* - * Determine his allowed trap type. - */ - traptype = TRAP_TYPE_PRIO; - if (restrict & RES_LPTRAP) - traptype = TRAP_TYPE_NONPRIO; - - /* - * Call ctlsettrap() to do the work. Return - * an error if it can't assign the trap. - */ - if (!ctlsettrap(&rbufp->recv_srcadr, rbufp->dstadr, traptype, - (int)res_version)) - ctl_error(CERR_NORESOURCE); - ctl_flushpkt(0); -} - - -/* - * unset_trap - unset a trap in response to a control message - */ -static void -unset_trap(rbufp, restrict) - struct recvbuf *rbufp; - int restrict; -{ - int traptype; - - /* - * We don't prevent anyone from removing his own - * trap unless the trap is configured. Note we also - * must be aware of the possibility that restriction - * flags were changed since this guy last set his trap. - * Set the trap type based on this. - */ - traptype = TRAP_TYPE_PRIO; - if (restrict & RES_LPTRAP) - traptype = TRAP_TYPE_NONPRIO; - - /* - * Call ctlclrtrap() to clear this out. - */ - if (!ctlclrtrap(&rbufp->recv_srcadr, rbufp->dstadr, traptype)) - ctl_error(CERR_BADASSOC); - ctl_flushpkt(0); -} - - -/* - * ctlsettrap - called to set a trap - */ -int -ctlsettrap(raddr, linter, traptype, version) - struct sockaddr_in *raddr; - struct interface *linter; - int traptype; - int version; -{ - register struct ctl_trap *tp; - register struct ctl_trap *tptouse; - - /* - * See if we can find this trap. If so, we only need update - * the flags and the time. - */ - if ((tp = ctlfindtrap(raddr, linter)) != NULL) { - switch (traptype) { - case TRAP_TYPE_CONFIG: - tp->tr_flags = TRAP_INUSE|TRAP_CONFIGURED; - break; - case TRAP_TYPE_PRIO: - if (tp->tr_flags & TRAP_CONFIGURED) - return 1; /* don't change anything */ - tp->tr_flags = TRAP_INUSE; - break; - case TRAP_TYPE_NONPRIO: - if (tp->tr_flags & TRAP_CONFIGURED) - return 1; /* don't change anything */ - tp->tr_flags = TRAP_INUSE|TRAP_NONPRIO; - break; - } - tp->tr_settime = current_time; - tp->tr_resets++; - return 1; - } - - /* - * First we heard of this guy. Try to find a trap structure - * for him to use, clearing out lesser priority guys if we - * have to. Clear out anyone who's expired while we're at it. - */ - tptouse = NULL; - for (tp = ctl_trap; tp < &ctl_trap[CTL_MAXTRAPS]; tp++) { - if ((tp->tr_flags & TRAP_INUSE) && - !(tp->tr_flags & TRAP_CONFIGURED) && - ((tp->tr_settime + CTL_TRAPTIME) > current_time)) { - tp->tr_flags = 0; - num_ctl_traps--; - } - - if (!(tp->tr_flags & TRAP_INUSE)) { - tptouse = tp; - } else if (!(tp->tr_flags & TRAP_CONFIGURED)) { - switch (traptype) { - case TRAP_TYPE_CONFIG: - if (tptouse == NULL) { - tptouse = tp; - break; - } - if (tptouse->tr_flags & TRAP_NONPRIO - && !(tp->tr_flags & TRAP_NONPRIO)) - break; - if (!(tptouse->tr_flags & TRAP_NONPRIO) - && tp->tr_flags & TRAP_NONPRIO) { - tptouse = tp; - break; - } - if (tptouse->tr_origtime < tp->tr_origtime) - tptouse = tp; - break; - case TRAP_TYPE_PRIO: - if (tp->tr_flags & TRAP_NONPRIO) { - if (tptouse == NULL || - (tptouse->tr_flags & TRAP_INUSE - && tptouse->tr_origtime - < tp->tr_origtime)) - tptouse = tp; - } - break; - case TRAP_TYPE_NONPRIO: - break; - } - } - } - - /* - * If we don't have room for him return an error. - */ - if (tptouse == NULL) - return 0; - - /* - * Set up this structure for him. - */ - tptouse->tr_settime = tptouse->tr_origtime = current_time; - tptouse->tr_count = tptouse->tr_resets = 0; - tptouse->tr_sequence = 1; - tptouse->tr_addr = *raddr; - tptouse->tr_localaddr = linter; - tptouse->tr_version = version; - - tptouse->tr_flags = TRAP_INUSE; - if (traptype == TRAP_TYPE_CONFIG) - tptouse->tr_flags |= TRAP_CONFIGURED; - else if (traptype == TRAP_TYPE_NONPRIO) - tptouse->tr_flags |= TRAP_NONPRIO; - num_ctl_traps++; - return 1; -} - - -/* - * ctlclrtrap - called to clr a trap - */ -int -ctlclrtrap(raddr, linter, traptype) - struct sockaddr_in *raddr; - struct interface *linter; - int traptype; -{ - register struct ctl_trap *tp; - - if ((tp = ctlfindtrap(raddr, linter)) == NULL) - return 0; - - if (tp->tr_flags & TRAP_CONFIGURED - && traptype != TRAP_TYPE_CONFIG) - return 0; - - tp->tr_flags = 0; - num_ctl_traps--; - return 1; -} - - -/* - * ctlfindtrap - find a trap given the remote and local addresses - */ -static struct ctl_trap * -ctlfindtrap(raddr, linter) - struct sockaddr_in *raddr; - struct interface *linter; -{ - register struct ctl_trap *tp; - - for (tp = ctl_trap; tp < &ctl_trap[CTL_MAXTRAPS]; tp++) { - if (tp->tr_flags & TRAP_INUSE - && NSRCADR(raddr) == NSRCADR(&tp->tr_addr) - && NSRCPORT(raddr) == NSRCPORT(&tp->tr_addr) - && linter == tp->tr_localaddr) - return tp; - } - return (struct ctl_trap *)NULL; -} - - -/* - * report_event - report an event to the trappers - */ -void -report_event(err, peer) - int err; - struct peer *peer; -{ - register int i; - - /* - * Record error code in proper spots, but have mercy on the - * log file. - */ - if (!(err & PEER_EVENT)) { - if (ctl_sys_num_events < CTL_SYS_MAXEVENTS) - ctl_sys_num_events++; - if (ctl_sys_last_event != (u_char)err) { - syslog(LOG_INFO, "system event %x status %x", - err, ctlsysstatus()); -#ifdef DEBUG - if (debug) - printf("report_event: system event %x status %x\n", - err, ctlsysstatus()); -#endif - ctl_sys_last_event = (u_char)err; - } - } else if (peer != 0) { - peer->last_event = (u_char)(err & ~PEER_EVENT); - if (peer->num_events < CTL_PEER_MAXEVENTS) - peer->num_events++; - syslog(LOG_INFO, "peer %s event %x status %x", - ntoa(&peer->srcadr), err, ctlpeerstatus(peer)); -#ifdef DEBUG - if (debug) - printf("peer %s event %x status %x\n", - ntoa(&peer->srcadr), err, ctlpeerstatus(peer)); -#endif - } else { - syslog(LOG_ERR, "report_event: err %x, no peer", err); -#ifdef DEBUG - printf("report_event: err %x, no peer\n", err); -#endif - return; - } - - /* - * If no trappers, return. - */ - if (num_ctl_traps <= 0) - return; - - /* - * Set up the outgoing packet variables - */ - res_opcode = CTL_OP_ASYNCMSG; - res_offset = 0; - res_async = 1; - res_authenticate = 0; - datapt = rpkt.data; - dataend = &(rpkt.data[CTL_MAX_DATA_LEN]); - - if (!(err & PEER_EVENT)) { - rpkt.associd = 0; - rpkt.status = htons(ctlsysstatus()); - - /* - * For now, put everything we know about system - * variables. Maybe more selective later - */ - for (i = 1; i <= CS_MAXCODE; i++) - ctl_putsys(i); -#ifdef REFCLOCK - /* - * for clock exception events: - * add clock variables to reflect info on exception - */ - if (err == EVNT_CLOCKEXCPT) { - struct refclockstat clock; - struct ctl_var *kv; - - clock.kv_list = (struct ctl_var *)0; - - refclock_control(&peer->srcadr, - (struct refclockstat *)0, &clock); - ctl_puthex("refclockstatus", ctlclkstatus(&clock)); - - for (i = 1; i <= CC_MAXCODE; i++) - ctl_putclock(i, &clock, 0); - for (kv = clock.kv_list; kv && !(kv->flags & EOV); kv++) - if (kv->flags & DEF) - ctl_putdata(kv->text, strlen(kv->text), 0); - - free_varlist(clock.kv_list); - } -#endif /*REFCLOCK*/ - } else { - rpkt.associd = htons(peer->associd); - rpkt.status = htons(ctlpeerstatus(peer)); - - /* - * Dump it all. Later, maybe less. - */ - for (i = 1; i <= CP_MAXCODE; i++) - ctl_putpeer(i, peer); -#ifdef REFCLOCK - /* - * for clock exception events: - * add clock variables to reflect info on exception - */ - if (err == EVNT_PEERCLOCK) { - struct refclockstat clock; - struct ctl_var *kv; - - clock.kv_list = (struct ctl_var *)0; - - refclock_control(&peer->srcadr, - (struct refclockstat *)0, - &clock); - - ctl_puthex("refclockstatus", - ctlclkstatus(&clock)); - - for (i = 1; i <= CC_MAXCODE; i++) - ctl_putclock(i, &clock, 0); - for (kv = clock.kv_list; kv && !(kv->flags & EOV); kv++) - if (kv->flags & DEF) - ctl_putdata(kv->text, strlen(kv->text), 0); - - free_varlist(clock.kv_list); - } -#endif /*REFCLOCK*/ - } - - /* - * We're done, return. - */ - ctl_flushpkt(0); -} - - -/* - * ctl_clr_stats - clear stat counters - */ -void -ctl_clr_stats() -{ - ctltimereset = current_time; - numctlreq = 0; - numctlbadpkts = 0; - numctlresponses = 0; - numctlfrags = 0; - numctlerrors = 0; - numctlfrags = 0; - numctltooshort = 0; - numctlinputresp = 0; - numctlinputfrag = 0; - numctlinputerr = 0; - numctlbadoffset = 0; - numctlbadversion = 0; - numctldatatooshort = 0; - numctlbadop = 0; - numasyncmsgs = 0; -} - -static u_long -count_var(k) - struct ctl_var *k; -{ - register u_long c; - - c = 0; - while (k && !(k++->flags & EOV)) - c++; - - return c; -} - -char * -add_var(kv, size, def) - struct ctl_var **kv; - u_long size; - int def; -{ - register u_long c; - register struct ctl_var *k; - - c = count_var(*kv); - - k = *kv; - *kv = (struct ctl_var *)emalloc((c+2)*sizeof(struct ctl_var)); - if (k) - { - memmove((char *)*kv, (char *)k, sizeof(struct ctl_var)*c); - free((char *)k); - } - - (*kv)[c].code = c; - (*kv)[c].text = (char *)emalloc(size); - (*kv)[c].flags = def; - (*kv)[c+1].code = 0; - (*kv)[c+1].text = (char *)0; - (*kv)[c+1].flags = EOV; - return (*kv)[c].text; -} - -void -set_var(kv, data, size, def) - struct ctl_var **kv; - char *data; - u_long size; - int def; -{ - register struct ctl_var *k; - register char *s, *t; - - if (!data || !size) - return; - - if ((k = *kv)) - { - while (!(k->flags & EOV)) - { - s = data; - t = k->text; - if (t) - { - while (*t != '=' && *s - *t == 0) - { - s++; - t++; - } - if (*s == *t && ((*t == '=') || !*t)) - { - free(k->text); - k->text = (char *)emalloc(size); - memmove(k->text, data, size); - k->flags = def; - return; - } - } - else - { - k->text = (char *)emalloc(size); - memmove(k->text, data, size); - k->flags = def; - return; - } - k++; - } - } - t = add_var(kv, size, def); - memmove(t, data, size); -} - -void -set_sys_var(data, size, def) - char *data; - u_long size; - int def; -{ - set_var(&ext_sys_var, data, size, def); -} - -void -free_varlist(kv) - struct ctl_var *kv; -{ - struct ctl_var *k; - if (kv) - { - for (k = kv; !(k->flags & EOV); k++) - free(k->text); - free((char *)kv); - } -} diff --git a/usr.sbin/xntpd/xntpd/ntp_filegen.c b/usr.sbin/xntpd/xntpd/ntp_filegen.c deleted file mode 100644 index cc4882b97985..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_filegen.c +++ /dev/null @@ -1,538 +0,0 @@ -/* - * ntp_filegen.c,v 3.12 1994/01/25 19:06:11 kardel Exp - * - * implements file generations support for NTP - * logfiles and statistic files - * - * - * Copyright (c) 1992 - * Rainer Pruy Friedrich-Alexander Unuiversitaet Erlangen-Nuernberg - * - * This code may be modified and used freely - * provided credits remain intact. - */ - -#include <stdio.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <errno.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_string.h" -#include "ntp_calendar.h" -#include "ntp_filegen.h" -#include "ntp_stdlib.h" - -/* - * NTP is intended to run long periods of time without restart. - * Thus log and statistic files generated by NTP will grow large. - * - * this set of routines provides a central interface - * to generating files using file generations - * - * the generation of a file is changed according to file generation type - */ - - -/* - * to check reason on open failure - */ -extern int errno; - -/* - * imported from timer - */ -extern u_long current_time; - -/* - * redefine this if your system dislikes filename suffixes like - * X.19910101 or X.1992W50 or .... - */ -#define SUFFIX_SEP '.' - -/* - * other constants - */ -#define FGEN_AGE_SECS (24*60*60) /* life time of FILEGEN_AGE in seconds */ - -#ifdef DEBUG -extern int debug; -#endif - -static void filegen_open P((FILEGEN *, u_long)); -static int valid_fileref P((char *, char *)); -#ifdef UNUSED -static FILEGEN *filegen_unregister P((char *)); -#endif /* UNUSED */ - -/* - * open a file generation according to the current settings of gen - * will also provide a link to basename if requested to do so - */ - -static void -filegen_open(gen, newid) - FILEGEN *gen; - u_long newid; -{ - char *filename; - char *basename; - u_int len; - FILE *fp; - struct calendar cal; - - len = strlen(gen->prefix) + strlen(gen->basename) + 1; - basename = emalloc(len); - sprintf(basename, "%s%s", gen->prefix, gen->basename); - - switch(gen->type) { - default: - syslog(LOG_ERR, "unsupported file generations type %d for \"%s\" - reverting to FILEGEN_NONE", - gen->type, basename); - gen->type = FILEGEN_NONE; - - /*FALLTHROUGH*/ - case FILEGEN_NONE: - filename = emalloc(len); - sprintf(filename,"%s", basename); - break; - - case FILEGEN_PID: - filename = emalloc(len + 1 + 1 + 10); - sprintf(filename,"%s%c#%ld", basename, SUFFIX_SEP, newid); - break; - - case FILEGEN_DAY: - /* You can argue here in favor of using MJD, but - * I would assume it to be easier for humans to interpret dates - * in a format they are used to in everyday life. - */ - caljulian(newid,&cal); - filename = emalloc(len + 1 + 4 + 2 + 2); - sprintf(filename, "%s%c%04d%02d%02d", - basename, SUFFIX_SEP, cal.year, cal.month, cal.monthday); - break; - - case FILEGEN_WEEK: - /* - * This is still a hack - * - the term week is not correlated to week as it is used - * normally - it just refers to a period of 7 days - * starting at Jan 1 - 'weeks' are counted starting from zero - */ - caljulian(newid,&cal); - filename = emalloc(len + 1 + 4 + 1 + 2); - sprintf(filename, "%s%c%04dw%02d", - basename, SUFFIX_SEP, cal.year, cal.yearday / 7); - break; - - case FILEGEN_MONTH: - caljulian(newid,&cal); - filename = emalloc(len + 1 + 4 + 2); - sprintf(filename, "%s%c%04d%02d", - basename, SUFFIX_SEP, cal.year, cal.month); - break; - - case FILEGEN_YEAR: - caljulian(newid,&cal); - filename = emalloc(len + 1 + 4); - sprintf(filename, "%s%c%04d", basename, SUFFIX_SEP, cal.year); - break; - - case FILEGEN_AGE: - filename = emalloc(len + 1 + 2 + 10); - sprintf(filename, "%s%ca%08ld", basename, SUFFIX_SEP, newid); - break; - } - - if (gen->type != FILEGEN_NONE) { - /* - * check for existence of a file with name 'basename' - * as we disallow such a file - * if FGEN_FLAG_LINK is set create a link - */ - struct stat stats; - /* - * try to resolve name collisions - */ - static u_long conflicts = 0; - -#ifndef S_ISREG -#define S_ISREG(mode) (((mode) & S_IFREG) == S_IFREG) -#endif - if (stat(basename, &stats) == 0) { - /* Hm, file exists... */ - if (S_ISREG(stats.st_mode)) { - if (stats.st_nlink <= 1) { - /* - * Oh, it is not linked - try to save it - */ - char *savename = emalloc(len + 1 + 1 + 10 + 10); - sprintf(savename, "%s%c%dC%lu", - basename, SUFFIX_SEP, getpid(), - (u_long)conflicts++); - if (rename(basename, savename) != 0) - syslog(LOG_ERR," couldn't save %s: %m", basename); - free(savename); - } else { - /* - * there is at least a second link tpo this file - * just remove the conflicting one - */ - if (unlink(basename) != 0) - syslog(LOG_ERR, "couldn't unlink %s: %m", basename); - } - } else { - /* - * Ehh? Not a regular file ?? strange !!!! - */ - syslog(LOG_ERR, "expected regular file for %s (found mode 0%o)", - basename, stats.st_mode); - } - } else { - /* - * stat(..) failed, but it is absolutely correct for - * 'basename' not to exist - */ - if (errno != ENOENT) - syslog(LOG_ERR,"stat(%s) failed: %m", basename); - } - } - - /* - * now, try to open new file generation... - */ - fp = fopen(filename, "a"); - -#ifdef DEBUG - if (debug > 3) - printf("opening filegen (type=%d/id=%lu) \"%s\"\n", - gen->type, (u_long)newid, filename); -#endif - - if (fp == NULL) { - /* open failed -- keep previous state - * - * If the file was open before keep the previous generation. - * This will cause output to end up in the 'wrong' file, - * but I think this is still better than loosing output - * - * ignore errors due to missing directories - */ - - if (errno != ENOENT) - syslog(LOG_ERR, "can't open %s: %m", filename); - } else { - if (gen->fp != NULL) { - fclose(gen->fp); - } - gen->fp = fp; - gen->id = newid; - - if (gen->flag & FGEN_FLAG_LINK) { - /* - * need to link file to basename - * have to use hardlink for now as I want to allow - * gen->basename spanning directory levels - * this would make it more complex to get the correct filename - * for symlink - * - * Ok, it would just mean taking the part following the last '/' - * in the name.... Should add it later.... - */ - - if (link(filename, basename) != 0) { - if (errno != EEXIST) - syslog(LOG_ERR, "can't link(%s, %s): %m", filename, basename); - } - - } /*flags & FGEN_FLAG_LINK*/ - } /*else fp == NULL*/ - - free(basename); - free(filename); - return; -} - -/* - * this function sets up gen->fp to point to the correct - * generation of the file for the time specified by 'now' - * - * 'now' usually is interpreted as second part of a l_fp as is in the cal... - * library routines - */ - -void -filegen_setup(gen,now) - FILEGEN *gen; - u_long now; -{ - u_long new_gen = ~0; - struct calendar cal; - - if (!(gen->flag & FGEN_FLAG_ENABLED)) { - if (gen->fp != NULL) - fclose(gen->fp); - return; - } - - switch (gen->type) { - case FILEGEN_NONE: - if (gen->fp != NULL) return; /* file already open */ - break; - - case FILEGEN_PID: - new_gen = getpid(); - break; - - case FILEGEN_DAY: - caljulian(now, &cal); - cal.hour = cal.minute = cal.second = 0; - new_gen = caltontp(&cal); - break; - - case FILEGEN_WEEK: - /* Would be nice to have a calweekstart() routine */ - /* so just use a hack ... */ - /* just round time to integral 7 days period for actual year */ - new_gen = now - (now - calyearstart(now)) % TIMES7(SECSPERDAY) - + 60; - /* - * just to be sure - - * the computation above would fail in the presence of leap seconds - * so at least carry the date to the next day (+60 (seconds)) - * and go back to the start of the day via calendar computations - */ - caljulian(new_gen, &cal); - cal.hour = cal.minute = cal.second = 0; - new_gen = caltontp(&cal); - break; - - case FILEGEN_MONTH: - caljulian(now, &cal); - cal.yearday -= cal.monthday - 1; - cal.monthday = 1; - cal.hour = cal.minute = cal.second = 0; - new_gen = caltontp(&cal); - break; - - case FILEGEN_YEAR: - new_gen = calyearstart(now); - break; - - case FILEGEN_AGE: - new_gen = current_time - (current_time % FGEN_AGE_SECS); - break; - } - /* - * try to open file if not yet open - * reopen new file generation file on change of generation id - */ - if (gen->fp == NULL || gen->id != new_gen) { - filegen_open(gen, new_gen); - } -} - - -/* - * change settings for filegen files - */ -void -filegen_config(gen,basename,type,flag) - FILEGEN *gen; - char *basename; - u_int type; - u_int flag; -{ - /* - * if nothing would be changed... - */ - if ((basename == gen->basename || strcmp(basename,gen->basename) == 0) && - type == gen->type && - flag == gen->flag) - return; - - /* - * validate parameters - */ - if (!valid_fileref(gen->prefix,basename)) - return; - - if (gen->fp != NULL) - fclose(gen->fp); - -#ifdef DEBUG - if (debug > 2) - printf("configuring filegen:\n\tprefix:\t%s\n\tbasename:\t%s -> %s\n\ttype:\t%d -> %d\n\tflag: %x -> %x\n", - gen->prefix, gen->basename, basename, gen->type, type, gen->flag, flag); -#endif - if (gen->basename != basename || strcmp(gen->basename, basename) != 0) { - free(gen->basename); - gen->basename = emalloc(strlen(basename) + 1); - strcpy(gen->basename, basename); - } - gen->type = type; - gen->flag = flag; - - /* - * make filegen use the new settings - * special action is only required when a generation file - * is currently open - * otherwise the new settings will be used anyway at the next open - */ - if (gen->fp != NULL) { - l_fp now; - - gettstamp(&now); - filegen_setup(gen, now.l_ui); - } -} - - -/* - * check whether concatenating prefix and basename - * yields a legal filename - */ -static int -valid_fileref(prefix,basename) - char *prefix, *basename; -{ - /* - * prefix cannot be changed dynamically - * (within the context of filegen) - * so just reject basenames containing '..' - * - * ASSUMPTION: - * file system parts 'below' prefix may be - * specified without infringement of security - * - * restricing prefix to legal values - * has to be ensured by other means - * (however, it would be possible to perform some checks here...) - */ - register char *p = basename; - - /* - * Just to catch, dumb errors opening up the world... - */ - if (prefix == NULL || *prefix == '\0') - return 0; - - if (basename == NULL) - return 0; - - for (p = basename; p; p = strchr(p, '/')) { - if (*p == '.' && *(p+1) == '.' && (*(p+2) == '\0' || *(p+2) == '/')) - return 0; - } - - return 1; -} - - -/* - * filegen registry - */ - - -static struct filegen_entry { - char *name; - FILEGEN *filegen; - struct filegen_entry *next; -} *filegen_registry = NULL; - - -FILEGEN * -filegen_get(name) - char *name; -{ - struct filegen_entry *f = filegen_registry; - - while(f) { - if (f->name == name || strcmp(name, f->name) == 0) { -#ifdef XXX /* this gives the Alpha compiler fits */ - if (debug > 3) - printf("filegen_get(\"%s\") = %x\n", name, - (u_int)f->filegen); -#endif - return f->filegen; - } - f = f->next; - } -#ifdef DEBUG - if (debug > 3) - printf("filegen_get(\"%s\") = NULL\n", name); -#endif - return NULL; -} - -void -filegen_register(name, filegen) - char *name; - FILEGEN *filegen; -{ - struct filegen_entry **f = &filegen_registry; - -#ifdef XXX /* this gives the Alpha compiler fits */ - if (debug > 3) - printf("filegen_register(\"%s\",%x)\n", name, (u_int)filegen); -#endif - while (*f) { - if ((*f)->name == name || strcmp(name, (*f)->name) == 0) { -#ifdef XXX /* this gives the Alpha compiler fits */ - if (debug > 4) { - printf("replacing filegen %x\n", (u_int)(*f)->filegen); - } -#endif - (*f)->filegen = filegen; - return; - } - f = &((*f)->next); - } - - *f = (struct filegen_entry *) emalloc(sizeof(struct filegen_entry)); - if (*f) { - (*f)->next = NULL; - (*f)->name = emalloc(strlen(name) + 1); - strcpy((*f)->name, name); - (*f)->filegen = filegen; -#ifdef DEBUG - if (debug > 5) { - printf("adding new filegen\n"); - } -#endif - } - - return; -} - -#ifdef UNUSED -static FILEGEN * -filegen_unregister(name) - char *name; -{ - struct filegen_entry **f = &filegen_registry; - -#ifdef DEBUG - if (debug > 3) - printf("filegen_unregister(\"%s\")\n", name); -#endif - - while (*f) { - if (strcmp((*f)->name,name) == 0) { - struct filegen_entry *ff = *f; - FILEGEN *fg; - - *f = (*f)->next; - fg = ff->filegen; - free(ff->name); - free(ff); - return fg; - } - f = &((*f)->next); - } - return NULL; -} -#endif /* UNUSED */ - diff --git a/usr.sbin/xntpd/xntpd/ntp_intres.c b/usr.sbin/xntpd/xntpd/ntp_intres.c deleted file mode 100644 index 62d379235c6c..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_intres.c +++ /dev/null @@ -1,799 +0,0 @@ -/* - * ripped off from ../xnptres/xntpres.c by Greg Troxel 4/2/92 - * routine callable from xntpd, rather than separate program - * also, key info passed in via a global, so no key file needed. - */ - -/* - * xntpres - process configuration entries which require use of the resolver - * - * This is meant to be run by xntpd on the fly. It is not guaranteed - * to work properly if run by hand. This is actually a quick hack to - * stave off violence from people who hate using numbers in the - * configuration file (at least I hope the rest of the daemon is - * better than this). Also might provide some ideas about how one - * might go about autoconfiguring an NTP distribution network. - * - */ - -#include <stdio.h> -#include <ctype.h> -#include <sys/types.h> -#include <sys/time.h> -#include <netdb.h> -#include <signal.h> -#include <errno.h> - -#include "ntpd.h" -#include "ntp_select.h" -#include "ntp_io.h" -#include "ntp_request.h" -#include "ntp_stdlib.h" -#include "ntp_syslog.h" - -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -/* - * Each item we are to resolve and configure gets one of these - * structures defined for it. - */ -struct conf_entry { - struct conf_entry *ce_next; - char *ce_name; /* name we are trying to resolve */ - struct conf_peer ce_config; /* configuration info for peer */ -}; -#define ce_peeraddr ce_config.peeraddr -#define ce_hmode ce_config.hmode -#define ce_version ce_config.version -#define ce_minpoll ce_config.minpoll -#define ce_maxpoll ce_config.maxpoll -#define ce_flags ce_config.flags -#define ce_ttl ce_config.ttl -#define ce_keyid ce_config.keyid - -/* - * confentries is a pointer to the list of configuration entries - * we have left to do. - */ -struct conf_entry *confentries = NULL; - -/* - * We take an interrupt every thirty seconds, at which time we decrement - * config_timer and resolve_timer. The former is set to 2, so we retry - * unsucessful reconfigurations every minute. The latter is set to - * an exponentially increasing value which starts at 2 and increases to - * 32. When this expires we retry failed name resolutions. - * - * We sleep SLEEPTIME seconds before doing anything, to give the server - * time to arrange itself. - */ -#define MINRESOLVE 2 -#define MAXRESOLVE 32 -#define CONFIG_TIME 2 -#define ALARM_TIME 30 - -#define SLEEPTIME 2 - -static int config_timer = 0; -static int resolve_timer = 0; - -static int resolve_value; /* next value of resolve timer */ - -/* - * Big hack attack - */ -#define LOCALHOST 0x7f000001 /* 127.0.0.1, in hex, of course */ -#define SKEWTIME 0x08000000 /* 0.03125 seconds as a l_fp fraction */ - -/* - * Select time out. Set to 2 seconds. The server is on the local machine, - * after all. - */ -#define TIMEOUT_SEC 2 -#define TIMEOUT_USEC 0 - - -/* - * Input processing. The data on each line in the configuration file - * is supposed to consist of entries in the following order - */ -#define TOK_HOSTNAME 0 -#define TOK_HMODE 1 -#define TOK_VERSION 2 -#define TOK_MINPOLL 3 -#define TOK_MAXPOLL 4 -#define TOK_FLAGS 5 -#define TOK_TTL 6 -#define TOK_KEYID 7 -#define NUMTOK 8 - -#define MAXLINESIZE 512 - - -/* - * File descriptor for ntp request code. - */ -static int sockfd = -1; - - -/* stuff to be filled in by caller */ - -u_long req_keyid; /* request keyid */ -char *req_file; /* name of the file with configuration info */ - -/* end stuff to be filled in */ - - -extern int debug; /* use global debug flag */ -extern int errno; - -static RETSIGTYPE bong P((int)); -static void checkparent P((void)); -static void removeentry P((struct conf_entry *)); -static void addentry P((char *, int, int, int, int, int, int, u_long)); -static int findhostaddr P((struct conf_entry *)); -static void openntp P((void)); -static int request P((struct conf_peer *)); -static char * nexttoken P((char **)); -static void readconf P((FILE *, char *)); -static void doconfigure P((int)); - -/* - * assumes: req_key, req_keyid, conffile valid - * syslog still open - */ -void -ntp_intres() -{ - FILE *in; - -#ifdef DEBUG - if ( debug ) - syslog(LOG_INFO, "ntp_intres running"); -#endif - - /* check out auth stuff */ - if (!authhavekey(req_keyid)) { - syslog(LOG_ERR, "request keyid %lu not found", - req_keyid ); - exit(1); - } - - /* - * Read the configuration info - * {this is bogus, since we are forked, but it is easier - * to keep this code - gdt} - */ - if ((in = fopen(req_file, "r")) == NULL) { - syslog(LOG_ERR, "can't open configuration file %s: %m", - req_file); - exit(1); - } - readconf(in, req_file); - (void) fclose(in); - - if (!debug ) - (void) unlink(req_file); - - /* - * Sleep a little to make sure the server is completely up - */ - sleep(SLEEPTIME); - - /* - * Make a first cut at resolving the bunch - */ - doconfigure(1); - if (confentries == NULL) - exit(0); /* done that quick */ - - /* - * Here we've got some problem children. Set up the timer - * and wait for it. - */ - resolve_value = resolve_timer = MINRESOLVE; - config_timer = CONFIG_TIME; - (void) signal_no_reset(SIGALRM, bong); - alarm(ALARM_TIME); - - for (;;) { - if (confentries == NULL) - exit(0); - checkparent(); - if (resolve_timer == 0) { - if (resolve_value < MAXRESOLVE) - resolve_value <<= 1; - resolve_timer = resolve_value; - config_timer = CONFIG_TIME; - doconfigure(1); - continue; - } else if (config_timer == 0) { - config_timer = CONFIG_TIME; - doconfigure(0); - continue; - } - /* - * There is a race in here. Is okay, though, since - * all it does is delay things by 30 seconds. - */ - (void) pause(); - } -} - - -/* - * bong - service and reschedule an alarm() interrupt - */ -static RETSIGTYPE -bong(sig) -int sig; -{ - if (config_timer > 0) - config_timer--; - if (resolve_timer > 0) - resolve_timer--; - alarm(ALARM_TIME); -} - - -/* - * checkparent - see if our parent process is still running - */ -static void -checkparent() -{ - /* - * If our parent (the server) has died we will have been - * inherited by init. If so, exit. - */ - if (getppid() == 1) { - syslog(LOG_INFO, "parent died before we finished, exiting"); - exit(0); - } -} - - -/* - * removeentry - we are done with an entry, remove it from the list - */ -static void -removeentry(entry) - struct conf_entry *entry; -{ - register struct conf_entry *ce; - - ce = confentries; - if (ce == entry) { - confentries = ce->ce_next; - return; - } - - while (ce != NULL) { - if (ce->ce_next == entry) { - ce->ce_next = entry->ce_next; - return; - } - ce = ce->ce_next; - } -} - - -/* - * addentry - add an entry to the configuration list - */ -static void -addentry(name, mode, version, minpoll, maxpoll, flags, ttl, keyid) - char *name; - int mode; - int version; - int minpoll; - int maxpoll; - int flags; - int ttl; - u_long keyid; -{ - register char *cp; - register struct conf_entry *ce; - int len; - - len = strlen(name) + 1; - cp = emalloc((unsigned)len); - memmove(cp, name, len); - - ce = (struct conf_entry *)emalloc(sizeof(struct conf_entry)); - ce->ce_name = cp; - ce->ce_peeraddr = 0; - ce->ce_hmode = (u_char)mode; - ce->ce_version = (u_char)version; - ce->ce_minpoll = (u_char)minpoll; - ce->ce_maxpoll = (u_char)maxpoll; - ce->ce_flags = (u_char)flags; - ce->ce_ttl = (u_char)ttl; - ce->ce_keyid = keyid; - ce->ce_next = NULL; - - if (confentries == NULL) { - confentries = ce; - } else { - register struct conf_entry *cep; - - for (cep = confentries; cep->ce_next != NULL; - cep = cep->ce_next) - /* nothing */; - cep->ce_next = ce; - } -} - - -/* - * findhostaddr - resolve a host name into an address - * - * The routine sticks the address into the entry's ce_peeraddr if it - * gets one. It returns 1 for "success" and 0 for an uncorrectable - * failure. Note that "success" includes try again errors. You can - * tell that you got a try again since ce_peeraddr will still be zero. - */ -static int -findhostaddr(entry) - struct conf_entry *entry; -{ - struct hostent *hp; - - checkparent(); /* make sure our guy is still running */ - - hp = gethostbyname(entry->ce_name); - - if (hp == NULL) { -#ifndef NODNS - /* - * If the resolver is in use, see if the failure is - * temporary. If so, return success. - */ - extern int h_errno; - - if (h_errno == TRY_AGAIN) - return (1); -#endif - return (0); - } - - /* - * Use the first address. We don't have any way to - * tell preferences and older gethostbyname() implementations - * only return one. - */ - memmove((char *)&(entry->ce_peeraddr), - (char *)hp->h_addr, - sizeof(struct in_addr)); - return (1); -} - - -/* - * openntp - open a socket to the ntp server - */ -static void -openntp() -{ - struct sockaddr_in saddr; - - if (sockfd >= 0) - return; - - sockfd = socket(AF_INET, SOCK_DGRAM, 0); - if (sockfd == -1) { - syslog(LOG_ERR, "socket() failed: %m"); - exit(1); - } - - memset((char *)&saddr, 0, sizeof(saddr)); - saddr.sin_family = AF_INET; - saddr.sin_port = htons(NTP_PORT); /* trash */ - saddr.sin_addr.s_addr = htonl(LOCALHOST); /* garbage */ - - /* - * Make the socket non-blocking. We'll wait with select() - */ -#if defined(O_NONBLOCK) - if (fcntl(sockfd, F_SETFL, O_NONBLOCK) == -1) { - syslog(LOG_ERR, "fcntl(O_NONBLOCK) failed: %m"); - exit(1); - } -#else -#if defined(FNDELAY) - if (fcntl(sockfd, F_SETFL, FNDELAY) == -1) { - syslog(LOG_ERR, "fcntl(FNDELAY) failed: %m"); - exit(1); - } -#else -NEED NON BLOCKING IO -#endif -#endif - - - if (connect(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)) == -1) { - syslog(LOG_ERR, "connect() failed: %m"); - exit(1); - } -} - - -/* - * request - send a configuration request to the server, wait for a response - */ -static int -request(conf) - struct conf_peer *conf; -{ - fd_set fdset; - struct timeval tvout; - struct req_pkt reqpkt; - l_fp ts; - int n; - - checkparent(); /* make sure our guy is still running */ - - if (sockfd < 0) - openntp(); - - /* - * Try to clear out any previously received traffic so it - * doesn't fool us. Note the socket is nonblocking. - */ - tvout.tv_sec = 0; - tvout.tv_usec = 0; - FD_ZERO(&fdset); - FD_SET(sockfd, &fdset); - while (select(sockfd + 1, &fdset, (fd_set *)0, (fd_set *)0, &tvout) > - 0) { - read(sockfd, (char *)&reqpkt, REQ_LEN_MAC); - FD_ZERO(&fdset); - FD_SET(sockfd, &fdset); - } - - /* - * Make up a request packet with the configuration info - */ - memset((char *)&reqpkt, 0, sizeof(reqpkt)); - - reqpkt.rm_vn_mode = RM_VN_MODE(0, 0); - reqpkt.auth_seq = AUTH_SEQ(1, 0); /* authenticated, no seq */ - reqpkt.implementation = IMPL_XNTPD; /* local implementation */ - reqpkt.request = REQ_CONFIG; /* configure a new peer */ - reqpkt.err_nitems = ERR_NITEMS(0, 1); /* one item */ - reqpkt.mbz_itemsize = MBZ_ITEMSIZE(sizeof(struct conf_peer)); - memmove(reqpkt.data, (char *)conf, sizeof(struct conf_peer)); - reqpkt.keyid = htonl(req_keyid); - - auth1crypt(req_keyid, (U_LONG *)&reqpkt, REQ_LEN_NOMAC); - gettstamp(&ts); - L_ADDUF(&ts, SKEWTIME); - HTONL_FP(&ts, &reqpkt.tstamp); - n = auth2crypt(req_keyid, (U_LONG *)&reqpkt, REQ_LEN_NOMAC); - - /* - * Done. Send it. - */ - n = write(sockfd, (char *)&reqpkt, REQ_LEN_NOMAC + n); - if (n < 0) { - syslog(LOG_ERR, "send to NTP server failed: %m"); - return 0; /* maybe should exit */ - } - - /* - * Wait for a response. A weakness of the mode 7 protocol used - * is that there is no way to associate a response with a - * particular request, i.e. the response to this configuration - * request is indistinguishable from that to any other. I should - * fix this some day. In any event, the time out is fairly - * pessimistic to make sure that if an answer is coming back - * at all, we get it. - */ - for (;;) { - FD_ZERO(&fdset); - FD_SET(sockfd, &fdset); - tvout.tv_sec = TIMEOUT_SEC; - tvout.tv_usec = TIMEOUT_USEC; - - n = select(sockfd + 1, &fdset, (fd_set *)0, - (fd_set *)0, &tvout); - - if (n <= 0) { - if (n < 0) - syslog(LOG_ERR, "select() fails: %m"); - return 0; - } - - n = read(sockfd, (char *)&reqpkt, REQ_LEN_MAC); - if (n <= 0) { - if (n < 0) { - syslog(LOG_ERR, "read() fails: %m"); - return 0; - } - continue; - } - - /* - * Got one. Check through to make sure it is what - * we expect. - */ - if (n < RESP_HEADER_SIZE) { - syslog(LOG_ERR, "received runt response (%d octets)", - n); - continue; - } - - if (!ISRESPONSE(reqpkt.rm_vn_mode)) { -#ifdef DEBUG - if (debug > 1) - printf("received non-response packet\n"); -#endif - continue; - } - - if (ISMORE(reqpkt.rm_vn_mode)) { -#ifdef DEBUG - if (debug > 1) - printf("received fragmented packet\n"); -#endif - continue; - } - - if (INFO_VERSION(reqpkt.rm_vn_mode) != NTP_VERSION - || INFO_MODE(reqpkt.rm_vn_mode) != MODE_PRIVATE) { -#ifdef DEBUG - if (debug > 1) - printf("version (%d) or mode (%d) incorrect\n", - INFO_VERSION(reqpkt.rm_vn_mode), - INFO_MODE(reqpkt.rm_vn_mode)); -#endif - continue; - } - - if (INFO_SEQ(reqpkt.auth_seq) != 0) { -#ifdef DEBUG - if (debug > 1) - printf("nonzero sequence number (%d)\n", - INFO_SEQ(reqpkt.auth_seq)); -#endif - continue; - } - - if (reqpkt.implementation != IMPL_XNTPD || - reqpkt.request != REQ_CONFIG) { -#ifdef DEBUG - if (debug > 1) - printf( - "implementation (%d) or request (%d) incorrect\n", - reqpkt.implementation, reqpkt.request); -#endif - continue; - } - - if (INFO_NITEMS(reqpkt.err_nitems) != 0 || - INFO_MBZ(reqpkt.mbz_itemsize) != 0 || - INFO_ITEMSIZE(reqpkt.mbz_itemsize != 0)) { -#ifdef DEBUG - if (debug > 1) - printf( - "nitems (%d) mbz (%d) or itemsize (%d) nonzero\n", - INFO_NITEMS(reqpkt.err_nitems), - INFO_MBZ(reqpkt.mbz_itemsize), - INFO_ITEMSIZE(reqpkt.mbz_itemsize)); -#endif - continue; - } - - n = INFO_ERR(reqpkt.err_nitems); - switch (n) { - case INFO_OKAY: - /* success */ - return 1; - - case INFO_ERR_IMPL: - syslog(LOG_ERR, - "server reports implementation mismatch!!"); - return 0; - - case INFO_ERR_REQ: - syslog(LOG_ERR, - "server claims configuration request is unknown"); - return 0; - - case INFO_ERR_FMT: - syslog(LOG_ERR, - "server indicates a format error occured(!!)"); - return 0; - - case INFO_ERR_NODATA: - syslog(LOG_ERR, - "server indicates no data available (shouldn't happen)"); - return 0; - - case INFO_ERR_AUTH: - syslog(LOG_ERR, - "server returns a permission denied error"); - return 0; - - default: - syslog(LOG_ERR, - "server returns unknown error code %d", n); - return 0; - } - } -} - - -/* - * nexttoken - return the next token from a line - */ -static char * -nexttoken(lptr) - char **lptr; -{ - register char *cp; - register char *tstart; - - cp = *lptr; - - /* - * Skip leading white space - */ - while (*cp == ' ' || *cp == '\t') - cp++; - - /* - * If this is the end of the line, return nothing. - */ - if (*cp == '\n' || *cp == '\0') { - *lptr = cp; - return NULL; - } - - /* - * Must be the start of a token. Record the pointer and look - * for the end. - */ - tstart = cp++; - while (*cp != ' ' && *cp != '\t' && *cp != '\n' && *cp != '\0') - cp++; - - /* - * Terminate the token with a \0. If this isn't the end of the - * line, space to the next character. - */ - if (*cp == '\n' || *cp == '\0') - *cp = '\0'; - else - *cp++ = '\0'; - - *lptr = cp; - return tstart; -} - - -/* - * readconf - read the configuration information out of the file we - * were passed. Note that since the file is supposed to be - * machine generated, we bail out at the first sign of trouble. - */ -static void -readconf(fp, name) - FILE *fp; - char *name; -{ - register int i; - char *token[NUMTOK]; - u_long intval[NUMTOK]; - int flags; - char buf[MAXLINESIZE]; - char *bp; - - while (fgets(buf, MAXLINESIZE, fp) != NULL) { - - bp = buf; - for (i = 0; i < NUMTOK; i++) { - if ((token[i] = nexttoken(&bp)) == NULL) { - syslog(LOG_ERR, - "tokenizing error in file `%s', quitting", - name); - exit(1); - } - } - - for (i = 1; i < NUMTOK; i++) { - if (!atouint(token[i], &intval[i])) { - syslog(LOG_ERR, - "format error for integer token `%s', file `%s', quitting", - token[i], name); - exit(1); - } - } - - if (intval[TOK_HMODE] != MODE_ACTIVE && - intval[TOK_HMODE] != MODE_CLIENT && - intval[TOK_HMODE] != MODE_BROADCAST) { - syslog(LOG_ERR, "invalid mode (%d) in file %s", - intval[TOK_HMODE], name); - exit(1); - } - - if (intval[TOK_VERSION] > NTP_VERSION || - intval[TOK_VERSION] < NTP_OLDVERSION) { - syslog(LOG_ERR, "invalid version (%d) in file %s", - intval[TOK_VERSION], name); - exit(1); - } - if (intval[TOK_MINPOLL] < NTP_MINPOLL || - intval[TOK_MINPOLL] > NTP_MAXPOLL) { - syslog(LOG_ERR, "invalid MINPOLL value (%d) in file %s", - intval[TOK_MINPOLL], name); - exit(1); - } - - if (intval[TOK_MAXPOLL] < NTP_MINPOLL || - intval[TOK_MAXPOLL] > NTP_MAXPOLL) { - syslog(LOG_ERR, "invalid MAXPOLL value (%d) in file %s", - intval[TOK_MAXPOLL], name); - exit(1); - } - - if ((intval[TOK_FLAGS] & ~(FLAG_AUTHENABLE|FLAG_PREFER)) - != 0) { - syslog(LOG_ERR, "invalid flags (%d) in file %s", - intval[TOK_FLAGS], name); - exit(1); - } - - flags = 0; - if (intval[TOK_FLAGS] & FLAG_AUTHENABLE) - flags |= CONF_FLAG_AUTHENABLE; - if (intval[TOK_FLAGS] & FLAG_PREFER) - flags |= CONF_FLAG_PREFER; - - /* - * This is as good as we can check it. Add it in. - */ - addentry(token[TOK_HOSTNAME], (int)intval[TOK_HMODE], - (int)intval[TOK_VERSION], (int)intval[TOK_MINPOLL], - (int)intval[TOK_MAXPOLL], flags, (int)intval[TOK_TTL], - intval[TOK_KEYID]); - } -} - - -/* - * doconfigure - attempt to resolve names and configure the server - */ -static void -doconfigure(dores) - int dores; -{ - register struct conf_entry *ce; - register struct conf_entry *ceremove; - - ce = confentries; - while (ce != NULL) { - if (dores && ce->ce_peeraddr == 0) { - if (!findhostaddr(ce)) { - syslog(LOG_ERR, - "couldn't resolve `%s', giving up on it", - ce->ce_name); - ceremove = ce; - ce = ceremove->ce_next; - removeentry(ceremove); - continue; - } - } - - if (ce->ce_peeraddr != 0) { - if (request(&ce->ce_config)) { - ceremove = ce; - ce = ceremove->ce_next; - removeentry(ceremove); - continue; - } - } - ce = ce->ce_next; - } -} diff --git a/usr.sbin/xntpd/xntpd/ntp_io.c b/usr.sbin/xntpd/xntpd/ntp_io.c deleted file mode 100644 index ba35a2ffa4b4..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_io.c +++ /dev/null @@ -1,1807 +0,0 @@ -/* - * xntp_io.c - input/output routines for xntpd. The socket-opening code - * was shamelessly stolen from ntpd. - */ -#include <stdio.h> -#include <signal.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/param.h> -#include <sys/time.h> -#ifndef __bsdi__ -#include <netinet/in.h> -#include <arpa/inet.h> -#endif -#if defined(__bsdi__) || defined(SYS_NETBSD) || defined(SYS_FREEBSD) || defined(SYS_AIX) -#include <sys/ioctl.h> -#endif - -#include "ntpd.h" -#include "ntp_select.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_if.h" -#include "ntp_stdlib.h" - -#if defined(MCAST) && !defined(IP_ADD_MEMBERSHIP) -#undef MCAST -#endif - -#if defined(BSD)&&!defined(sun)&&!defined(SYS_SINIXM) -#if BSD >= 199006 -#define HAVE_VARIABLE_IFR_LENGTH -#endif -#endif - -#if !defined(HAVE_VARIABLE_IFR_LENGTH) && defined(AF_LINK) && (defined(_SOCKADR_LEN) || !defined(SYS_DECOSF1)) -#define HAVE_VARIABLE_IFR_LENGTH -#endif - -#if defined(USE_TTY_SIGPOLL)||defined(USE_UDP_SIGPOLL) -#if defined(SYS_AIX)&&defined(_IO) -#undef _IO -#endif -#include <stropts.h> -#endif - -/* - * We do asynchronous input using the SIGIO facility. A number of - * recvbuf buffers are preallocated for input. In the signal - * handler we poll to see which sockets are ready and read the - * packets from them into the recvbuf's along with a time stamp and - * an indication of the source host and the interface it was received - * through. This allows us to get as accurate receive time stamps - * as possible independent of other processing going on. - * - * We watch the number of recvbufs available to the signal handler - * and allocate more when this number drops below the low water - * mark. If the signal handler should run out of buffers in the - * interim it will drop incoming frames, the idea being that it is - * better to drop a packet than to be inaccurate. - */ - -/* - * Block the interrupt, for critical sections. - */ -#if defined(HAVE_SIGNALED_IO) -#define BLOCKIO() ((void) block_sigio()) -#define UNBLOCKIO() ((void) unblock_sigio()) -#else -#define BLOCKIO() -#define UNBLOCKIO() -#endif - -/* - * recvbuf memory management - */ -#define RECV_INIT 10 /* 10 buffers initially */ -#define RECV_LOWAT 3 /* when we're down to three buffers get more */ -#define RECV_INC 5 /* get 5 more at a time */ -#define RECV_TOOMANY 30 /* this is way too many buffers */ - -/* - * Memory allocation - */ -u_long full_recvbufs; /* number of recvbufs on fulllist */ -u_long free_recvbufs; /* number of recvbufs on freelist */ - -static struct recvbuf *freelist; /* free buffers */ -static struct recvbuf *fulllist; /* lifo buffers with data */ -static struct recvbuf *beginlist; /* fifo buffers with data */ - -u_long total_recvbufs; /* total recvbufs currently in use */ -u_long lowater_additions; /* number of times we have added memory */ - -static struct recvbuf initial_bufs[RECV_INIT]; /* initial allocation */ - - -/* - * Other statistics of possible interest - */ -u_long packets_dropped; /* total number of packets dropped on reception */ -u_long packets_ignored; /* packets received on wild card interface */ -u_long packets_received; /* total number of packets received */ -u_long packets_sent; /* total number of packets sent */ -u_long packets_notsent; /* total number of packets which couldn't be sent */ - -u_long handler_calls; /* number of calls to interrupt handler */ -u_long handler_pkts; /* number of pkts received by handler */ -u_long io_timereset; /* time counters were reset */ - -/* - * Interface stuff - */ -#define MAXINTERFACES 192 /* much better for big gateways with IP/X.25 and more ... */ -struct interface *any_interface; /* pointer to default interface */ -struct interface *loopback_interface; /* point to loopback interface */ -static struct interface inter_list[MAXINTERFACES]; -static int ninterfaces; - -#ifdef REFCLOCK -/* - * Refclock stuff. We keep a chain of structures with data concerning - * the guys we are doing I/O for. - */ -static struct refclockio *refio; -#endif - -/* - * File descriptor masks etc. for call to select - */ -fd_set activefds; -int maxactivefd; - -/* - * Imported from ntp_timer.c - */ -extern u_long current_time; - -extern int errno; -extern int debug; - -static int create_sockets P((u_int)); -static int open_socket P((struct sockaddr_in *, int)); -static void close_socket P((int)); -#ifdef HAVE_SIGNALED_IO -static int init_clock_sig P(()); -static void init_socket_sig P((int)); -static void set_signal P(()); -static RETSIGTYPE sigio_handler P((int)); -static void block_sigio P((void)); -static void unblock_sigio P(()); -#endif - -/* - * init_io - initialize I/O data structures and call socket creation routine - */ -void -init_io() -{ - register int i; - - /* - * Init buffer free list and stat counters - */ - freelist = 0; - for (i = 0; i < RECV_INIT; i++) { - initial_bufs[i].next = freelist; - freelist = &initial_bufs[i]; - } - - fulllist = 0; - free_recvbufs = total_recvbufs = RECV_INIT; - full_recvbufs = lowater_additions = 0; - packets_dropped = packets_received = 0; - packets_ignored = 0; - packets_sent = packets_notsent = 0; - handler_calls = handler_pkts = 0; - io_timereset = 0; - loopback_interface = 0; - -#ifdef REFCLOCK - refio = 0; -#endif - -#if defined(HAVE_SIGNALED_IO) - (void) set_signal(); -#endif - - /* - * Create the sockets - */ - BLOCKIO(); - (void) create_sockets(htons(NTP_PORT)); - UNBLOCKIO(); - -#ifdef DEBUG - if (debug) - printf("init_io: maxactivefd %d\n", maxactivefd); -#endif -} - -/* - * create_sockets - create a socket for each interface plus a default - * socket for when we don't know where to send - */ -static int -create_sockets(port) - u_int port; -{ -#ifdef STREAMS_TLI - struct strioctl ioc; -#endif /* STREAMS_TLI */ - char buf[MAXINTERFACES*sizeof(struct ifreq)]; - struct ifconf ifc; - struct ifreq ifreq, *ifr; - int n, i, j, vs, size; - struct sockaddr_in resmask; - -#ifdef DEBUG - if (debug) - printf("create_sockets(%d)\n", ntohs(port)); -#endif - - /* - * create pseudo-interface with wildcard address - */ - inter_list[0].sin.sin_family = AF_INET; - inter_list[0].sin.sin_port = port; - inter_list[0].sin.sin_addr.s_addr = htonl(INADDR_ANY); - (void) strncpy(inter_list[0].name, "wildcard", - sizeof(inter_list[0].name)); - inter_list[0].mask.sin_addr.s_addr = htonl(~0); - inter_list[0].received = 0; - inter_list[0].sent = 0; - inter_list[0].notsent = 0; - inter_list[0].flags = INT_BROADCAST; - -#ifdef USE_STREAMS_DEVICE_FOR_IF_CONFIG - if ((vs = open("/dev/ip", O_RDONLY)) < 0) { -#else /* ! USE_STREAMS_DEVICE_FOR_IF_CONFIG */ - if ((vs = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { -#endif /* USE_STREAMS_DEVICE_FOR_IF_CONFIG */ - syslog(LOG_ERR, "vs=socket(AF_INET, SOCK_DGRAM) %m"); - exit(1); - } - - i = 1; - - ifc.ifc_len = sizeof(buf); -#ifdef STREAMS_TLI - ioc.ic_cmd = SIOCGIFCONF; - ioc.ic_timout = 0; - ioc.ic_dp = (caddr_t)buf; - ioc.ic_len = sizeof(buf); - if(ioctl(vs, I_STR, &ioc) < 0 || - ioc.ic_len < sizeof(struct ifreq)) { - syslog(LOG_ERR, "get interface configuration: %m"); - exit(1); - } -#ifdef SIZE_RETURNED_IN_BUFFER - ifc.ifc_len = ioc.ic_len - sizeof(int); - ifc.ifc_buf = buf + sizeof(int); -#else /* ! SIZE_RETURNED_IN_BUFFER */ - ifc.ifc_len = ioc.ic_len; - ifc.ifc_buf = buf; -#endif /* SIZE_RETURNED_IN_BUFFER */ - -#else /* ! STREAMS_TLI */ - ifc.ifc_len = sizeof(buf); - ifc.ifc_buf = buf; - if (ioctl(vs, SIOCGIFCONF, (char *)&ifc) < 0) { - syslog(LOG_ERR, "get interface configuration: %m"); - exit(1); - } -#endif /* STREAMS_TLI */ - - for(n = ifc.ifc_len, ifr = ifc.ifc_req; n > 0; - ifr = (struct ifreq *)((char *)ifr + size)) { - size = sizeof(*ifr); - -#ifdef HAVE_VARIABLE_IFR_LENGTH - if (ifr->ifr_addr.sa_len > sizeof(ifr->ifr_addr)) - size += ifr->ifr_addr.sa_len - sizeof(struct sockaddr); -#endif - n -= size; - if (ifr->ifr_addr.sa_family != AF_INET) - continue; - ifreq = *ifr; -#ifdef STREAMS_TLI - ioc.ic_cmd = SIOCGIFFLAGS; - ioc.ic_timout = 0; - ioc.ic_dp = (caddr_t)&ifreq; - ioc.ic_len = sizeof(struct ifreq); - if(ioctl(vs, I_STR, &ioc)) { -#else /* ! STREAMS_TLI */ - if (ioctl(vs, SIOCGIFFLAGS, (char *)&ifreq) < 0) { -#endif /* STREAMS_TLI */ - syslog(LOG_ERR, "get interface flags: %m"); - continue; - } - if ((ifreq.ifr_flags & IFF_UP) == 0) - continue; - inter_list[i].flags = 0; - if (ifreq.ifr_flags & IFF_BROADCAST) - inter_list[i].flags |= INT_BROADCAST; -#if !defined(SUN_3_3_STINKS) -#if defined(SYS_HPUX) && (SYS_HPUX < 8) - if (ifreq.ifr_flags & IFF_LOCAL_LOOPBACK) -#else - if (ifreq.ifr_flags & IFF_LOOPBACK) -#endif - { - inter_list[i].flags |= INT_LOOPBACK; - if (loopback_interface == 0) - loopback_interface = &inter_list[i]; - } -#endif - -#ifdef STREAMS_TLI - ioc.ic_cmd = SIOCGIFADDR; - ioc.ic_timout = 0; - ioc.ic_dp = (caddr_t)&ifreq; - ioc.ic_len = sizeof(struct ifreq); - if(ioctl(vs, I_STR, &ioc)) { -#else /* ! STREAMS_TLI */ - if (ioctl(vs, SIOCGIFADDR, (char *)&ifreq) < 0) { -#endif /* STREAMS_TLI */ - syslog(LOG_ERR, "get interface addr: %m"); - continue; - } - - (void)strncpy(inter_list[i].name, ifreq.ifr_name, - sizeof(inter_list[i].name)); - inter_list[i].sin = *(struct sockaddr_in *)&ifreq.ifr_addr; - inter_list[i].sin.sin_family = AF_INET; - inter_list[i].sin.sin_port = port; - -#if defined(SUN_3_3_STINKS) - /* - * Oh, barf! I'm too disgusted to even explain this - */ - if (SRCADR(&inter_list[i].sin) == 0x7f000001) { - inter_list[i].flags |= INT_LOOPBACK; - if (loopback_interface == 0) - loopback_interface = &inter_list[i]; - } -#endif - if (inter_list[i].flags & INT_BROADCAST) { -#ifdef STREAMS_TLI - ioc.ic_cmd = SIOCGIFBRDADDR; - ioc.ic_timout = 0; - ioc.ic_dp = (caddr_t)&ifreq; - ioc.ic_len = sizeof(struct ifreq); - if(ioctl(vs, I_STR, &ioc)) { -#else /* ! STREAMS_TLI */ - if (ioctl(vs, SIOCGIFBRDADDR, (char *)&ifreq) < 0) { -#endif /* STREAMS_TLI */ - syslog(LOG_ERR, "SIOCGIFBRDADDR fails"); - exit(1); - } -#ifndef ifr_broadaddr - inter_list[i].bcast = - *(struct sockaddr_in *)&ifreq.ifr_addr; -#else - inter_list[i].bcast = - *(struct sockaddr_in *)&ifreq.ifr_broadaddr; -#endif - inter_list[i].bcast.sin_family = AF_INET; - inter_list[i].bcast.sin_port = port; - } -#ifdef STREAMS_TLI - ioc.ic_cmd = SIOCGIFNETMASK; - ioc.ic_timout = 0; - ioc.ic_dp = (caddr_t)&ifreq; - ioc.ic_len = sizeof(struct ifreq); - if(ioctl(vs, I_STR, &ioc)) { -#else /* ! STREAMS_TLI */ - if (ioctl(vs, SIOCGIFNETMASK, (char *)&ifreq) < 0) { -#endif /* STREAMS_TLI */ - syslog(LOG_ERR, "SIOCGIFNETMASK fails"); - exit(1); - } - inter_list[i].mask = *(struct sockaddr_in *)&ifreq.ifr_addr; - - /* - * look for an already existing source interface address. If - * the machine has multiple point to point interfaces, then - * the local address may appear more than once. - */ - for (j=0; j < i; j++) - if (inter_list[j].sin.sin_addr.s_addr == - inter_list[i].sin.sin_addr.s_addr) { - break; - } - if (j == i) - i++; - } - close(vs); - ninterfaces = i; - - maxactivefd = 0; - FD_ZERO(&activefds); - - for (i = 0; i < ninterfaces; i++) { - inter_list[i].fd = open_socket(&inter_list[i].sin, - inter_list[i].flags & INT_BROADCAST); - } - -#if defined(MCAST) && !defined(sun) && !defined(SYS_BSDI) && !defined(SYS_DECOSF1) && !defined(SYS_44BSD) - /* - * enable possible multicast reception on the broadcast socket - */ - inter_list[0].bcast.sin_addr.s_addr = htonl(INADDR_ANY); - inter_list[0].bcast.sin_family = AF_INET; - inter_list[0].bcast.sin_port = port; -#endif /* MCAST */ - - /* - * Blacklist all bound interface addresses - */ - resmask.sin_addr.s_addr = ~0L; - for (i = 1; i < ninterfaces; i++) - restrict(RESTRICT_FLAGS, &inter_list[i].sin, &resmask, - RESM_NTPONLY|RESM_INTERFACE, RES_IGNORE); - - any_interface = &inter_list[0]; -#ifdef DEBUG - if (debug > 2) { - printf("create_sockets: ninterfaces=%d\n", ninterfaces); - for (i = 0; i < ninterfaces; i++) { - printf("interface %d: fd=%d, bfd=%d, name=%.8s, flags=0x%x\n", - i, - inter_list[i].fd, - inter_list[i].bfd, - inter_list[i].name, - inter_list[i].flags); - /* Leave these as three printf calls. */ - printf(" sin=%s", - inet_ntoa((inter_list[i].sin.sin_addr))); - if(inter_list[i].flags & INT_BROADCAST) - printf(" bcast=%s,", - inet_ntoa((inter_list[i].bcast.sin_addr))); - printf(" mask=%s\n", - inet_ntoa((inter_list[i].mask.sin_addr))); - } - } -#endif - return ninterfaces; -} - - -/* - * io_setbclient - open the broadcast client sockets - */ -void -io_setbclient() -{ - int i; - - for (i = 1; i < ninterfaces; i++) { - if (!(inter_list[i].flags & INT_BROADCAST)) - continue; - if (inter_list[i].flags & INT_BCASTOPEN) - continue; -#ifdef SOLARIS - inter_list[i].bcast.sin_addr.s_addr = htonl(INADDR_ANY); -#endif -#ifndef SYS_DOMAINOS - inter_list[i].bfd = open_socket(&inter_list[i].bcast, 0); - inter_list[i].flags |= INT_BCASTOPEN; -#endif - } -} - - -/* - * io_multicast_add() - add multicast group address - */ -void -io_multicast_add(addr) - u_long addr; -{ -#ifdef MCAST - struct ip_mreq mreq; - int i = ninterfaces; /* Use the next interface */ - u_long haddr = ntohl(addr); - struct in_addr iaddr; - int s; - struct sockaddr_in *sinp; - - iaddr.s_addr = addr; - - if (!IN_CLASSD(haddr)) - { syslog(LOG_ERR, - "cannot add multicast address %s as it is not class D", - inet_ntoa(iaddr)); - return; - } - - for (i=0; i<ninterfaces; i++) { - /* Already have this address */ - if (inter_list[i].sin.sin_addr.s_addr == addr) return; - /* found a free slot */ - if (inter_list[i].sin.sin_addr.s_addr == 0 && - inter_list[i].fd <= 0 && inter_list[i].bfd <= 0 && - inter_list[i].flags == 0) break; - } - sinp = &(inter_list[i].sin); - - memset((char *)&mreq, 0, sizeof(mreq)); - memset((char *)&inter_list[i], 0, sizeof inter_list[0]); - sinp->sin_family = AF_INET; - sinp->sin_addr = iaddr; - sinp->sin_port = htons(123); - - s = open_socket(sinp, 0); - /* Try opening a socket for the specified class D address */ - /* This works under SunOS 4.x, but not OSF1 .. :-( */ - if (s < 0) { - memset((char *)&inter_list[i], 0, sizeof inter_list[0]); - i = 0; - /* HACK ! -- stuff in an address */ - inter_list[i].bcast.sin_addr.s_addr = addr; - syslog(LOG_ERR, "...multicast address %s using wildcard socket", - inet_ntoa(iaddr)); - } - else { - inter_list[i].fd = s; - inter_list[i].bfd = -1; - (void) strncpy(inter_list[i].name, "multicast", - sizeof(inter_list[i].name)); - inter_list[i].mask.sin_addr.s_addr = htonl(~0); - } - - /* - * enable reception of multicast packets - */ - mreq.imr_multiaddr = iaddr; - mreq.imr_interface.s_addr = htonl(INADDR_ANY); - if (setsockopt(inter_list[i].fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, - (char *)&mreq, sizeof(mreq)) == -1) - syslog(LOG_ERR, - "setsockopt IP_ADD_MEMBERSHIP fails: %m for %x / %x (%s)", - mreq.imr_multiaddr, mreq.imr_interface.s_addr, - inet_ntoa(iaddr)); - inter_list[i].flags |= INT_MULTICAST; - if (i >= ninterfaces) ninterfaces = i+1; -#else /* MCAST */ - struct in_addr iaddr; - iaddr.s_addr = addr; - syslog(LOG_ERR, "cannot add multicast address %s as no MCAST support", - inet_ntoa(iaddr)); -#endif /* MCAST */ -} - -/* - * io_unsetbclient - close the broadcast client sockets - */ -void -io_unsetbclient() -{ - int i; - - for (i = 1; i < ninterfaces; i++) { - if (!(inter_list[i].flags & INT_BCASTOPEN)) - continue; - close_socket(inter_list[i].bfd); - inter_list[i].flags &= ~INT_BCASTOPEN; - } -} - - -/* - * io_multicast_del() - delete multicast group address - */ -void -io_multicast_del(addr) - u_long addr; -{ -#ifdef MCAST - int i; - struct ip_mreq mreq; - struct sockaddr_in sinaddr; - - if (!IN_CLASSD(addr)) { - sinaddr.sin_addr.s_addr = addr; - syslog(LOG_ERR, - "invalid multicast address %s", ntoa(&sinaddr)); - return; - } - - /* - * Disable reception of multicast packets - */ - mreq.imr_multiaddr.s_addr = addr; - mreq.imr_interface.s_addr = htonl(INADDR_ANY); - for (i = 0; i < ninterfaces; i++) { - if (!(inter_list[i].flags & INT_MULTICAST)) - continue; - if (!(inter_list[i].fd < 0)) - continue; - if (addr != inter_list[i].sin.sin_addr.s_addr) - continue; - if (i != 0) { - /* we have an explicit fd, so we can slose it */ - close_socket(inter_list[i].fd); - memset((char *)&inter_list[i], 0, sizeof inter_list[0]); - inter_list[i].fd = -1; - inter_list[i].bfd = -1; - } else { - /* We are sharing "any address" port :-( Don't close it! */ - if (setsockopt(inter_list[i].fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, - (char *)&mreq, sizeof(mreq)) == -1) - syslog(LOG_ERR, "setsockopt IP_DROP_MEMBERSHIP fails: %m"); - /* This is **WRONG** -- there may be others ! */ - /* There should be a count of users ... */ - inter_list[i].flags &= ~INT_MULTICAST; - } - } -#else /* MCAST */ - syslog(LOG_ERR, "this function requires multicast kernel"); -#endif /* MCAST */ -} - - -/* - * open_socket - open a socket, returning the file descriptor - */ -static int -open_socket(addr, flags) - struct sockaddr_in *addr; - int flags; -{ - int fd; - int on = 1, off = 0; - - /* create a datagram (UDP) socket */ - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - syslog(LOG_ERR, "socket(AF_INET, SOCK_DGRAM, 0) failed: %m"); - exit(1); - /*NOTREACHED*/ - } - - /* set SO_REUSEADDR since we will be binding the same port - number on each interface */ - if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, - (char *)&on, sizeof(on))) { - syslog(LOG_ERR, "setsockopt SO_REUSEADDR on fails: %m"); - } - - /* - * bind the local address. - */ - if (bind(fd, (struct sockaddr *)addr, sizeof(*addr)) < 0) { - char buff[160]; - sprintf(buff, - "bind() fd %d, family %d, port %d, addr %08lx, in_classd=%d flags=%d fails: %%m", - fd, addr->sin_family, (int)ntohs(addr->sin_port), - (u_long)ntohl(addr->sin_addr.s_addr), - IN_CLASSD(ntohl(addr->sin_addr.s_addr)), flags); - syslog(LOG_ERR, buff); - close(fd); - - /* - * soft fail if opening a class D address - */ - if (IN_CLASSD(ntohl(addr->sin_addr.s_addr))) - return -1; - exit(1); - } -#ifdef DEBUG - if (debug) - printf("bind() fd %d, family %d, port %d, addr %08lx, flags=%d\n", - fd, - addr->sin_family, - (int)ntohs(addr->sin_port), - (u_long)ntohl(addr->sin_addr.s_addr), - flags); -#endif - if (fd > maxactivefd) - maxactivefd = fd; - FD_SET(fd, &activefds); - -#ifdef HAVE_SIGNALED_IO - init_socket_sig(fd); -#else /* HAVE_SIGNALED_IO */ - - /* - * set non-blocking, - */ -#if defined(O_NONBLOCK) - if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) { - syslog(LOG_ERR, "fcntl(O_NONBLOCK) fails: %m"); - exit(1); - /*NOTREACHED*/ - } -#else /* O_NONBLOCK */ -#if defined(FNDELAY) - if (fcntl(fd, F_SETFL, FNDELAY) < 0) { - syslog(LOG_ERR, "fcntl(FNDELAY) fails: %m"); - exit(1); - /*NOTREACHED*/ - } -#else /* FNDELAY */ -Need non blocking I/O -#endif /* FNDELAY */ -#endif /* O_NONBLOCK */ -#endif /* HAVE_SIGNALED_IO */ - - /* - * Turn off the SO_REUSEADDR socket option. It apparently - * causes heartburn on systems with multicast IP installed. - * On normal systems it only gets looked at when the address - * is being bound anyway.. - */ - if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, - (char *)&off, sizeof(off))) { - syslog(LOG_ERR, "setsockopt SO_REUSEADDR off fails: %m"); - } - -#ifdef SO_BROADCAST - /* if this interface can support broadcast, set SO_BROADCAST */ - if (flags & INT_BROADCAST) { - if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, - (char *)&on, sizeof(on))) { - syslog(LOG_ERR, "setsockopt(SO_BROADCAST): %m"); - } - } -#endif /* SO_BROADCAST */ - -#ifdef DEBUG - if (debug > 1) - printf("flags for fd %d: 0%o\n", fd, - fcntl(fd, F_GETFL, 0)); -#endif - - return fd; -} - - -/* - * closesocket - close a socket and remove from the activefd list - */ -static void -close_socket(fd) - int fd; -{ - int i, newmax; - - (void) close(fd); - FD_CLR(fd, &activefds); - - if (fd >= maxactivefd) { - newmax = 0; - for (i = 0; i < maxactivefd; i++) - if (FD_ISSET(i, &activefds)) - newmax = i; - maxactivefd = newmax; - } -} - - - -/* - * findbcastinter - find broadcast interface corresponding to address - */ -struct interface * -findbcastinter(addr) - struct sockaddr_in *addr; -{ -#ifdef SIOCGIFCONF - register int i; - register u_long netnum; - - netnum = NSRCADR(addr); - for (i = 1; i < ninterfaces; i++) { - if (!(inter_list[i].flags & INT_BROADCAST)) - continue; - if (NSRCADR(&inter_list[i].bcast) == netnum) - return &inter_list[i]; - if ((NSRCADR(&inter_list[i].sin) & NSRCADR(&inter_list[i].mask)) - == (netnum & NSRCADR(&inter_list[i].mask))) - return &inter_list[i]; - } -#endif /* SIOCGIFCONF */ - return any_interface; -} - - -/* XXX ELIMINATE getrecvbufs (almost) identical to ntpdate.c, ntptrace.c, ntp_io.c */ -/* - * getrecvbufs - get receive buffers which have data in them - * - * ***N.B. must be called with SIGIO blocked*** - */ -struct recvbuf * -getrecvbufs() -{ - struct recvbuf *rb; - -#ifdef DEBUG - if (debug > 4) - printf("getrecvbufs: %ld handler interrupts, %ld frames\n", - handler_calls, handler_pkts); -#endif - - if (full_recvbufs == 0) { -#ifdef DEBUG - if (debug > 4) - printf("getrecvbufs called, no action here\n"); -#endif - return (struct recvbuf *)0; /* nothing has arrived */ - } - - /* - * Get the fulllist chain and mark it empty - */ -#ifdef DEBUG - if (debug > 4) - printf("getrecvbufs returning %ld buffers\n", full_recvbufs); -#endif - rb = beginlist; - fulllist = 0; - full_recvbufs = 0; - - /* - * Check to see if we're below the low water mark. - */ - if (free_recvbufs <= RECV_LOWAT) { - register struct recvbuf *buf; - register int i; - - if (total_recvbufs >= RECV_TOOMANY) - syslog(LOG_ERR, "too many recvbufs allocated (%d)", - total_recvbufs); - else { - buf = (struct recvbuf *) - emalloc(RECV_INC*sizeof(struct recvbuf)); - for (i = 0; i < RECV_INC; i++) { - buf->next = freelist; - freelist = buf; - buf++; - } - - free_recvbufs += RECV_INC; - total_recvbufs += RECV_INC; - lowater_additions++; - } - } - - /* - * Return the chain - */ - return rb; -} - - -/* XXX ELIMINATE freerecvbuf (almost) identical to ntpdate.c, ntptrace.c, ntp_io.c */ -/* - * freerecvbuf - make a single recvbuf available for reuse - */ -void -freerecvbuf(rb) - struct recvbuf *rb; -{ - BLOCKIO(); - rb->next = freelist; - freelist = rb; - free_recvbufs++; - UNBLOCKIO(); -} - - -/* XXX ELIMINATE sendpkt similar in ntpq.c, ntpdc.c, ntp_io.c, ntptrace.c */ -/* - * sendpkt - send a packet to the specified destination. Maintain a - * send error cache so that only the first consecutive error for a - * destination is logged. - */ -void -sendpkt(dest, inter, ttl, pkt, len) - struct sockaddr_in *dest; - struct interface *inter; - int ttl; - struct pkt *pkt; - int len; -{ - int cc, slot; - /* - * Send error cache. Empty slots have port == 0 - * Set ERRORCACHESIZE to 0 to disable - */ - struct cache { - u_short port; - struct in_addr addr; - }; - -#ifndef ERRORCACHESIZE -#define ERRORCACHESIZE 8 -#endif -#if ERRORCACHESIZE > 0 - static struct cache badaddrs[ERRORCACHESIZE]; -#else -#define badaddrs ((struct cache *)0) /* Only used in empty loops! */ -#endif - -#ifdef DEBUG - if (debug) - printf("%ssendpkt(fd=%d %s, %s, ttl=%d, %d)\n", - (ttl >= 0) ? "\tMCAST\t*****" : "", - inter->fd, ntoa(dest), - ntoa(&inter->sin), ttl, len); -#endif - -#ifdef MCAST - /* for the moment we use the bcast option to set multicast ttl */ - if (ttl >= 0 && ttl != inter->last_ttl) { - u_char mttl = ttl; - - /* set the multicast ttl for outgoing packets */ - if (setsockopt(inter->fd, IPPROTO_IP, IP_MULTICAST_TTL, - &mttl, sizeof(mttl)) == -1) { - syslog(LOG_ERR, "setsockopt IP_MULTICAST_TTL fails: %m"); - } - else inter->last_ttl = ttl; - } -#endif /* MCAST */ - - for (slot = ERRORCACHESIZE; --slot >= 0; ) - if (badaddrs[slot].port == dest->sin_port && - badaddrs[slot].addr.s_addr == dest->sin_addr.s_addr) - break; - - cc = sendto(inter->fd, (char *)pkt, len, 0, (struct sockaddr *)dest, - sizeof(struct sockaddr_in)); - if (cc == -1) { - inter->notsent++; - packets_notsent++; - if (errno != EWOULDBLOCK && errno != ENOBUFS && slot < 0) { - /* - * Remember this, if there's an empty slot - */ - for (slot = ERRORCACHESIZE; --slot >= 0; ) - if (badaddrs[slot].port == 0) { - badaddrs[slot].port = dest->sin_port; - badaddrs[slot].addr = dest->sin_addr; - break; - } - syslog(LOG_ERR, "sendto(%s): %m", ntoa(dest)); - } - } else { - inter->sent++; - packets_sent++; - /* - * He's not bad any more - */ - if (slot >= 0) - badaddrs[slot].port = 0; - } -} - - -/* - * input_handler - receive packets asynchronously - */ -void -input_handler(cts) - l_fp *cts; -{ - register int i, n; - register struct recvbuf *rb; - register int doing; - register int fd; - struct timeval tvzero; - int fromlen; - l_fp ts; - fd_set fds; - int first = 1; - - handler_calls++; - ts = *cts; - - /* - * Do a poll to see who has data - */ -again: - fds = activefds; - tvzero.tv_sec = tvzero.tv_usec = 0; - n = select(maxactivefd+1, &fds, (fd_set *)0, (fd_set *)0, &tvzero); - - /* - * If nothing to do, just return. If an error occurred, complain - * and return. If we've got some, freeze a timestamp. - */ - if (n == 0) - return; - else if (n == -1) { - syslog(LOG_ERR, "select() error: %m"); - return; - } - if (!first)get_systime(&ts); - first = 0; - handler_pkts += n; - -#ifdef REFCLOCK - /* - * Check out the reference clocks first, if any - */ - if (refio != 0) { - register struct refclockio *rp; - - for (rp = refio; rp != 0 && n > 0; rp = rp->next) { - fd = rp->fd; - if (FD_ISSET(fd, &fds)) { - n--; - if (free_recvbufs == 0) { - char buf[RX_BUFF_SIZE]; - - (void) read(fd, buf, sizeof buf); - packets_dropped++; - continue; - } - - rb = freelist; - freelist = rb->next; - free_recvbufs--; - - i = (rp->datalen == 0 - || rp->datalen > sizeof(rb->recv_space)) - ? sizeof(rb->recv_space) : rp->datalen; - - rb->recv_length = - read(fd, (char *)&rb->recv_space, i); - - if (rb->recv_length == -1) { - syslog(LOG_ERR, "clock read fd %d: %m", fd); - rb->next = freelist; - freelist = rb; - free_recvbufs++; - continue; - } - - /* - * Got one. Mark how and when it got here, - * put it on the full list and do bookkeeping. - */ - rb->recv_srcclock = rp->srcclock; - rb->dstadr = 0; - rb->fd = fd; - rb->recv_time = ts; - rb->receiver = rp->clock_recv; - - if (fulllist == 0) { - beginlist = rb; - rb->next = 0; - } else { - rb->next = fulllist->next; - fulllist->next = rb; - } - fulllist = rb; - full_recvbufs++; - - rp->recvcount++; - packets_received++; - } - } - } -#endif - - /* - * Loop through the interfaces looking for data to read. - */ - for (i = ninterfaces-1; i >= 0 && n > 0; i--) { - for (doing = 0; doing < 2 && n > 0; doing++) { - if (doing == 0) { - fd = inter_list[i].fd; - } else { - if (!(inter_list[i].flags & INT_BCASTOPEN)) - break; - fd = inter_list[i].bfd; - } - if (fd < 0) continue; - if (FD_ISSET(fd, &fds)) { - n--; - - /* - * Get a buffer and read the frame. If we - * haven't got a buffer, or this is received - * on the wild card socket, just dump the - * packet. - */ - if (!(free_recvbufs && i == 0 && - inter_list[i].flags & INT_MULTICAST)) { -#ifdef UDP_WILDCARD_DELIVERY - /* - * these guys manage to put properly addressed - * packets into the wildcard queue - */ - if (free_recvbufs == 0) { -#else - if (i == 0 || free_recvbufs == 0) { -#endif - char buf[RX_BUFF_SIZE]; - struct sockaddr from; - fromlen = sizeof from; - (void) recvfrom(fd, buf, - sizeof(buf), 0, - &from, &fromlen); -#ifdef DEBUG - if (debug) - printf("ignore/drop on %d(%lu) fd=%d from %s\n", - i, free_recvbufs, fd, - inet_ntoa(((struct sockaddr_in *) &from)->sin_addr)); -#endif - if (i == 0) - packets_ignored++; - else - packets_dropped++; - continue; - } - } - - rb = freelist; - freelist = rb->next; - free_recvbufs--; - - fromlen = sizeof(struct sockaddr_in); - rb->recv_length = recvfrom(fd, - (char *)&rb->recv_space, - sizeof(rb->recv_space), 0, - (struct sockaddr *)&rb->recv_srcadr, - &fromlen); - if (rb->recv_length == -1) { - syslog(LOG_ERR, "recvfrom: %m"); - rb->next = freelist; - freelist = rb; - free_recvbufs++; -#ifdef DEBUG - if (debug) - printf("input_handler: fd=%d dropped (bad recvfrom)\n", fd); -#endif - continue; - } -#ifdef DEBUG - if (debug) - printf("input_handler: fd=%d length %d from %08lx %s\n", - fd, rb->recv_length, - (u_long)ntohl(rb->recv_srcadr.sin_addr.s_addr) & - 0x00000000ffffffff, inet_ntoa(rb->recv_srcadr.sin_addr)); -#endif - - /* - * Got one. Mark how and when it got here, - * put it on the full list and do bookkeeping. - */ - rb->dstadr = &inter_list[i]; - rb->fd = fd; - rb->recv_time = ts; - rb->receiver = receive; - - - if (fulllist == 0) { - beginlist = rb; - rb->next = 0; - } else { - rb->next = fulllist->next; - fulllist->next = rb; - } - fulllist = rb; - full_recvbufs++; - - inter_list[i].received++; - packets_received++; - } - } - } - /* - * Done everything from that select. Poll again. - */ - goto again; -} - - -/* - * findinterface - utility used by other modules to find an interface - * given an address. - */ -struct interface * -findinterface(addr) - struct sockaddr_in *addr; -{ - register int i; - register u_long saddr; - - /* - * Just match the address portion. - */ - saddr = addr->sin_addr.s_addr; - for (i = 0; i < ninterfaces; i++) { - if (inter_list[i].sin.sin_addr.s_addr == saddr) - return &inter_list[i]; - } - return (struct interface *)0; -} - - -/* - * io_clr_stats - clear I/O module statistics - */ -void -io_clr_stats() -{ - packets_dropped = 0; - packets_ignored = 0; - packets_received = 0; - packets_sent = 0; - packets_notsent = 0; - - handler_calls = 0; - handler_pkts = 0; - io_timereset = current_time; -} - - -#ifdef REFCLOCK -/* - * This is a hack so that I don't have to fool with these ioctls in the - * pps driver ... we are already non-blocking and turn on SIGIO thru - * another mechanisim - */ -int -io_addclock_simple(rio) - struct refclockio *rio; -{ - BLOCKIO(); - /* - * Stuff the I/O structure in the list and mark the descriptor - * in use. There is a harmless (I hope) race condition here. - */ - rio->next = refio; - refio = rio; - - if (rio->fd > maxactivefd) - maxactivefd = rio->fd; - FD_SET(rio->fd, &activefds); - UNBLOCKIO(); - return 1; -} - -/* - * io_addclock - add a reference clock to the list and arrange that we - * get SIGIO interrupts from it. - */ -int -io_addclock(rio) - struct refclockio *rio; -{ - BLOCKIO(); - /* - * Stuff the I/O structure in the list and mark the descriptor - * in use. There is a harmless (I hope) race condition here. - */ - rio->next = refio; - refio = rio; - -#ifdef HAVE_SIGNALED_IO - if (init_clock_sig(rio)) { - UNBLOCKIO(); - return 0; - } -#endif - - if (rio->fd > maxactivefd) - maxactivefd = rio->fd; - FD_SET(rio->fd, &activefds); - - UNBLOCKIO(); - return 1; -} - -/* - * io_closeclock - close the clock in the I/O structure given - */ -void -io_closeclock(rio) - struct refclockio *rio; -{ - /* - * Remove structure from the list - */ - if (refio == rio) { - refio = rio->next; - } else { - register struct refclockio *rp; - - for (rp = refio; rp != 0; rp = rp->next) - if (rp->next == rio) { - rp->next = rio->next; - break; - } - - if (rp == 0) { - /* - * Internal error. Report it. - */ - syslog(LOG_ERR, - "internal error: refclockio structure not found"); - return; - } - } - - /* - * Close the descriptor. close_socket does the right thing despite - * the misnomer. - */ - close_socket(rio->fd); -} -#endif /* REFCLOCK */ - -/* - * SIGPOLL and SIGIO ROUTINES. - */ -#ifdef HAVE_SIGNALED_IO -/* - * Some systems (MOST) define SIGPOLL==SIGIO others SIGIO==SIGPOLL a few - * have seperate SIGIO and SIGPOLL signals. This code checks for the - * SIGIO==SIGPOLL case at compile time. - * Do not defined USE_SIGPOLL or USE_SIGIO. - * these are interal only to ntp_io.c! - */ -#if defined(USE_SIGPOLL) -#undef USE_SIGPOLL -#endif -#if defined(USE_SIGIO) -#undef USE_SIGIO -#endif - -#if defined(USE_TTY_SIGPOLL)||defined(USE_UDP_SIGPOLL) -#define USE_SIGPOLL -#endif - -#if !defined(USE_TTY_SIGPOLL)||!defined(USE_UDP_SIGPOLL) -#define USE_SIGIO -#endif - -#if defined(USE_SIGIO)&&defined(USE_SIGPOLL) -#if SIGIO==SIGPOLL -#define USE_SIGIO -#undef USE_SIGPOLL -#endif /* SIGIO==SIGPOLL */ -#endif /* USE_SIGIO && USE_SIGIO */ - - -/* - * TTY instialzation routeins. - */ -#ifndef USE_TTY_SIGPOLL -/* - * Spical cases first! - */ -#if defined(SYS_HPUX) -#define CLOCK_DONE -static int -init_clock_sig(rio) - struct refclockio *rio; -{ - int pgrp, on = 1; - - pgrp = getpid(); - if (ioctl(rio->fd, FIOSSAIOOWN, (char *)&pgrp) == -1) { - syslog(LOG_ERR, "ioctl(FIOSSAIOOWN) fails for clock I/O: %m"); - exit(1); - /*NOTREACHED*/ - } - - /* - * set non-blocking, async I/O on the descriptor - */ - if (ioctl(rio->fd, FIOSNBIO, (char *)&on) == -1) { - syslog(LOG_ERR, "ioctl(FIOSNBIO) fails for clock I/O: %m"); - exit(1); - /*NOTREACHED*/ - } - - if (ioctl(rio->fd, FIOSSAIOSTAT, (char *)&on) == -1) { - syslog(LOG_ERR, "ioctl(FIOSSAIOSTAT) fails for clock I/O: %m"); - exit(1); - /*NOTREACHED*/ - } - return 0; -} -#endif /* SYS_HPUX */ -#if defined(SYS_AIX)&&!defined(_BSD) -/* - * SYSV compatibility mode under AIX. - */ -#define CLOCK_DONE -static int -init_clock_sig(rio) - struct refclockio *rio; -{ - int pgrp, on = 1; - - if (ioctl(rio->fd, FIOASYNC, (char *)&on) == -1) { - syslog(LOG_ERR, "ioctl(FIOASYNC) fails for clock I/O: %m"); - return 1; - } - pgrp = -getpid(); - if (ioctl(rio->fd, FIOSETOWN, (char*)&pgrp) == -1) { - syslog(LOG_ERR, "ioctl(FIOSETOWN) fails for clock I/O: %m"); - return 1; - } - - if (fcntl(rio->fd, F_SETFL, FNDELAY|FASYNC) < 0) { - syslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails for clock I/O: %m"); - return 1; - } - return 0; -} -#endif /* AIX && !BSD */ -#ifndef CLOCK_DONE -static int -init_clock_sig(rio) - struct refclockio *rio; -{ - if (fcntl(rio->fd, F_SETOWN, getpid()) == -1) { - syslog(LOG_ERR, "fcntl(F_SETOWN) fails for clock I/O: %m"); - return 1; - } - - if (fcntl(rio->fd, F_SETFL, FNDELAY|FASYNC) < 0) { - syslog(LOG_ERR, - "fcntl(FNDELAY|FASYNC) fails for clock I/O: %m"); - return 1; - } - return 0; -} -#endif /* CLOCK_DONE */ -#else /* !USE_TTY_SIGPOLL */ -int -static init_clock_sig(rio) - struct refclockio *rio; -{ - if (ioctl(rio->fd, I_SETSIG, S_INPUT) < 0) { - syslog(LOG_ERR, - "ioctl(I_SETSIG, S_INPUT) fails for clock I/O: %m"); - return 1; - } - return 0; -} -#endif /* !USE_TTY_SIGPOLL */ - - - -#ifndef USE_UDP_SIGPOLL -/* - * Socket SIGPOLL initialization routines. - * Special cases first! - */ -#if defined(SYS_HPUX) || defined(SYS_LINUX) -#define SOCKET_DONE -static void -init_socket_sig(fd) - int fd; -{ - int pgrp, on = 1; - - /* - * Big difference here for HP-UX ... why can't life be easy ? - */ - if (ioctl(fd, FIOSNBIO, (char *)&on) == -1) { - syslog(LOG_ERR, "ioctl(FIOSNBIO) fails: %m"); - exit(1); - /*NOTREACHED*/ - } - - if (ioctl(fd, FIOASYNC, (char *)&on) == -1) { - syslog(LOG_ERR, "ioctl(FIOASYNC) fails: %m"); - exit(1); - /*NOTREACHED*/ - } - -#if (SYS_HPUX > 7) - pgrp = getpid(); -#else - pgrp = -getpid(); -#endif - if (ioctl(fd, SIOCSPGRP, (char *)&pgrp) == -1) { - syslog(LOG_ERR, "ioctl(SIOCSPGRP) fails: %m"); - exit(1); - /*NOTREACHED*/ - } -} -#endif /* SYS_HPUX */ -#if defined(SYS_AIX)&&!defined(_BSD) -/* - * SYSV compatibility mod under AIX - */ -#define SOCKET_DONE -static void -init_socket_sig(fd) - int fd; -{ - int pgrp, on = 1; - - if (ioctl(fd, FIOASYNC, (char *)&on) == -1) { - syslog(LOG_ERR, "ioctl(FIOASYNC) fails: %m"); - exit(1); - /*NOTREACHED*/ - } - pgrp = -getpid(); - if (ioctl(fd, FIOSETOWN, (char*)&pgrp) == -1) { - syslog(LOG_ERR, "ioctl(FIOSETOWN) fails: %m"); - exit(1); - /*NOTREACHED*/ - } - - if (fcntl(fd, F_SETFL, FNDELAY|FASYNC) < 0) { - syslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m"); - exit(1); - /*NOTREACHED*/ - } -} -#endif /* AIX && !BSD */ -#if defined(UDP_BACKWARDS_SETOWN) -/* - * SunOS 3.5 and Ultirx 2.0 - */ -#define SOCKET_DONE -static void -init_socket_sig(fd) - int fd; -{ - /* - * The way Sun did it as recently as SunOS 3.5. Only - * in the case of sockets, of course, just to confuse - * the issue. Don't they even bother to test the stuff - * they send out? Ibid for Ultrix 2.0 - */ - if (fcntl(fd, F_SETOWN, -getpid()) == -1) - { - syslog(LOG_ERR, "fcntl(F_SETOWN) fails: %m"); - exit(1); - } - /* - * set non-blocking, async I/O on the descriptor - */ - if (fcntl(fd, F_SETFL, FNDELAY|FASYNC) < 0) { - syslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m"); - exit(1); - /*NOTREACHED*/ - } -} -#endif /* UDP_BACKWARDS_SETOWN */ -#ifndef SOCKET_DONE -static void -init_socket_sig(fd) - int fd; -{ - if (fcntl(fd, F_SETOWN, getpid()) == -1) - { - syslog(LOG_ERR, "fcntl(F_SETOWN) fails: %m"); - exit(1); - } - /* - * set non-blocking, async I/O on the descriptor - */ - if (fcntl(fd, F_SETFL, FNDELAY|FASYNC) < 0) { - syslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m"); - exit(1); - /*NOTREACHED*/ - } -} -#endif /* SOCKET_DONE */ -#else /* !USE_UDP_SIGPOLL */ -static void -init_socket_sig(fd) - int fd; -{ - if (ioctl(fd, I_SETSIG, S_INPUT) < 0) { - syslog(LOG_ERR, - "ioctl(I_SETSIG, S_INPUT) fails for socket I/O: %m"); - exit(1); - } -} -#endif /* USE_UDP_SIGPOLL */ - -static RETSIGTYPE -sigio_handler(sig) -int sig; -{ - l_fp ts; - -#ifdef SYS_SVR4 - /* This should not be necessary for a signal previously set with - * sigset(). - */ -# if defined(USE_SIGIO) - (void) sigset(SIGIO, sigio_handler); -# endif -# if defined(USE_SIGPOLL) - (void) sigset(SIGPOLL, sigio_handler); -# endif -#endif /* SYS_SVR4 */ - - get_systime(&ts); - (void)input_handler(&ts); -} - -/* - * Signal support routines. - */ -#ifdef NTP_POSIX_SOURCE -static void -set_signal() -{ - int n; - struct sigaction vec; - - sigemptyset(&vec.sa_mask); - -#ifdef USE_SIGIO - sigaddset(&vec.sa_mask, SIGIO); -#endif -#ifdef USE_SIGPOLL - sigaddset(&vec.sa_mask, SIGPOLL); -#endif - vec.sa_flags = 0; - -#if defined(USE_SIGIO) - vec.sa_handler = sigio_handler; - - while (1) { - n = sigaction(SIGIO, &vec, NULL); - if (n == -1 && errno == EINTR) continue; - break; - } - - if (n == -1) { - perror("sigaction"); - exit(1); - } -#endif -#if defined(USE_SIGPOLL) - vec.sa_handler = sigio_handler; - - while (1) { - n = sigaction(SIGPOLL, &vec, NULL); - if (n == -1 && errno == EINTR) continue; - break; - } - - if (n == -1) { - perror("sigaction"); - exit(1); - } -#endif -} - -void -block_io_and_alarm() -{ - sigset_t set; - - sigemptyset(&set); -#if defined(USE_SIGIO) - sigaddset(&set, SIGIO); -#endif -#if defined(USE_SIGPOLL) - sigaddset(&set, SIGPOLL); -#endif - sigprocmask(SIG_BLOCK, &set, NULL); -} - -static void -block_sigio() -{ - sigset_t set; - - sigemptyset(&set); -#if defined(USE_SIGIO) - sigaddset(&set, SIGIO); -#endif -#if defined(USE_SIGPOLL) - sigaddset(&set, SIGPOLL); -#endif - sigaddset(&set, SIGALRM); - sigprocmask(SIG_BLOCK, &set, NULL); -} - -void -unblock_io_and_alarm() -{ - sigset_t unset; - - sigemptyset(&unset); - -#if defined(USE_SIGIO) - sigaddset(&unset, SIGIO); -#endif -#if defined(USE_SIGPOLL) - sigaddset(&unset, SIGPOLL); -#endif - sigaddset(&unset, SIGALRM); - sigprocmask(SIG_UNBLOCK, &unset, NULL); -} - -static -void -unblock_sigio() -{ - sigset_t unset; - - sigemptyset(&unset); - -#if defined(USE_SIGIO) - sigaddset(&unset, SIGIO); -#endif -#if defined(USE_SIGPOLL) - sigaddset(&unset, SIGPOLL); -#endif - sigprocmask(SIG_UNBLOCK, &unset, NULL); -} - -void -wait_for_signal() -{ - sigset_t old; - - sigprocmask(SIG_UNBLOCK, NULL, &old); - -#if defined(USE_SIGIO) - sigdelset(&old, SIGIO); -#endif -#if defined(USE_SIGPOLL) - sigdelset(&old, SIGPOLL); -#endif - sigdelset(&old, SIGALRM); - - sigsuspend(&old); -} - -#else -/* - * Must be an old bsd system. - * We assume there is no SIGPOLL. - */ - -void -block_io_and_alarm() -{ - int mask; - - mask = sigmask(SIGIO)|sigmask(SIGALRM); - (void)sigblock(mask); -} - -void -block_sigio() -{ - int mask; - - mask = sigmask(SIGIO); - (void)sigblock(mask); -} - -static void -set_signal() -{ - (void) signal_no_reset(SIGIO, sigio_handler); -} - -void -unblock_io_and_alarm() -{ - int mask, omask; - - mask = sigmask(SIGIO)|sigmask(SIGALRM); - omask = sigblock(0); - omask &= ~mask; - (void)sigsetmask(omask); -} - -void -unblock_sigio() -{ - int mask, omask; - - mask = sigmask(SIGIO); - omask = sigblock(0); - omask &= ~mask; - (void)sigsetmask(omask); -} - -void -wait_for_signal() -{ - int mask, omask; - - mask = sigmask(SIGIO)|sigmask(SIGALRM); - omask = sigblock(0); - omask &= ~mask; - sigpause(omask); -} -#endif /* NTP_POSIX_SOURCE */ -#endif /* HAVE_SIGNALED_IO */ - diff --git a/usr.sbin/xntpd/xntpd/ntp_leap.c b/usr.sbin/xntpd/xntpd/ntp_leap.c deleted file mode 100644 index 5e7eca77a9b2..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_leap.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - * ntp_leap - maintain leap bits and take action when a leap occurs - */ -#include <stdio.h> - -#include "ntpd.h" -#include "ntp_stdlib.h" - -/* - * This module is devoted to maintaining the leap bits and taking - * action when a leap second occurs. It probably has bugs since - * a leap second has never occurred to excercise the code. - * - * The code does two things when a leap second occurs. It first - * steps the clock one second in the appropriate direction. It - * then informs the reference clock code, if compiled in, that the - * leap second has occured so that any clocks which need to disable - * themselves can do so. This is done within the first few seconds - * after midnight, UTC. - * - * The code maintains two variables which may be written externally, - * leap_warning and leap_indicator. Leap_warning can be written - * any time in the month preceeding a leap second. 24 hours before - * the leap is to occur, leap_warning's contents are copied to - * leap_indicator. The latter is used by reference clocks to set - * their leap bits. - * - * The module normally maintains a timer which is arranged to expire - * just after 0000Z one day before the leap. On the day a leap might - * occur the interrupt is aimed at 2200Z and every 5 minutes thereafter - * until 1200Z to see if the leap bits appear. - */ - -/* - * The leap indicator and leap warning flags. Set by control messages - */ -u_char leap_indicator; -u_char leap_warning; -u_char leap_mask; /* set on day before a potential leap */ -/* - * Timer. The timer code imports this so it can call us prior to - * calling out any pending transmits. - */ -u_long leap_timer; - -/* - * We don't want to do anything drastic if the leap function is handled - * by the kernel. - */ -extern int pll_control; /* set nonzero if kernel pll in uss */ - -/* - * Internal leap bits. If we see leap bits set during the last - * hour we set these. - */ -u_char leapbits; - -/* - * Constants. - */ -#define OKAYTOSETWARNING (31*24*60*60) -#define DAYBEFORE (24*60*60) -#define TWOHOURSBEFORE (2*60*60) -#define FIVEMINUTES (5*60) -#define ONEMINUTE (60) - -/* - * Imported from the timer module. - */ -extern u_long current_time; - - -/* - * Some statistics counters - */ -u_long leap_processcalls; /* calls to leap_process */ -u_long leap_notclose; /* leap found to be a long time from now */ -u_long leap_monthofleap; /* in the month of a leap */ -u_long leap_dayofleap; /* This is the day of the leap */ -u_long leap_hoursfromleap; /* only 2 hours from leap */ -u_long leap_happened; /* leap process saw the leap */ - -/* - * Imported from the main module - */ -extern int debug; - - -static void setnexttimeout P((u_long)); - -/* - * init_leap - initialize the leap module's data. - */ -void -init_leap() -{ - /* - * Zero the indicators. Schedule an event for just after - * initialization so we can sort things out. - */ - leap_indicator = leap_warning = leap_mask = 0; - leap_timer = 1<<EVENT_TIMEOUT; - leapbits = 0; - - leap_processcalls = leap_notclose = 0; - leap_monthofleap = leap_dayofleap = 0; - leap_hoursfromleap = leap_happened = 0; -} - - -/* - * leap_process - process a leap event expiry and/or a system time step - */ -void -leap_process() -{ - u_long leapnext; - u_long leaplast; - l_fp ts; - u_char bits; - extern u_char sys_leap; - - leap_processcalls++; - get_systime(&ts); - calleapwhen((u_long)ts.l_ui, &leaplast, &leapnext); - - /* - * Figure out what to do based on how long to the next leap. - */ - if (leapnext > OKAYTOSETWARNING) { - if (leaplast < ONEMINUTE) { - /* - * The golden moment! See if there's anything - * to do. - */ - leap_happened++; - bits = 0; - leap_mask = 0; - if (leap_indicator != 0) - bits = leap_indicator; - else if (leapbits != 0) - bits = leapbits; - - if (bits != 0 && !pll_control) { - l_fp tmp; - - /* - * Step the clock 1 second in the proper - * direction. - */ - if (bits == LEAP_DELSECOND) - tmp.l_i = 1; - else - tmp.l_i = -1; - tmp.l_uf = 0; - - step_systime(&tmp); -#ifdef SLEWALWAYS - syslog(LOG_NOTICE, - "leap second occured, slewed time %s 1 second", - tmp.l_i > 0 ? "forward" : "back"); -#else - syslog(LOG_NOTICE, - "leap second occured, stepped time %s 1 second", - tmp.l_i > 0 ? "forward" : "back"); -#endif - } - } else { - leap_notclose++; - } - leap_warning = 0; - } else { - if (leapnext > DAYBEFORE) - leap_monthofleap++; - else if (leapnext > TWOHOURSBEFORE) - leap_dayofleap++; - else - leap_hoursfromleap++; - } - - if (leapnext > DAYBEFORE) { - leap_indicator = 0; - leapbits = 0; - /* - * Berkeley's setitimer call does result in alarm - * signal drift despite rumours to the contrary. - * Schedule an event no more than 24 hours into - * the future to allow the event time to be - * recomputed. - */ - if ((leapnext - DAYBEFORE) >= DAYBEFORE) - setnexttimeout((u_long)DAYBEFORE); - else - setnexttimeout(leapnext - DAYBEFORE); - return; - } - - /* - * Here we're in the day of the leap. Set the leap indicator - * bits from the warning, if necessary. - */ - if (leap_indicator == 0 && leap_warning != 0) - leap_indicator = leap_warning; - leap_mask = LEAP_NOTINSYNC; - if (leapnext > TWOHOURSBEFORE) { - leapbits = 0; - setnexttimeout(leapnext - TWOHOURSBEFORE); - return; - } - - /* - * Here we're in the final 2 hours. If sys_leap is set, set - * leapbits to it. - */ - if (sys_leap == LEAP_ADDSECOND || sys_leap == LEAP_DELSECOND) - leapbits = sys_leap; - setnexttimeout((leapnext > FIVEMINUTES) ? FIVEMINUTES : leapnext); -} - - -/* - * setnexttimeout - set the next leap alarm - */ -static void -setnexttimeout(secs) - u_long secs; -{ - /* - * We try to aim the time out at between 1 and 1+(1<<EVENT_TIMEOUT) - * seconds after the desired time. - */ - leap_timer = (secs + 1 + (1<<EVENT_TIMEOUT) + current_time) - & ~((1<<EVENT_TIMEOUT)-1); -} - - -/* - * leap_setleap - set leap_indicator and/or leap_warning. Return failure - * if we don't want to do it. - */ -int -leap_setleap(indicator, warning) - int indicator; - int warning; -{ - u_long leapnext; - u_long leaplast; - l_fp ts; - int i; - - get_systime(&ts); - calleapwhen((u_long)ts.l_ui, &leaplast, &leapnext); - - i = 0; - if (warning != ~0) - if (leapnext > OKAYTOSETWARNING) - i = 1; - - if (indicator != ~0) - if (leapnext > DAYBEFORE) - i = 1; - - if (i) { - syslog(LOG_ERR, - "attempt to set leap bits at unlikely time of month"); - return 0; - } - - if (warning != ~0) - leap_warning = warning; - - if (indicator != ~0) { - if (indicator == LEAP_NOWARNING) { - leap_warning = LEAP_NOWARNING; - } - leap_indicator = indicator; - } - return 1; -} - -/* - * leap_actual - * - * calculate leap value - pass arg through of no local - * configuration. Otherwise ise local configuration - * (only used to cope with broken time servers and - * broken refclocks) - * - * Mapping of leap_indicator: - * LEAP_NOWARNING - * pass peer value to sys_leap - usual operation - * LEAP_ADD/DEL_SECOND - * pass LEAP_ADD/DEL_SECOND to sys_leap - * LEAP_NOTINSYNC - * pass LEAP_NOWARNING to sys_leap - effectively ignores leap - */ -/* there seems to be a bug in the IRIX 4 compiler which prevents - u_char from beeing used in prototyped functions - AIX also suffers from this. - So give up and define it terms of int. -*/ -int -leap_actual(l) - int l ; -{ - if (leap_indicator != LEAP_NOWARNING) { - if (leap_indicator == LEAP_NOTINSYNC) - return LEAP_NOWARNING; - else - return leap_indicator; - } else { - return l; - } -} - diff --git a/usr.sbin/xntpd/xntpd/ntp_loopfilter.c b/usr.sbin/xntpd/xntpd/ntp_loopfilter.c deleted file mode 100644 index f2866d51ecfc..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_loopfilter.c +++ /dev/null @@ -1,721 +0,0 @@ -/* - * ntp_loopfilter.c - implements the NTP loop filter algorithm - */ -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> -#include <signal.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_unixtime.h" -#include "ntp_stdlib.h" - -#ifdef KERNEL_PLL -#ifdef HAVE_SYS_TIMEX_H -#include <sys/timex.h> -#else -#include "sys/timex.h" -#endif /* not HAVE_SYS_TIMEX_H */ - -#ifndef NTP_SYSCALLS_LIBC -#define ntp_gettime(t) syscall(SYS_ntp_gettime, (t)) -#define ntp_adjtime(t) syscall(SYS_ntp_adjtime, (t)) -#endif /* not NTP_SYSCALLS_LIBC */ -#endif /* KERNEL_PLL */ - -/* - * The loop filter is implemented in slavish adherence to the - * specification (Section 5), except that for consistency we - * mostly carry the quantities in the same units as appendix G. - * - * Note that the long values below are the fractional portion of - * a long fixed-point value. This limits these values to +-0.5 - * seconds. When adjustments are capped inside this range (see - * CLOCK_MAX_{I,F}) both the clock_adjust and the compliance - * registers should be fine. (When the compliance is above 16, it - * will at most accumulate 2 ** CLOCK_MULT times the maximum offset, - * which means it fits in a s_fp.) - * - * The skew compensation is a special case. In version 2, it was - * kept in ms / 4s (i.e., CLOCK_FREQ was 10). In version 3 (Section 5) - * it seems to be 2 ** -16ms / 4s in a s_fp for a maximum of +-125ppm - * (stated maximum 100ppm). Since this seems about to change to a - * larger range, it will be kept in units of 2 ** -20 (CLOCK_DSCALE) - * in an s_fp (mainly because that's nearly the same as parts per - * million). Note that this is ``seconds per second'', whereas a - * clock adjustment is a 32-bit fraction of a second to be applied - * every 2 ** CLOCK_ADJ seconds; to find it, shift the drift right by - * (CLOCK_DSCALE - 16 - CLOCK_ADJ). When updating the drift, on the - * other hand, the CLOCK_FREQ factor from the spec assumes the value to - * be in ``seconds per 4 seconds''; to get our units, CLOCK_ADJ must be - * added to the shift. - * - * Kernel PLL/PPS state machine - * - * The following state machine is used when the kernel PLL modifications - * described in the README.kernel file are present. The initial - * configuration routine loop_config() sets up the initial frequency - * estimate and tests if the kernel modifications are present. If so and - * the PLL mode bit 1 (STA_PLL) of the mode word in the drift file - * (ntp.drift) is set, pll_control is set true and the kernel pll is - * enabled. If the kernel modifications are present and the PLL mode bit - * 2 (STA_PPSFREQ) is set, the kernel PPS frequency discipline is - * enabled. - * - * Each update to a prefer peer sets pps_update true if it survives the - * intersection algorithm and its time is within range. The PPS time - * discipline is enabled (STA_PPSTIME bit set in the status word) when - * pps_update is true and the PPS frequency discipline is enabled. If - * the PPS time discipline is enabled and the kernel reports a PPS - * signal is present, the pps_control variable is set to the current - * time. If the current time is later than pps_control by PPS_MAXAGE - * (120 s), this variable is set to zero. - * - * The pll_enable switch can be set both at configuration time and at - * run time using xntpdc. If true, the kernel modifications are active - * as described above; if false, the kernel is bypassed entirely (except - * for the PPS frequency update, if enabled) and the daemon PLL used - * instead. - */ -#define RSH_DRIFT_TO_FRAC (CLOCK_DSCALE - 16) -#define RSH_DRIFT_TO_ADJ (RSH_DRIFT_TO_FRAC - CLOCK_ADJ) -#define RSH_FRAC_TO_FREQ (CLOCK_FREQ + CLOCK_ADJ - RSH_DRIFT_TO_FRAC) -#define PPS_MAXAGE 120 /* kernel pps signal timeout (s) */ - -/* - * Program variables - */ - l_fp last_offset; /* last clock offset */ - u_long last_time; /* time of last clock update (s) */ - u_fp clock_stability; /* clock stability (ppm) */ - s_fp clock_frequency; /* clock frequency error (ppm) */ - s_fp drift_comp; /* pll frequency (ppm) */ -static long clock_adjust; /* clock adjust (fraction only) */ -static s_fp max_comp; /* max frequency offset (ppm) */ - int tc_counter; /* poll-adjust counter */ - int pll_status; /* status bits for kernel pll */ - int pll_control; /* true if working kernel pll */ - int pll_enable; /* true if pll enabled */ - u_long pps_control; /* last pps sample time */ - int pps_update; /* pps update valid */ - int fdpps = -1; /* pps file descriptor */ - -/* - * Imported from the ntp_proto module - */ -extern s_fp sys_rootdelay; /* root delay */ -extern u_fp sys_rootdispersion; /* root dispersion */ -extern struct peer *sys_peer; /* system peer pointer */ -extern u_char sys_poll; /* log2 of system poll interval */ -extern u_char sys_leap; /* system leap bits */ -extern l_fp sys_refskew; /* accumulated skew since last update */ -extern u_fp sys_maxd; /* max dispersion of survivor list */ - -/* - * Imported from ntp_io.c - */ -extern struct interface *loopback_interface; - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * Imported from timer module - */ -extern u_long current_time; /* like it says, in seconds */ - -/* - * Imported from leap module - */ -extern u_char leapbits; /* sanitized leap bits */ - -#if defined(KERNEL_PLL) -#define MOD_BITS (MOD_OFFSET | MOD_MAXERROR | MOD_ESTERROR | \ - MOD_STATUS | MOD_TIMECONST) -extern int sigvec P((int, struct sigvec *, struct sigvec *)); -#ifndef NTP_SYSCALLS_LIBC -extern int syscall P((int, void *, ...)); -#endif /* no NTP syscalls in libc */ -void pll_trap P((int)); - -static struct sigvec sigsys; /* current sigvec status */ -static struct sigvec newsigsys; /* new sigvec status */ -#endif /* KERNEL_PLL */ - -/* - * init_loopfilter - initialize loop filter data - */ -void -init_loopfilter() -{ - extern u_long tsf_maxslew; - u_long tsf_limit; - - /* - * Limit for drift_comp, minimum of two values. The first is to - * avoid signed overflow, the second to keep within 75% of the - * maximum adjustment possible in adj_systime(). - */ - max_comp = 0x7fff0000; - tsf_limit = ((tsf_maxslew >> 1) + (tsf_maxslew >> 2)); - if ((max_comp >> RSH_DRIFT_TO_ADJ) > tsf_limit) - max_comp = tsf_limit << RSH_DRIFT_TO_ADJ; - - /* - * Reset clockworks - */ - drift_comp = 0; - clock_adjust = 0; - tc_counter = 0; - sys_poll = NTP_MINPOLL; - - L_CLR(&last_offset); - last_time = 0; - clock_frequency = 0; - clock_stability = 0; - pps_update = pps_control = 0; -} - -/* - * local_clock - the NTP logical clock loop filter. Returns 1 if the - * clock was stepped, 0 if it was slewed and -1 if it is hopeless. - */ -int -local_clock(fp_offset, peer) - l_fp *fp_offset; /* best offset estimate */ - struct peer *peer; /* from peer - for messages */ -{ - long offset; - long tmp; - int return_code; - l_fp ftmp; - s_fp stmp; - u_fp smax; - long allan; - long interval; -#if defined(KERNEL_PLL) - struct timex ntv; -#endif /* KERNEL_PLL */ - - /* - * Initialize estimated measurement error and Allan variance - * intercept point. The measurement error is assumed the sum of - * the peer dispersion plus select dispersion, which seems - * reasonable. The Allan variance intercept point is assumed - * at MAXSEC for reference clocks and twice that for peer - * clocks, which seems cowardly. - */ - if (peer->refclktype) - allan = CLOCK_MAXSEC; - else - allan = CLOCK_MAXSEC << 1; - - if (!last_time) - last_time = current_time; - interval = (long)(current_time - last_time); - clock_adjust = 0; - offset = fp_offset->l_f; - smax = peer->dispersion + peer->selectdisp; - return_code = 0; - -#ifdef DEBUG - if (debug > 1) - printf( - "local_clock: offset %s peer %s watch %ld)\n", - lfptoa(fp_offset, 6), ntoa(&peer->srcadr), - interval); -#endif - - /* - * If the clock is way off, don't tempt fate by correcting it. - */ - ftmp = *fp_offset; - if (L_ISNEG(&ftmp)) - L_NEG(&ftmp); - if (ftmp.l_ui >= CLOCK_WAYTOOBIG) { - syslog(LOG_ERR, - "time error %s is way too large (set clock manually)", - lfptoa(fp_offset, 6)); -#ifndef BIGTIMESTEP - return (-1); -#endif /* BIGTIMESTEP */ - - /* - * If the magnitude of the offset is greater than CLOCK.MAX - * (128 ms), reset the time and frequency. We are quite - * aggresive here, since the intrinsic clock oscillator - * frequency error can be quite large, sometimes over +-300 ppm. - * With something this large and a noisy peer, the casual time - * updates wander right through the acceptable range, causing - * this section to trigger. - */ - } else if (ftmp.l_ui > CLOCK_MAX_I || (ftmp.l_ui == CLOCK_MAX_I - && ftmp.l_uf >= CLOCK_MAX_F)) { - tc_counter = 0; - sys_poll = peer->minpoll; - - /* - * Either we are not in synchronization, or we have gone - * CLOCK_MINSTEP (900 s) since the last acceptable - * update. We step the clock and leave the frequency - * alone. Since the clock filter has been reset, the - * dispersions will be high upon recovery and the quick- - * march code below will trigger to keep the clock in - * bounds. - */ - if (sys_leap == LEAP_NOTINSYNC || interval > - CLOCK_MINSTEP) { - step_systime(fp_offset); - syslog(LOG_NOTICE, - - "time reset (%s) %s s", -#ifdef SLEWALWAYS - "slew", -#else - "step", -#endif - lfptoa(fp_offset, 6)); - return_code = 1; - - /* - * The local clock is out of range, but we haven't - * allowed enough time for the peer (usually a radio - * clock) to recover after a leap second. Pretend we wuz - * never here. - */ - } else - return (return_code); - - /* - * This code segment works when the clock-adjustment code is - * implemented in the kernel, which at present is only in the - * (modified) SunOS 4.1, Ultrix 4.3 and OSF/1 kernels. In the - * case of the DECstation 5000/240 and Alpha AXP, additional - * kernel modifications provide a true microsecond clock. We - * know the scaling of the frequency variable (s_fp) is the same - * as the kernel variable (1 << SHIFT_USEC = 16). - */ -#if defined(KERNEL_PLL) - } else if (pll_control && pll_enable) { - l_fp pps_offset; - u_fp pps_dispersion; - - /* - * We initialize the structure for the ntp_adjtime() - * system call. We have to convert everything to - * microseconds first. Afterwards, remember the - * frequency offset for the drift file. - */ - memset((char *)&ntv, 0, sizeof ntv); - ntv.modes = MOD_BITS; - if (offset >= 0) { - TSFTOTVU(offset, ntv.offset); - } else { - TSFTOTVU(-offset, ntv.offset); - ntv.offset = -ntv.offset; - } - TSFTOTVU(sys_rootdispersion + sys_rootdelay / 2, - ntv.maxerror); - TSFTOTVU(sys_rootdispersion, ntv.esterror); - ntv.status = pll_status & (STA_PLL | STA_PPSFREQ); - if (pps_update && pll_status & STA_PPSFREQ) - ntv.status |= STA_PPSTIME; - if (sys_leap & LEAP_ADDSECOND && - sys_leap & LEAP_DELSECOND) - ntv.status |= STA_UNSYNC; - else if (sys_leap & LEAP_ADDSECOND) - ntv.status |= STA_INS; - else if (sys_leap & LEAP_DELSECOND) - ntv.status |= STA_DEL; - ntv.constant = min(peer->ppoll, sys_poll) - NTP_MINPOLL; - (void)ntp_adjtime(&ntv); - drift_comp = ntv.freq; - pll_status = ntv.status; - - /* - * If the kernel pps discipline is working, monitor its - * performance. - */ - if (pll_status & STA_PPSTIME && pll_status & - STA_PPSSIGNAL && ntv.shift) { - if (ntv.offset >= 0) - TVUTOTSF(ntv.offset, offset); - else { - TVUTOTSF(-ntv.offset, offset); - offset = -offset; - } - L_CLR(&pps_offset); - L_ADDF(&pps_offset, offset); - TVUTOTSF(ntv.jitter, tmp); - pps_dispersion = (tmp >> 16) & 0xffff; - if (!pps_control) - syslog(LOG_INFO, - "kernel pps sync enabled"); - pps_control = current_time; - record_peer_stats(&loopback_interface->sin, - ctlsysstatus(), fp_offset, 0, - pps_dispersion); - } -#endif /* KERNEL_PLL */ - - /* - * If the dispersion exceeds 128 ms, we need to quick-march it - * to nominal zero offset and wait for the next update. This is - * necessary when the intrinsic frequency error is large and the - * clock has drifted during the interval the clock filter was - * stabilizing. Note that, if unsynchronized, the dispersion is - * always greater than 128 ms, so we don't need a check for - * that. - */ - } else if (smax > CLOCK_MAX_FP) { - clock_adjust = offset; - - /* - * If the dispersion has increased substantially over the - * previous value, we have a spike which probably should be - * suppressed. A factor of eight has been found reasonable by - * simulation. - */ - } else if (smax > sys_maxd << 3) { - return (0); - - /* - * If the interval between corrections is less than the Allan - * variance intercept point, we use a phase-lock loop to compute - * new values of time and frequency. The bandwidth is controlled - * by the time constant, which is adjusted in response to the - * phase error and dispersion. Note the frequency is not changed - * if the local clock driver is in control. - */ - } else if (interval < allan) { - int time_constant = min(peer->ppoll, sys_poll) - - NTP_MINPOLL; - int ltmp = interval; - - if (offset < 0) - clock_adjust = -(-offset >> time_constant); - else - clock_adjust = offset >> time_constant; - if (interval && !(peer->refclktype == - REFCLK_LOCALCLOCK)) { - tmp = peer->maxpoll; - while (ltmp < (1 << peer->maxpoll)) { - tmp--; - ltmp <<= 1; - } - tmp = (RSH_FRAC_TO_FREQ - tmp) + time_constant + - time_constant; - if (offset < 0) - tmp = -(-offset >> tmp); - else - tmp = offset >> tmp; - drift_comp += tmp; - } - - /* - * If the interval between corrections is greater than the Allan - * variance intercept point, we use a hybrid frequency-lock loop - * to compute new values of phase and frequency. The following - * code is based on ideas suggested by Judah Levine of NIST and - * used in his "lockclock" implementation of ACTS. The magic - * factor of 4 in the left shift is to convert from s_fp to ppm. - */ - } else { - clock_adjust = offset; - stmp = (offset / interval) << 4; - if (stmp < 0) - drift_comp -= -stmp >> CLOCK_G; - else - drift_comp += stmp >> CLOCK_G; - } - - /* - * As a sanity check, we clamp the frequency not to exceed the - * slew rate of the stock Unix adjtime() system call. Finally, - * do a little housekeeping. - */ - if (drift_comp > max_comp) - drift_comp = max_comp; - else if (drift_comp < -max_comp) - drift_comp = -max_comp; - if (interval > (1 << (peer->minpoll - 1))) { - - /* - * Determine when to adjust the poll interval. We do - * this regardless of what source controls the loop, - * since we might flap back and forth between sources. - */ - stmp = LFPTOFP(fp_offset); - if (stmp < 0) - stmp = -stmp; - if (stmp > smax) { - tc_counter -= (int)sys_poll << 1; - if (tc_counter < -CLOCK_LIMIT) { - tc_counter = -CLOCK_LIMIT; - if (sys_poll > peer->minpoll) { - sys_poll--; - tc_counter = 0; - } - } - } else { - tc_counter += (int)sys_poll; - if (tc_counter > CLOCK_LIMIT) { - tc_counter = CLOCK_LIMIT; - if (sys_poll < peer->maxpoll) { - sys_poll++; - tc_counter = 0; - } - } - } - - /* - * Calculate the frequency offset and frequency - * stability. These are useful for performance - * monitoring, but do not affect the loop variables. The - * results are scaled as a s_fp in ppm, because we know - * more than we should. - */ - ftmp = *fp_offset; - L_SUB(&ftmp, &last_offset); - clock_frequency = (LFPTOFP(&ftmp) / interval) << 20; - if (clock_frequency < -max_comp) - clock_frequency = -max_comp; - else if (clock_frequency > max_comp) - clock_frequency = max_comp; - stmp = clock_frequency; - if (stmp < 0) - stmp = -stmp; - stmp -= clock_stability; - if (stmp < 0) - clock_stability -= -stmp >> NTP_MAXD; - else - clock_stability += stmp >> NTP_MAXD; - } - last_offset = *fp_offset; - last_time = current_time; - -#ifdef DEBUG - if (debug > 1) - printf( - "local_clock: phase %s freq %s err %s allan %ld poll %d\n", - mfptoa((clock_adjust < 0 ? -1 : 0), clock_adjust, - 6), fptoa(drift_comp, 3), fptoa(smax, 6), allan, - sys_poll); -#endif /* DEBUG */ - - (void) record_loop_stats(fp_offset, drift_comp, sys_poll); - - /* - * Whew. I've had enough. - */ - return (return_code); -} - - -/* - * adj_host_clock - Called every 1 << CLOCK_ADJ seconds to update host - * clock - */ -void -adj_host_clock() -{ - register long adjustment; - l_fp offset; - - /* - * Update the dispersion since the last update. Don't allow - * frequency measurements over periods longer than NTP_MAXAGE - * (86400 s = one day). - */ - if (current_time - last_time > NTP_MAXAGE) - last_time = 0; - L_ADDUF(&sys_refskew, NTP_SKEWINC); - - /* - * Declare PPS kernel unsync if the pps signal has been heard - * during the last few minutes. - */ - if (pps_control && current_time - pps_control > PPS_MAXAGE) { - if (pps_control) - syslog(LOG_INFO, "kernel pps sync disabled"); - pps_control = 0; - } - - /* - * If the phase-lock loop is not implemented in the kernel, we - * do it the hard way using incremental adjustments and the - * adjtime() system call. - */ - if (pll_control && pll_enable) - return; - adjustment = clock_adjust; - if (adjustment < 0) - adjustment = -(-adjustment >> CLOCK_PHASE); - else - adjustment >>= CLOCK_PHASE; - - clock_adjust -= adjustment; - if (drift_comp < 0) - adjustment -= -drift_comp >> RSH_DRIFT_TO_ADJ; - else - adjustment += drift_comp >> RSH_DRIFT_TO_ADJ; - - /* - * Intricate wrinkle. If the local clock driver is in use and - * selected for synchronization, somebody else may be tinker the - * adjtime() syscall. In this case we have to avoid calling - * adjtime(), since that may truncate the other guy's requests. - * That means the local clock fudge time and frequency - * adjustments don't work in that case. Caveat empty. - */ - if (sys_peer) { - if (sys_peer->refclktype == REFCLK_LOCALCLOCK && - sys_peer->flags & FLAG_PREFER) - return; - } - L_CLR(&offset); - L_ADDF(&offset, adjustment); - adj_systime(&offset); -} - - -/* - * adj_frequency - adjust local clock frequency - */ -void -adj_frequency(freq) - s_fp freq; /* frequency (ppm) */ -{ -#if defined(KERNEL_PLL) - struct timex ntv; -#endif /* KERNEL_PLL */ - - /* - * This routine adjusts the frequency offset. It is used by the - * local clock driver to adjust frequency when no external - * discipline source is available and by the acts driver when - * the interval between updates is greater than 1 << - * NTP_MAXPOLL. Note that the maximum offset is limited by - * max_comp when the daemon pll is used, but the maximum may be - * different when the kernel pll is used. - */ - drift_comp += freq; - if (drift_comp > max_comp) - drift_comp = max_comp; - else if (drift_comp < -max_comp) - drift_comp = -max_comp; -#if defined(KERNEL_PLL) - /* - * If the phase-lock code is implemented in the kernel, set the - * kernel frequency as well, but be sure to set drift_comp to - * the actual frequency. - */ - if (!(pll_control && pll_enable)) - return; - memset((char *)&ntv, 0, sizeof ntv); - ntv.modes = MOD_FREQUENCY; - ntv.freq = freq + drift_comp; - (void)ntp_adjtime(&ntv); - drift_comp = ntv.freq; -#endif /* KERNEL_PLL */ -} - - -/* - * loop_config - configure the loop filter - */ -void -loop_config(item, lfp_value, int_value) - int item; - l_fp *lfp_value; - int int_value; -{ -#if defined(KERNEL_PLL) - struct timex ntv; -#endif /* KERNEL_PLL */ - -#ifdef DEBUG - if (debug) { - printf("loop_config %d %s %x\n", item, - lfptoa(lfp_value, 3), int_value); - } -#endif - switch (item) { - - case LOOP_DRIFTCOMP: - drift_comp = LFPTOFP(lfp_value); - if (drift_comp > max_comp) - drift_comp = max_comp; - if (drift_comp < -max_comp) - drift_comp = -max_comp; - -#if defined(KERNEL_PLL) - /* - * If the phase-lock code is implemented in the kernel, - * give the time_constant and saved frequency offset to - * the kernel. If not, no harm is done. We do this - * whether or not the use of the kernel mods is - * requested, in order to clear out the trash from - * possible prior customers. - */ - memset((char *)&ntv, 0, sizeof ntv); - pll_status = int_value & (STA_PLL | STA_PPSFREQ); - if (pll_status & STA_PLL) - pll_control = 1; - else - pll_control = 0; - ntv.modes = MOD_BITS | MOD_FREQUENCY; - if (pll_status) { - ntv.freq = drift_comp; - ntv.maxerror = NTP_MAXDISPERSE; - ntv.esterror = NTP_MAXDISPERSE; - ntv.status = pll_status | STA_UNSYNC; - ntv.constant = sys_poll - NTP_MINPOLL; - } - newsigsys.sv_handler = pll_trap; - newsigsys.sv_mask = 0; - newsigsys.sv_flags = 0; - if ((sigvec(SIGSYS, &newsigsys, &sigsys))) - syslog(LOG_ERR, - "sigvec() fails to save SIGSYS trap: %m"); - (void)ntp_adjtime(&ntv); - if ((sigvec(SIGSYS, &sigsys, - (struct sigvec *)NULL))) - syslog(LOG_ERR, - "sigvec() fails to restore SIGSYS trap: %m"); - if (pll_control) - syslog(LOG_NOTICE, - "using kernel phase-lock loop %04x", - ntv.status); - else - syslog(LOG_NOTICE, - "using xntpd phase-lock loop"); -#endif /* KERNEL_PLL */ - break; - - default: - /* sigh */ - break; - } -} - - -#if defined(KERNEL_PLL) -/* - * _trap - trap processor for undefined syscalls - * - * This nugget is called by the kernel when the SYS_ntp_adjtime() - * syscall bombs because the silly thing has not been implemented in - * the kernel. In this case the phase-lock loop is emulated by - * the stock adjtime() syscall and a lot of indelicate abuse. - */ -RETSIGTYPE -pll_trap(int sig) -{ - pll_control = 0; -} -#endif /* KERNEL_PLL */ - diff --git a/usr.sbin/xntpd/xntpd/ntp_monitor.c b/usr.sbin/xntpd/xntpd/ntp_monitor.c deleted file mode 100644 index e6a1c4f461b8..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_monitor.c +++ /dev/null @@ -1,349 +0,0 @@ -/* - * ntp_monitor.c - monitor who is using the xntpd server - */ -#include <stdio.h> -#include <sys/types.h> -#include <signal.h> -#include <errno.h> -#include <sys/ioctl.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_if.h" -#include "ntp_stdlib.h" - -/* - * I'm still not sure I like what I've done here. It certainly consumes - * memory like it is going out of style, and also may not be as low - * overhead as I'd imagined. - * - * Anyway, we record statistics based on source address, mode and version - * (for now, anyway. Check the code). The receive procedure calls us with - * the incoming rbufp before it does anything else. - * - * Each entry is doubly linked into two lists, a hash table and a - * most-recently-used list. When a packet arrives it is looked up - * in the hash table. If found, the statistics are updated and the - * entry relinked at the head of the MRU list. If not found, a new - * entry is allocated, initialized and linked into both the hash - * table and at the head of the MRU list. - * - * Memory is usually allocated by grabbing a big chunk of new memory - * and cutting it up into littler pieces. The exception to this when we - * hit the memory limit. Then we free memory by grabbing entries off - * the tail for the MRU list, unlinking from the hash table, and - * reinitializing. - * - * trimmed back memory consumption ... jdg 8/94 - */ - -/* - * Limits on the number of structures allocated. This limit is picked - * with the illicit knowlege that we can only return somewhat less - * than 8K bytes in a mode 7 response packet, and that each structure - * will require about 20 bytes of space in the response. - * - * ... I don't believe the above is true anymore ... jdg - */ -#ifndef MAXMONMEM -#define MAXMONMEM 600 /* we allocate up to 400 structures */ -#endif -#ifndef MONMEMINC -#define MONMEMINC 40 /* allocate them 40 at a time */ -#endif - -/* - * Hashing stuff - */ -#define MON_HASH_SIZE 128 -#define MON_HASH_MASK (MON_HASH_SIZE-1) -#define MON_HASH(addr) ((int)(ntohl((addr)) & MON_HASH_MASK)) - -/* - * Pointers to the hash table, the MRU list and the count table. Memory - * for the hash and count tables is only allocated if monitoring is turned on. - */ -static struct mon_data *mon_hash[MON_HASH_SIZE]; /* array of list ptrs */ - struct mon_data mon_mru_list; - struct mon_data mon_fifo_list; -/* - * List of free structures structures, and counters of free and total - * structures. The free structures are linked with the hash_next field. - */ -static struct mon_data *mon_free; /* the free list or null if none */ - -static int mon_total_mem; /* total number of structures allocated */ -static int mon_mem_increments; /* number of times we've called malloc() */ - -/* - * Initialization state. We may be monitoring, we may not. If - * we aren't, we may not even have allocated any memory yet. - */ - int mon_enabled; -static int mon_have_memory; - -/* - * Imported from the timer module - */ -extern u_long current_time; - -static void mon_getmoremem P((void)); -static void remove_from_hash P((struct mon_data *)); - -/* - * init_mon - initialize monitoring global data - */ -void -init_mon() -{ - /* - * Don't do much of anything here. We don't allocate memory - * until someone explicitly starts us. - */ - mon_enabled = MON_OFF; - mon_have_memory = 0; - - mon_total_mem = 0; - mon_mem_increments = 0; - mon_free = NULL; - memset((char *)&mon_hash[0], 0, sizeof mon_hash); - memset((char *)&mon_mru_list, 0, sizeof mon_mru_list); - memset((char *)&mon_fifo_list, 0, sizeof mon_fifo_list); -} - - -/* - * mon_start - start up the monitoring software - */ -void -mon_start(mode) - int mode; -{ - - if (mon_enabled != MON_OFF) { - mon_enabled |= mode; - return; - } - if (mode == MON_OFF) - return; /* Ooops.. */ - - if (!mon_have_memory) { - mon_total_mem = 0; - mon_mem_increments = 0; - mon_free = NULL; - mon_getmoremem(); - mon_have_memory = 1; - } - - mon_mru_list.mru_next = &mon_mru_list; - mon_mru_list.mru_prev = &mon_mru_list; - - mon_fifo_list.fifo_next = &mon_fifo_list; - mon_fifo_list.fifo_prev = &mon_fifo_list; - - mon_enabled = mode; -} - - -/* - * mon_stop - stop the monitoring software - */ -void -mon_stop(mode) - int mode; -{ - register struct mon_data *md, *md_next; - register int i; - - if (mon_enabled == MON_OFF) - return; - if ((mon_enabled & mode) == 0 || mode == MON_OFF) - return; - - mon_enabled &= ~mode; - if (mon_enabled != MON_OFF) - return; - - /* - * Put everything back on the free list - */ - for (i = 0; i < MON_HASH_SIZE; i++) { - md = mon_hash[i]; /* get next list */ - mon_hash[i] = NULL; /* zero the list head */ - while (md != NULL) { - md_next = md->hash_next; - md->hash_next = mon_free; - mon_free = md; - md = md_next; - } - } - - mon_mru_list.mru_next = &mon_mru_list; - mon_mru_list.mru_prev = &mon_mru_list; - - mon_fifo_list.fifo_next = &mon_fifo_list; - mon_fifo_list.fifo_prev = &mon_fifo_list; -} - - -/* - * monitor - record stats about this packet - */ -void -monitor(rbufp) - struct recvbuf *rbufp; -{ - register struct pkt *pkt; - register struct mon_data *md; - register u_long netnum; - register int hash; - register int mode; - - if (mon_enabled == MON_OFF) - return; - - pkt = &rbufp->recv_pkt; - netnum = NSRCADR(&rbufp->recv_srcadr); - hash = MON_HASH(netnum); - mode = PKT_MODE(pkt->li_vn_mode); - - md = mon_hash[hash]; - while (md != NULL) { - if (md->rmtadr == netnum && - /* ?? md->interface == rbufp->dstadr && ?? */ - md->mode == (u_char)mode) { - md->lasttime = current_time; - md->count++; - md->version = PKT_VERSION(pkt->li_vn_mode); - md->rmtport = NSRCPORT(&rbufp->recv_srcadr); - - /* - * Shuffle him to the head of the - * mru list. What a crock. - */ - md->mru_next->mru_prev = md->mru_prev; - md->mru_prev->mru_next = md->mru_next; - md->mru_next = mon_mru_list.mru_next; - md->mru_prev = &mon_mru_list; - mon_mru_list.mru_next->mru_prev = md; - mon_mru_list.mru_next = md; - - return; - } - md = md->hash_next; - } - - /* - * If we got here, this is the first we've heard of this - * guy. Get him some memory, either from the free list - * or from the tail of the MRU list. - */ - if (mon_free == NULL && mon_total_mem >= MAXMONMEM) { - /* - * Get it from MRU list - */ - md = mon_mru_list.mru_prev; - md->mru_prev->mru_next = &mon_mru_list; - mon_mru_list.mru_prev = md->mru_prev; - - remove_from_hash(md); - - /* - * Get it from FIFO list - */ - md->fifo_prev->fifo_next = md->fifo_next; - md->fifo_next->fifo_prev = md->fifo_prev; - - } else { - if (mon_free == NULL) /* if free list empty */ - mon_getmoremem(); /* then get more */ - md = mon_free; - mon_free = md->hash_next; - } - - /* - * Got one, initialize it - */ - md->lasttime = md->firsttime = current_time; - md->lastdrop = 0; - md->count = 1; - md->rmtadr = netnum; - md->rmtport = NSRCPORT(&rbufp->recv_srcadr); - md->mode = (u_char) mode; - md->version = PKT_VERSION(pkt->li_vn_mode); - md->interface = rbufp->dstadr; - md->cast_flags = ((rbufp->dstadr->flags & INT_MULTICAST) && - rbufp->fd == md->interface->fd) ? MDF_MCAST: rbufp->fd == - md->interface->bfd ? MDF_BCAST : MDF_UCAST; - - /* - * Drop him into front of the hash table. - * Also put him on top of the MRU list - * and at bottom of FIFO list - */ - - md->hash_next = mon_hash[hash]; - mon_hash[hash] = md; - - md->mru_next = mon_mru_list.mru_next; - md->mru_prev = &mon_mru_list; - mon_mru_list.mru_next->mru_prev = md; - mon_mru_list.mru_next = md; - - md->fifo_prev = mon_fifo_list.fifo_prev; - md->fifo_next = &mon_fifo_list; - mon_fifo_list.fifo_prev->fifo_next = md; - mon_fifo_list.fifo_prev = md; -} - - -/* - * mon_getmoremem - get more memory and put it on the free list - */ -static void -mon_getmoremem() -{ - register struct mon_data *md; - register int i; - struct mon_data *freedata; /* 'old' free list (null) */ - - md = (struct mon_data *)emalloc(MONMEMINC * sizeof(struct mon_data)); - freedata = mon_free; - mon_free = md; - - for (i = 0; i < (MONMEMINC-1); i++) { - md->hash_next = (md + 1); - md++; - } - - /* - * md now points at the last. Link in the rest of the chain. - */ - md->hash_next = freedata; - - mon_total_mem += MONMEMINC; - mon_mem_increments++; -} - -static void -remove_from_hash(md) -struct mon_data *md; -{ register int hash; - register struct mon_data *md_prev; - - hash = MON_HASH(md->rmtadr); - if (mon_hash[hash] == md) { - mon_hash[hash] = md->hash_next; - } else { - md_prev = mon_hash[hash]; - while (md_prev->hash_next != md) { - md_prev = md_prev->hash_next; - if (md_prev == NULL) { - /* logic error */ - return; - } - } - md_prev->hash_next = md->hash_next; - } -} diff --git a/usr.sbin/xntpd/xntpd/ntp_peer.c b/usr.sbin/xntpd/xntpd/ntp_peer.c deleted file mode 100644 index f77773494f29..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_peer.c +++ /dev/null @@ -1,667 +0,0 @@ -/* - * ntp_peer.c - management of data maintained for peer associations - */ -#include <stdio.h> -#include <sys/types.h> - -#include "ntpd.h" -#include "ntp_stdlib.h" - -/* - * These routines manage the allocation of memory to peer structures - * and the maintenance of the peer hash table. The two main entry - * points are findpeer(), which looks for corresponding peer data - * in the peer list, newpeer(), which allocates a new peer structure - * and adds it to the list, and unpeer(), which demobilizes the association - * and deallocates the structure. - */ - -/* - * The peer hash table (imported by the protocol module). - */ -struct peer *peer_hash[HASH_SIZE]; -int peer_hash_count[HASH_SIZE]; /* count of peers in each bucket */ - -/* - * The association ID hash table. Used for lookups by association ID - */ -struct peer *assoc_hash[HASH_SIZE]; -int assoc_hash_count[HASH_SIZE]; - -/* - * The free list. Clean structures only, please. - */ -struct peer *peer_free; -int peer_free_count; - -/* - * Association ID. We initialize this value randomly, the assign a new - * value every time the peer structure is incremented. - */ -u_short current_association_ID; - -/* - * Memory allocation watermarks. - */ -#define INIT_PEER_ALLOC 15 /* initialize space for 15 peers */ -#define INC_PEER_ALLOC 5 /* when we run out, add 5 more */ - -/* - * Miscellaneous statistic counters which may be queried. - */ -u_long peer_timereset; /* time stat counters were zeroed */ -u_long findpeer_calls; /* number of calls to findpeer */ -u_long assocpeer_calls; /* number of calls to findpeerbyassoc */ -u_long peer_allocations; /* number of allocations from the free list */ -u_long peer_demobilizations; /* number of structs freed to free list */ -int total_peer_structs; /* number of peer structs in circulation */ - -/* - * default interface. Imported from the io module. - */ -extern struct interface *any_interface; - -/* - * Timer queue and current time. Imported from the timer module. - */ -extern u_long current_time; -extern struct event timerqueue[]; - -/* - * Our initial allocation of peer space - */ -static struct peer init_peer_alloc[INIT_PEER_ALLOC]; - -/* - * Initialization data. When configuring peers at initialization time, - * we try to get their poll update timers initialized to different values - * to prevent us from sending big clumps of data all at once. - */ -u_long init_peer_starttime; -extern int initializing; -extern int debug; - -static void getmorepeermem P((void)); - -/* - * init_peer - initialize peer data structures and counters - * - * N.B. We use the random number routine in here. It had better be - * initialized prior to getting here. - */ -void -init_peer() -{ - register int i; - - /* - * Clear hash table and counters. - */ - for (i = 0; i < HASH_SIZE; i++) { - peer_hash[i] = 0; - peer_hash_count[i] = 0; - assoc_hash[i] = 0; - assoc_hash_count[i] = 0; - } - - /* - * Clear stat counters - */ - findpeer_calls = peer_allocations = 0; - assocpeer_calls = peer_demobilizations = 0; - - /* - * Initialization counter. - */ - init_peer_starttime = 0; - - /* - * Initialize peer memory. - */ - peer_free = 0; - for (i = 0; i < INIT_PEER_ALLOC; i++) { - init_peer_alloc[i].next = peer_free; - peer_free = &init_peer_alloc[i]; - } - total_peer_structs = INIT_PEER_ALLOC; - peer_free_count = INIT_PEER_ALLOC; - - /* - * Initialize our first association ID - */ - current_association_ID = (u_short)ranp2(16); - if (current_association_ID == 0) - current_association_ID = 1; -} - - - -/* - * getmorepeermem - add more peer structures to the free list - */ -static void -getmorepeermem() -{ - register int i; - register struct peer *peer; - - peer = (struct peer *)emalloc(INC_PEER_ALLOC*sizeof(struct peer)); - for (i = 0; i < INC_PEER_ALLOC; i++) { - peer->next = peer_free; - peer_free = peer; - peer++; - } - - total_peer_structs += INC_PEER_ALLOC; - peer_free_count += INC_PEER_ALLOC; -} - - - -/* - * findexistingpeer - return a pointer to a peer in the hash table - */ -struct peer * -findexistingpeer(addr, start_peer) - struct sockaddr_in *addr; - struct peer *start_peer; -{ - register struct peer *peer; - - /* - * start_peer is included so we can locate instances of the - * same peer through different interfaces in the hash table. - */ - if (start_peer == 0) - peer = peer_hash[HASH_ADDR(addr)]; - else - peer = start_peer->next; - - while (peer != 0) { - if (NSRCADR(addr) == NSRCADR(&peer->srcadr) - && NSRCPORT(addr) == NSRCPORT(&peer->srcadr)) - return peer; - peer = peer->next; - } - - return (struct peer *)0; -} - - -/* - * findpeer - find and return a peer in the hash table. - */ -struct peer * -findpeer(srcadr, dstadr, fd) - struct sockaddr_in *srcadr; - struct interface *dstadr; - int fd; -{ - register struct peer *any_inter_peer; - register struct peer *peer; - register struct peer *best = (struct peer *) 0; - int hash; - - findpeer_calls++; - - any_inter_peer = 0; - hash = HASH_ADDR(srcadr); - for (peer = peer_hash[hash]; peer != 0; peer = peer->next) { - if (NSRCADR(srcadr) == NSRCADR(&peer->srcadr) - && NSRCPORT(srcadr) == NSRCPORT(&peer->srcadr)) { - if (peer->dstadr == dstadr) { - int rfd = (peer->cast_flags & MDF_BCAST) ? - dstadr->bfd : dstadr->fd; - - if (rfd == fd) - return peer; /* got it! */ - best = peer; - } - if (peer->dstadr == any_interface) { - - /* - * We shouldn't have more than one - * instance of the peer in the table, - * but I don't trust this. Save this - * one for later and continue search. - */ - if (any_inter_peer == 0) - any_inter_peer = peer; - else - syslog(LOG_ERR, - "two instances of default interface for %s in hash table", - ntoa(srcadr)); - } - - /* - * Multicast hacks to determine peer when a - * packet arrives and there exists an assoc. - * with src in client/server mode - */ - if (((dstadr == any_interface) || (peer->cast_flags & - MDF_MCAST)) && peer->flags & FLAG_MCAST2) - return peer; - } - } - - if(best) { - return best; - } - - /* - * If we didn't find the specific peer but found a wild card, - * modify the interface and return him. - */ - if (any_inter_peer != 0) { - any_inter_peer->dstadr = dstadr; - return any_inter_peer; - } - - /* - * Out of luck. Return 0. - */ - return (struct peer *)0; -} - -/* - * findpeerbyassocid - find and return a peer using his association ID - */ -struct peer * -findpeerbyassoc(assoc) - int assoc; -{ - register struct peer *peer; - int hash; - - assocpeer_calls++; - - hash = assoc & HASH_MASK; - for (peer = assoc_hash[hash]; peer != 0; peer = peer->ass_next) { - if ((u_short)assoc == peer->associd) - return peer; /* got it! */ - } - - /* - * Out of luck. Return 0. - */ - return (struct peer *)0; -} - -/* - * unpeer - remove peer structure from hash table and free structure - */ -void -unpeer(peer_to_remove) - struct peer *peer_to_remove; -{ - int hash; - - hash = HASH_ADDR(&peer_to_remove->srcadr); - peer_hash_count[hash]--; - peer_demobilizations++; - -#ifdef REFCLOCK - /* - * If this peer is actually a clock, shut it down first - */ - if (peer_to_remove->flags & FLAG_REFCLOCK) - refclock_unpeer(peer_to_remove); -#endif - - if (peer_hash[hash] == peer_to_remove) - peer_hash[hash] = peer_to_remove->next; - else { - register struct peer *peer; - - peer = peer_hash[hash]; - while (peer != 0 && peer->next != peer_to_remove) - peer = peer->next; - - if (peer == 0) { - peer_hash_count[hash]++; - syslog(LOG_ERR, "peer struct for %s not in table!", - ntoa(&peer->srcadr)); - } else { - peer->next = peer_to_remove->next; - } - } - - /* - * Remove him from the association hash as well. - */ - hash = peer_to_remove->associd & HASH_MASK; - assoc_hash_count[hash]--; - if (assoc_hash[hash] == peer_to_remove) - assoc_hash[hash] = peer_to_remove->ass_next; - else { - register struct peer *peer; - - peer = assoc_hash[hash]; - while (peer != 0 && peer->ass_next != peer_to_remove) - peer = peer->ass_next; - - if (peer == 0) { - assoc_hash_count[hash]++; - syslog(LOG_ERR, - "peer struct for %s not in association table!", - ntoa(&peer->srcadr)); - } else { - peer->ass_next = peer_to_remove->ass_next; - } - } - - TIMER_DEQUEUE(&peer_to_remove->event_timer); - - peer_to_remove->next = peer_free; - peer_free = peer_to_remove; - peer_free_count++; -} - - -/* - * peer_config - configure a new peer - */ -struct peer * -peer_config(srcadr, dstadr, hmode, version, minpoll, maxpoll, flags, ttl, key) - struct sockaddr_in *srcadr; - struct interface *dstadr; - int hmode; - int version; - int minpoll; - int maxpoll; - int flags; - int ttl; - u_long key; -{ - register struct peer *peer; - -#ifdef DEBUG - if (debug) - printf("peer_config: addr %s mode %d version %d minpoll %d maxpoll %d flags %d ttl %d key %lu\n", - ntoa(srcadr), hmode, version, minpoll, maxpoll, flags, - ttl, key); -#endif - /* - * See if we have this guy in the tables already. If - * so just mark him configured. - */ - peer = findexistingpeer(srcadr, (struct peer *)0); - if (dstadr != 0) { - while (peer != 0) { - if (peer->dstadr == dstadr) - break; - peer = findexistingpeer(srcadr, peer); - } - } - - /* - * Torque the flags to make sure they're valid - */ - flags &= (FLAG_AUTHENABLE|FLAG_PREFER); - - /* - * If we found one, just change his mode and mark him configured. - */ - if (peer != 0) { - peer->hmode = (u_char)hmode; - peer->version = (u_char)version; - peer->minpoll = (u_char)minpoll; - peer->maxpoll = (u_char)maxpoll; - peer->hpoll = peer->minpoll; - peer->ppoll = peer->minpoll; - peer->flags = ((u_char)(flags | FLAG_CONFIG)) | - (peer->flags & FLAG_REFCLOCK); - peer->cast_flags = (hmode == MODE_BROADCAST) ? - IN_CLASSD(ntohl(srcadr->sin_addr.s_addr)) ? MDF_MCAST : MDF_BCAST : MDF_UCAST; - peer->ttl = (u_char)ttl; - peer->keyid = key; - return peer; - } - - /* - * If we're here this guy is unknown to us. Make a new peer - * structure for him. - */ - peer = newpeer(srcadr, dstadr, hmode, version, minpoll, maxpoll, - ttl, key); - if (peer != 0) - peer->flags |= (u_char)(flags|FLAG_CONFIG); - return peer; -} - - -/* - * newpeer - initialize a new peer association - */ -struct peer * -newpeer(srcadr, dstadr, hmode, version, minpoll, maxpoll, ttl, key) - struct sockaddr_in *srcadr; - struct interface *dstadr; - int hmode; - int version; - int minpoll; - int maxpoll; - int ttl; - u_long key; -{ - register struct peer *peer; - register int i; - - /* - * Some dirt here. Some of the initialization requires - * knowlege of our system state. - */ - extern s_fp sys_bdelay; - extern long sys_clock; - - if (peer_free_count == 0) - getmorepeermem(); - - peer = peer_free; - peer_free = peer->next; - peer_free_count--; - - /* - * Initialize the structure. This stuff is sort of part of - * the receive procedure and part of the clear procedure rolled - * into one. - * - * Zero the whole thing for now. We might be pickier later. - */ - memset((char *)peer, 0, sizeof(struct peer)); - - peer->srcadr = *srcadr; - if (dstadr != 0) - peer->dstadr = dstadr; - else if (hmode == MODE_BROADCAST) - peer->dstadr = findbcastinter(srcadr); - else - peer->dstadr = any_interface; - peer->cast_flags = (hmode == MODE_BROADCAST) ? - (IN_CLASSD(ntohl(srcadr->sin_addr.s_addr))) ? MDF_MCAST : MDF_BCAST : - (hmode == MODE_BCLIENT || hmode == MODE_MCLIENT) ? - (peer->dstadr->flags & INT_MULTICAST) ? MDF_MCAST : MDF_BCAST : - MDF_UCAST; - peer->hmode = (u_char)hmode; - peer->version = (u_char)version; - peer->minpoll = (u_char)minpoll; - peer->maxpoll = (u_char)maxpoll; - peer->hpoll = peer->minpoll; - peer->ppoll = peer->minpoll; - peer->ttl = ttl; - peer->keyid = key; - peer->estbdelay = sys_bdelay; - peer->leap = LEAP_NOTINSYNC; - peer->precision = DEFPRECISION; - peer->dispersion = NTP_MAXDISPERSE; - peer->stratum = STRATUM_UNSPEC; - peer->update = sys_clock; - - for (i = 0; i < NTP_SHIFT; i++) { - peer->filter_order[i] = i; - peer->filter_error[i] = NTP_MAXDISPERSE; - } - - /* - * Assign him an association ID and increment the system variable - */ - peer->associd = current_association_ID; - if (++current_association_ID == 0) - ++current_association_ID; - - /* - * Note time on statistics timers. - */ - peer->timereset = current_time; - peer->timereachable = current_time; - peer->timereceived = current_time; - -#ifdef REFCLOCK - if (ISREFCLOCKADR(&peer->srcadr)) { - /* - * We let the reference clock support do clock - * dependent initialization. This includes setting - * the peer timer, since the clock may have requirements - * for this. - */ - if (!refclock_newpeer(peer)) { - /* - * Dump it, something screwed up - */ - peer->next = peer_free; - peer_free = peer; - peer_free_count++; - return 0; - } - } else { -#endif - /* - * Set up timer. If initializing, just make sure we start polling - * in different 4 second intervals. - */ - peer->event_timer.peer = peer; - peer->event_timer.event_handler = transmit; - - if (initializing) { - init_peer_starttime += (1 << EVENT_TIMEOUT); - if (init_peer_starttime >= (1 << peer->minpoll)) - init_peer_starttime = (1 << EVENT_TIMEOUT); - peer->event_timer.event_time = init_peer_starttime; - } else { - /* - * First expiry is set to eight seconds from now. - */ - peer->event_timer.event_time - = (1 << (peer->minpoll - 1)) + current_time; - } - TIMER_ENQUEUE(timerqueue, &peer->event_timer); -#ifdef REFCLOCK - } -#endif - - /* - * Put him in the hash tables. - */ - i = HASH_ADDR(&peer->srcadr); - peer->next = peer_hash[i]; - peer_hash[i] = peer; - peer_hash_count[i]++; - - i = peer->associd & HASH_MASK; - peer->ass_next = assoc_hash[i]; - assoc_hash[i] = peer; - assoc_hash_count[i]++; - - return peer; -} - - -/* - * peer_unconfig - remove the configuration bit from a peer - */ -int -peer_unconfig(srcadr, dstadr) - struct sockaddr_in *srcadr; - struct interface *dstadr; -{ - register struct peer *peer; - int num_found; - - num_found = 0; - peer = findexistingpeer(srcadr, (struct peer *)0); - while (peer != 0) { - if (peer->flags & FLAG_CONFIG - && (dstadr == 0 || peer->dstadr == dstadr)) { - num_found++; - /* - * Tricky stuff here. If the peer is polling us - * in active mode, turn off the configuration bit - * and make the mode passive. This allows us to - * avoid dumping a lot of history for peers we - * might choose to keep track of in passive mode. - * The protocol will eventually terminate undesirables - * on its own. - */ - if (peer->hmode == MODE_ACTIVE - && peer->pmode == MODE_ACTIVE) { - peer->hmode = MODE_PASSIVE; - peer->flags &= ~FLAG_CONFIG; - } else { - unpeer(peer); - peer = 0; - } - } - peer = findexistingpeer(srcadr, peer); - } - return num_found; -} - - -/* - * peer_clr_stats - clear peer module stat counters - */ -void -peer_clr_stats() -{ - findpeer_calls = 0; - assocpeer_calls = 0; - peer_allocations = 0; - peer_demobilizations = 0; - peer_timereset = current_time; -} - -/* - * peer_reset - reset stat counters in a peer structure - */ -void -peer_reset(peer) - struct peer *peer; -{ - if (peer == 0) - return; - peer->sent = 0; - peer->received = 0; - peer->processed = 0; - peer->badauth = 0; - peer->bogusorg = 0; - peer->oldpkt = 0; - peer->seldisptoolarge = 0; - peer->selbroken = 0; - peer->seltooold = 0; - peer->timereset = current_time; -} - - -/* - * peer_all_reset - reset all peer stat counters - */ -void -peer_all_reset() -{ - struct peer *peer; - int hash; - - for (hash = 0; hash < HASH_SIZE; hash++) - for (peer = peer_hash[hash]; peer != 0; peer = peer->next) - peer_reset(peer); -} diff --git a/usr.sbin/xntpd/xntpd/ntp_proto.c b/usr.sbin/xntpd/xntpd/ntp_proto.c deleted file mode 100644 index fb812060541e..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_proto.c +++ /dev/null @@ -1,2268 +0,0 @@ -/* - * ntp_proto.c - NTP version 3 protocol machinery - */ -#include <stdio.h> -#include <sys/types.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_stdlib.h" -#include "ntp_unixtime.h" - -/* - * System variables are declared here. See Section 3.2 of the - * specification. - */ -u_char sys_leap; /* system leap indicator */ -u_char sys_stratum; /* stratum of system */ -s_char sys_precision; /* local clock precision */ -s_fp sys_rootdelay; /* distance to current sync source */ -u_fp sys_rootdispersion; /* dispersion of system clock */ -u_long sys_refid; /* reference source for local clock */ -l_fp sys_offset; /* combined offset from clock_select */ -u_fp sys_maxd; /* dispersion of selected peer */ -l_fp sys_reftime; /* time we were last updated */ -l_fp sys_refskew; /* accumulated skew since last update */ -struct peer *sys_peer; /* our current peer */ -u_char sys_poll; /* log2 of system poll interval */ -extern long sys_clock; /* second part of current time */ -long sys_lastselect; /* sys_clock at last synch update */ - -/* - * Nonspecified system state variables. - */ -int sys_bclient; /* we set our time to broadcasts */ -s_fp sys_bdelay; /* broadcast client default delay */ -int sys_authenticate; /* authenticate time used for syncing */ -u_char consensus_leap; /* mitigated leap bits */ -u_long sys_authdelay; /* encryption time (l_fp fraction) */ -u_char leap_consensus; /* consensus of survivor leap bits */ - -/* - * Statistics counters - */ -u_long sys_stattime; /* time when we started recording */ -u_long sys_badstratum; /* packets with invalid stratum */ -u_long sys_oldversionpkt; /* old version packets received */ -u_long sys_newversionpkt; /* new version packets received */ -u_long sys_unknownversion; /* don't know version packets */ -u_long sys_badlength; /* packets with bad length */ -u_long sys_processed; /* packets processed */ -u_long sys_badauth; /* packets dropped because of auth */ -u_long sys_limitrejected; /* pkts rejected due toclient count per net */ - -/* - * Imported from ntp_timer.c - */ -extern u_long current_time; -extern struct event timerqueue[]; - -/* - * Imported from ntp_io.c - */ -extern struct interface *any_interface; - -/* - * Imported from ntp_loopfilter.c - */ -extern int pll_enable; -extern int pps_update; - -/* - * Imported from ntp_util.c - */ -extern int stats_control; - -/* - * The peer hash table. Imported from ntp_peer.c - */ -extern struct peer *peer_hash[]; -extern int peer_hash_count[]; - -/* - * debug flag - */ -extern int debug; - -static void clear_all P((void)); - -/* - * transmit - Transmit Procedure. See Section 3.4.1 of the - * specification. - */ -void -transmit(peer) - register struct peer *peer; -{ - struct pkt xpkt; /* packet to send */ - u_long peer_timer; - u_fp precision; - int bool; - - /* - * We need to be very careful about honking uncivilized time. If - * not operating in broadcast mode, honk in all except broadcast - * client mode. If operating in broadcast mode and synchronized - * to a real source, honk except when the peer is the local- - * clock driver and the prefer flag is not set. In other words, - * in broadcast mode we never honk unless known to be - * synchronized to real time. - */ - bool = 0; - if (peer->hmode != MODE_BROADCAST) { - if (peer->hmode != MODE_BCLIENT) - bool = 1; - } else if (sys_peer != 0 && sys_leap != LEAP_NOTINSYNC) { - if (!(sys_peer->refclktype == REFCLK_LOCALCLOCK && - !(sys_peer->flags & FLAG_PREFER))) - bool = 1; - } - if (bool) { - u_long xkeyid; - int find_rtt = (peer->cast_flags & MDF_MCAST) && - peer->hmode != MODE_BROADCAST; - - /* - * Figure out which keyid to include in the packet - */ - if ((peer->flags & FLAG_AUTHENABLE) - && (peer->flags & (FLAG_CONFIG|FLAG_AUTHENTIC)) - && authhavekey(peer->keyid)) { - xkeyid = peer->keyid; - } else { - xkeyid = 0; - } - - /* - * Make up a packet to send. - */ - xpkt.li_vn_mode = PKT_LI_VN_MODE(sys_leap, - peer->version, peer->hmode); - xpkt.stratum = STRATUM_TO_PKT(sys_stratum); - xpkt.ppoll = peer->hpoll; - xpkt.precision = sys_precision; - xpkt.rootdelay = HTONS_FP(sys_rootdelay); - precision = FP_SECOND >> -(int)sys_precision; - if (precision == 0) - precision = 1; - xpkt.rootdispersion = HTONS_FP(sys_rootdispersion + - precision + LFPTOFP(&sys_refskew)); - xpkt.refid = sys_refid; - HTONL_FP(&sys_reftime, &xpkt.reftime); - HTONL_FP(&peer->org, &xpkt.org); - HTONL_FP(&peer->rec, &xpkt.rec); - - /* - * Decide whether to authenticate or not. If so, call - * encrypt() to fill in the rest of the frame. If not, - * just add in the xmt timestamp and send it quick. - */ - if (peer->flags & FLAG_AUTHENABLE) { - int sendlen; - - xpkt.keyid = htonl(xkeyid); - auth1crypt(xkeyid, (U_LONG *)&xpkt, - LEN_PKT_NOMAC); - get_systime(&peer->xmt); - L_ADDUF(&peer->xmt, sys_authdelay); - HTONL_FP(&peer->xmt, &xpkt.xmt); - sendlen = auth2crypt(xkeyid, (U_LONG *)&xpkt, - LEN_PKT_NOMAC); - sendpkt(&peer->srcadr, find_rtt ? - any_interface : peer->dstadr, - ((peer->cast_flags & MDF_MCAST) && !find_rtt) ? - peer->ttl : -7, &xpkt, sendlen + - LEN_PKT_NOMAC); -#ifdef DEBUG - if (debug > 1) - printf("transmit auth to %s\n", - ntoa(&(peer->srcadr))); -#endif - peer->sent++; - } else { - /* - * Get xmt timestamp, then send it without mac - * field - */ - int find_rtt = (peer->cast_flags & MDF_MCAST) && - peer->dstadr != any_interface; - get_systime(&(peer->xmt)); - HTONL_FP(&peer->xmt, &xpkt.xmt); - sendpkt(&(peer->srcadr), find_rtt ? - any_interface : peer->dstadr, - ((peer->cast_flags & MDF_MCAST) && !find_rtt) ? - peer->ttl : -8, &xpkt, LEN_PKT_NOMAC); -#ifdef DEBUG - if (debug > 1) - printf("transmit to %s\n", - ntoa(&(peer->srcadr))); -#endif - peer->sent++; - } - } - - if (peer->hmode != MODE_BROADCAST) { - u_char opeer_reach; - /* - * Determine reachability and diddle things if we - * haven't heard from the host for a while. If we are - * about to become unreachable and are a - * broadcast/multicast client, the server has refused to - * boogie in client/server mode, so we switch to - * MODE_BCLIENT anyway and wait for subsequent - * broadcasts. - */ - opeer_reach = peer->reach; - if (opeer_reach & 0x80 && peer->flags & FLAG_MCAST2) { - peer->hmode = MODE_BCLIENT; - } - peer->reach <<= 1; - if (peer->reach == 0) { - if (opeer_reach != 0) - report_event(EVNT_UNREACH, peer); - /* - * Clear this guy out. No need to redo clock - * selection since by now this guy won't be a - * player - */ - if (peer->flags & FLAG_CONFIG) { - if (opeer_reach != 0) { - peer_clear(peer); - peer->timereachable = - current_time; - } - } - - /* - * While we have a chance, if our system peer is - * zero or his stratum is greater than the last - * known stratum of this guy, make sure hpoll is - * clamped to the minimum before resetting the - * timer. If the peer has been unreachable for a - * while and we have a system peer who is at - * least his equal, we may want to ramp his - * polling interval up to avoid the useless - * traffic. - */ - if (sys_peer == 0) { - peer->hpoll = peer->minpoll; - peer->unreach = 0; - } else if (sys_peer->stratum > peer->stratum) { - peer->hpoll = peer->minpoll; - peer->unreach = 0; - } else { - if (peer->unreach < 16) { - peer->unreach++; - peer->hpoll = peer->minpoll; - } else if (peer->hpoll < peer->maxpoll) { - peer->hpoll++; - peer->ppoll = peer->hpoll; - } - } - - /* - * Update reachability and poll variables - */ - } else if ((opeer_reach & 3) == 0) { - - l_fp off; - - if (peer->valid > 0) - peer->valid--; - if (peer->hpoll > peer->minpoll) - peer->hpoll--; - L_CLR(&off); - clock_filter(peer, &off, (s_fp)0, - (u_fp)NTP_MAXDISPERSE); - if (peer->flags & FLAG_SYSPEER) - clock_select(); - } else { - if (peer->valid < NTP_SHIFT) { - peer->valid++; - } else { - if (peer->hpoll < peer->maxpoll) - peer->hpoll++; - } - } - } - - /* - * Finally, adjust the hpoll variable for special conditions. If - * we are a broadcast/multicast client, we use the server poll - * interval if listening for broadcasts and one-eighth this - * interval if in client/server mode. The following clamp - * prevents madness. If this is the system poll, sys_poll - * controls hpoll. - */ - if (peer->flags & FLAG_MCAST2) { - if (peer->hmode == MODE_BCLIENT) - peer->hpoll = peer->ppoll; - else - peer->hpoll = peer->ppoll - 3; - } else if (peer->flags & FLAG_SYSPEER) - peer->hpoll = sys_poll; - if (peer->hpoll < peer->minpoll) - peer->hpoll = peer->minpoll; - - /* - * Arrange for our next timeout. hpoll will be less than maxpoll - * for sure. - */ - if (peer->event_timer.next != 0) - /* - * Oops, someone did already. - */ - TIMER_DEQUEUE(&peer->event_timer); - peer_timer = 1 << (int)max((u_char)min(peer->ppoll, - peer->hpoll), peer->minpoll); - peer->event_timer.event_time = current_time + peer_timer; - TIMER_ENQUEUE(timerqueue, &peer->event_timer); -} - -/* - * receive - Receive Procedure. See section 3.4.2 in the specification. - */ -void -receive(rbufp) - struct recvbuf *rbufp; -{ - register struct peer *peer; - register struct pkt *pkt; - register u_char hismode; - int restrict; - int has_mac; - int trustable; - int is_authentic; - u_long hiskeyid; - struct peer *peer2; - -#ifdef DEBUG - if (debug > 1) - printf("receive from %s\n", ntoa(&rbufp->recv_srcadr)); -#endif - - /* - * Let the monitoring software take a look at this first. - */ - monitor(rbufp); - - /* - * Get the restrictions on this guy. If we're to ignore him, - * go no further. - */ - restrict = restrictions(&rbufp->recv_srcadr); - if (restrict & RES_IGNORE) - return; - - /* - * Get a pointer to the packet. - */ - pkt = &rbufp->recv_pkt; - - /* - * Catch packets whose version number we can't deal with - */ - if (PKT_VERSION(pkt->li_vn_mode) >= NTP_VERSION) { - sys_newversionpkt++; - } else if (PKT_VERSION(pkt->li_vn_mode) >= NTP_OLDVERSION) { - sys_oldversionpkt++; - } else { - sys_unknownversion++; - return; - } - - /* - * Catch private mode packets. Dump it if queries not allowed. - */ - if (PKT_MODE(pkt->li_vn_mode) == MODE_PRIVATE) { - if (restrict & RES_NOQUERY) - return; - process_private(rbufp, ((restrict&RES_NOMODIFY) == 0)); - return; - } - - /* - * Same with control mode packets. - */ - if (PKT_MODE(pkt->li_vn_mode) == MODE_CONTROL) { - if (restrict & RES_NOQUERY) - return; - process_control(rbufp, restrict); - return; - } - - /* - * See if we're allowed to serve this guy time. If not, ignore - * him. - */ - if (restrict & RES_DONTSERVE) - return; - - /* - * See if we only accept limited number of clients from the net - * this guy is from. Note: the flag is determined dynamically - * within restrictions() - */ - if (restrict & RES_LIMITED) { - extern u_long client_limit; - - sys_limitrejected++; - syslog(LOG_NOTICE, - "rejected mode %d request from %s - per net client limit (%d) exceeded", - PKT_MODE(pkt->li_vn_mode), - ntoa(&rbufp->recv_srcadr), client_limit); - return; - } - /* - * Dump anything with a putrid stratum. These will most likely - * come from someone trying to poll us with ntpdc. - */ - if (pkt->stratum > NTP_MAXSTRATUM) { - sys_badstratum++; - return; - } - - /* - * Find the peer. This will return a null if this guy isn't in - * the database. - */ - peer = findpeer(&rbufp->recv_srcadr, rbufp->dstadr, rbufp->fd); - - /* - * Check the length for validity, drop the packet if it is - * not as expected. If this is a client mode poll, go no - * further. Send back his time and drop it. - * - * The scheme we use for authentication is this. If we are - * running in non-authenticated mode, we accept both frames - * which are authenticated and frames which aren't, but don't - * authenticate. We do record whether the frame had a mac field - * or not so we know what to do on output. - * - * If we are running in authenticated mode, we only trust frames - * which have authentication attached, which are validated and - * which are using one of our trusted keys. We respond to all - * other pollers without saving any state. If a host we are - * passively peering with changes his key from a trusted one to - * an untrusted one, we immediately unpeer with him, reselect - * the clock and treat him as an unmemorable client (this is - * a small denial-of-service hole I'll have to think about). - * If a similar event occurs with a configured peer we drop the - * frame and hope he'll revert to our key again. If we get a - * frame which can't be authenticated with the given key, we - * drop it. Either we disagree on the keys or someone is trying - * some funny stuff. - */ - - /* - * here we assume that any packet with an authenticator is at - * least LEN_PKT_MAC bytes long, which means at least 96 bits - */ - if (rbufp->recv_length >= LEN_PKT_MAC) { - has_mac = rbufp->recv_length - LEN_PKT_NOMAC; - hiskeyid = ntohl(pkt->keyid); -#ifdef DEBUG - if (debug > 2) - printf( - "receive: pkt is %d octets, mac %d octets long, keyid %ld\n", - rbufp->recv_length, has_mac, hiskeyid); -#endif - } else if (rbufp->recv_length == LEN_PKT_NOMAC) { - hiskeyid = 0; - has_mac = 0; - } else { -#ifdef DEBUG - if (debug > 2) - printf("receive: bad length %d %ld\n", - rbufp->recv_length, sizeof(struct pkt)); -#endif - sys_badlength++; - return; - } - - - /* - * Figure out his mode and validate it. - */ - hismode = PKT_MODE(pkt->li_vn_mode); -#ifdef DEBUG - if (debug > 2) - printf("receive: his mode %d\n", hismode); -#endif - if (PKT_VERSION(pkt->li_vn_mode) == NTP_OLDVERSION && hismode == - 0) { - /* - * Easy. If it is from the NTP port it is - * a sym act, else client. - */ - if (SRCPORT(&rbufp->recv_srcadr) == NTP_PORT) - hismode = MODE_ACTIVE; - else - hismode = MODE_CLIENT; - } else { - if (hismode != MODE_ACTIVE && hismode != MODE_PASSIVE && - hismode != MODE_SERVER && hismode != MODE_CLIENT && - hismode != MODE_BROADCAST) { - syslog(LOG_ERR, "bad mode %d received from %s", - PKT_MODE(pkt->li_vn_mode), - ntoa(&rbufp->recv_srcadr)); - return; - } - } - - /* - * If he included a mac field, decrypt it to see if it is - * authentic. - */ - is_authentic = 0; - if (has_mac) { - if (authhavekey(hiskeyid)) { - if (!authistrusted(hiskeyid)) { - sys_badauth++; -#ifdef DEBUG - if (debug > 3) - printf("receive: untrusted keyid\n"); -#endif - return; - } - if (authdecrypt(hiskeyid, (U_LONG *)pkt, - LEN_PKT_NOMAC)) { - is_authentic = 1; -#ifdef DEBUG - if (debug > 3) - printf("receive: authdecrypt succeeds\n"); -#endif - } else { - sys_badauth++; -#ifdef DEBUG - if (debug > 3) - printf("receive: authdecrypt fails\n"); -#endif - } - } - } - - /* - * If this is someone we don't remember from a previous - * association, dispatch him now. Either we send something back - * quick, we ignore him, or we allocate some memory for him and - * let him continue. - */ - if (peer == 0) { - int mymode; - - mymode = MODE_PASSIVE; - switch(hismode) { - case MODE_ACTIVE: - /* - * See if this guy qualifies as being the least - * bit memorable. If so we keep him around for - * later. If not, send his time quick. - */ - if (restrict & RES_NOPEER) { - fast_xmit(rbufp, (int)hismode, - is_authentic); - return; - } - break; - - case MODE_PASSIVE: - case MODE_SERVER: - /* - * These are obvious errors. Ignore. - */ - return; - - case MODE_CLIENT: - /* - * Send it back quick and go home. - */ - fast_xmit(rbufp, (int)hismode, is_authentic); - return; - - case MODE_BROADCAST: - /* - * Sort of a repeat of the above... - */ - if ((restrict & RES_NOPEER) || !sys_bclient) - return; - mymode = MODE_MCLIENT; - break; - } - - /* - * Okay, we're going to keep him around. Allocate him - * some memory. - */ - peer = newpeer(&rbufp->recv_srcadr, - rbufp->dstadr, mymode, PKT_VERSION(pkt->li_vn_mode), - NTP_MINDPOLL, NTP_MAXDPOLL, 0, hiskeyid); - - if (peer == 0) { - /* - * The only way this can happen is if the - * source address looks like a reference - * clock. Since this is an illegal address - * this is one of those "can't happen" things. - */ - syslog(LOG_ERR, - "receive() failed to peer with %s, mode %d", - ntoa(&rbufp->recv_srcadr), mymode); - return; - } - } - - /* - * Mark the time of reception - */ - peer->timereceived = current_time; - - /* - * If the peer isn't configured, set his keyid and authenable - * status based on the packet. - */ - if (!(peer->flags & FLAG_CONFIG)) { - if (has_mac) { - if (!(peer->reach && peer->keyid != hiskeyid)) { - peer->keyid = hiskeyid; - peer->flags |= FLAG_AUTHENABLE; - } - } else { - peer->keyid = 0; - peer->flags &= ~FLAG_AUTHENABLE; - } - } - - - /* - * If this message was authenticated properly, note this - * in the flags. - */ - if (is_authentic) { - peer->flags |= FLAG_AUTHENTIC; - } else { - /* - * If this guy is authenable, and has been authenticated - * in the past, but just failed the authentic test, - * report the event. - */ - if (peer->flags & FLAG_AUTHENABLE - && peer->flags & FLAG_AUTHENTIC) - report_event(EVNT_PEERAUTH, peer); - peer->flags &= ~FLAG_AUTHENTIC; - } - - /* - * Determine if this guy is basically trustable. - */ - if (restrict & RES_DONTTRUST) - trustable = 0; - else - trustable = 1; - - if (sys_authenticate && trustable) { - if (!(peer->flags & FLAG_CONFIG) || - (peer->flags & FLAG_AUTHENABLE)) { - if (has_mac && is_authentic) - trustable = 1; - else - trustable = 0; - } - } - - /* - * Dispose of the packet based on our respective modes. We - * don't drive this with a table, though we probably could. - */ - switch (peer->hmode) { - case MODE_ACTIVE: - case MODE_CLIENT: - /* - * Active mode associations are configured. If the data - * isn't trustable, ignore it and hope this guy - * brightens up. Else accept any data we get and process - * it. - */ - switch (hismode) { - case MODE_ACTIVE: - case MODE_PASSIVE: - case MODE_SERVER: - case MODE_BROADCAST: - process_packet(peer, pkt, &(rbufp->recv_time), - has_mac, trustable); - break; - - case MODE_CLIENT: - if (peer->hmode == MODE_ACTIVE) - fast_xmit(rbufp, hismode, is_authentic); - return; - } - break; - - case MODE_PASSIVE: - /* - * Passive mode associations are (in the current - * implementation) always dynamic. If we get an invalid - * header, break the connection. I hate doing this since - * it seems like a waste. Oh, well. - */ - switch (hismode) { - case MODE_ACTIVE: - if (process_packet(peer, pkt, - &(rbufp->recv_time), - has_mac, trustable) == 0) { - unpeer(peer); - clock_select(); - fast_xmit(rbufp, (int)hismode, is_authentic); - } - break; - - case MODE_PASSIVE: - case MODE_SERVER: - case MODE_BROADCAST: - /* - * These are errors. Just ignore the packet. - * If he doesn't straighten himself out this - * association will eventually be disolved. - */ - break; - - case MODE_CLIENT: - fast_xmit(rbufp, hismode, is_authentic); - return; - } - break; - - - case MODE_BCLIENT: - /* - * Broadcast client pseudo-mode. We accept both server - * and broadcast data. Passive mode data is an error. - */ - switch (hismode) { - case MODE_ACTIVE: - /* - * This guy wants to give us real time when - * we've been existing on lousy broadcasts! - * Create a passive mode association and do it - * that way, but keep the old one in case the - * packet turns out to be bad. - */ - peer2 = newpeer(&rbufp->recv_srcadr, - rbufp->dstadr, MODE_PASSIVE, - PKT_VERSION(pkt->li_vn_mode), - NTP_MINDPOLL, NTP_MAXPOLL, 0, hiskeyid); - if (process_packet(peer2, pkt, - &rbufp->recv_time, has_mac, trustable) == 0) { - /* - * Strange situation. We've been - * receiving broadcasts from him which - * we liked, but we don't like his - * active mode stuff. Keep his old peer - * structure and send him some time - * quickly, we'll figure it out later. - */ - unpeer(peer2); - fast_xmit(rbufp, (int)hismode, - is_authentic); - } else - /* - * Drop the old association - */ - unpeer(peer); - break; - - case MODE_PASSIVE: - break; - - case MODE_SERVER: - case MODE_BROADCAST: - process_packet(peer, pkt, &rbufp->recv_time, - has_mac, trustable); - /* - * We don't test for invalid headers. - * Let him time out. - */ - break; - } - break; - - case MODE_MCLIENT: - /* - * This mode is temporary and does not appear outside - * this routine. It lasts only from the time the - * broadcast/multicast is recognized until the - * association is instantiated. Note that we start up in - * client/server mode to initially synchronize the - * clock. - */ - switch (hismode) { - case MODE_BROADCAST: - peer->flags |= FLAG_MCAST1 | FLAG_MCAST2; - peer->hmode = MODE_CLIENT; - process_packet(peer, pkt, &rbufp->recv_time, - has_mac, trustable); - break; - - case MODE_SERVER: - case MODE_PASSIVE: - case MODE_ACTIVE: - case MODE_CLIENT: - break; - } - } -} - - -/* - * process_packet - Packet Procedure, a la Section 3.4.3 of the - * specification. Or almost, at least. If we're in here we have a - * reasonable expectation that we will be having a long term - * relationship with this host. - */ -int -process_packet(peer, pkt, recv_ts, has_mac, trustable) - register struct peer *peer; - register struct pkt *pkt; - l_fp *recv_ts; - int has_mac; - int trustable; /* used as "valid header" */ -{ - l_fp t10, t23; - s_fp di, ei, p_dist, p_disp; - l_fp ci, p_rec, p_xmt, p_org; - int randomize; - u_char ostratum, oreach; - U_LONG temp; - u_fp precision; - - sys_processed++; - peer->processed++; - p_dist = NTOHS_FP(pkt->rootdelay); - p_disp = NTOHS_FP(pkt->rootdispersion); - NTOHL_FP(&pkt->rec, &p_rec); - NTOHL_FP(&pkt->xmt, &p_xmt); - if (PKT_MODE(pkt->li_vn_mode) != MODE_BROADCAST) - NTOHL_FP(&pkt->org, &p_org); - else - p_org = peer->rec; - peer->rec = *recv_ts; - peer->flash = 0; - randomize = POLL_RANDOMCHANGE; - - /* - * Test for old or duplicate packets (tests 1 through 3). - */ - if (L_ISHIS(&peer->org, &p_xmt)) /* count old packets */ - peer->oldpkt++; - if (L_ISEQU(&peer->org, &p_xmt)) /* test 1 */ - peer->flash |= TEST1; /* duplicate packet */ - if (PKT_MODE(pkt->li_vn_mode) != MODE_BROADCAST) { - if (!L_ISEQU(&peer->xmt, &p_org)) { /* test 2 */ - randomize = POLL_MAKERANDOM; - peer->bogusorg++; - peer->flash |= TEST2; /* bogus packet */ - } - if (L_ISZERO(&p_rec) || L_ISZERO(&p_org)) - peer->flash |= TEST3; /* unsynchronized */ - } else { - if (L_ISZERO(&p_org)) - peer->flash |= TEST3; /* unsynchronized */ - } - peer->org = p_xmt; /* reuse byte-swapped pkt->xmt */ - peer->ppoll = pkt->ppoll; - - /* - * Call poll_update(). This will either start us, if the - * association is new, or drop the polling interval if the - * association is existing and ppoll has been reduced. - */ - poll_update(peer, peer->hpoll, randomize); - - - /* - * Test for valid header (tests 5 through 8) - */ - if (trustable == 0) /* test 5 */ - peer->flash |= TEST5; /* authentication failed */ - temp = ntohl(pkt->reftime.l_ui); - if (PKT_LEAP(pkt->li_vn_mode) == LEAP_NOTINSYNC || /* test 6 */ - p_xmt.l_ui < temp || p_xmt.l_ui >= temp + NTP_MAXAGE) - peer->flash |= TEST6; /* peer clock unsynchronized */ - if (!(peer->flags & FLAG_CONFIG) && /* test 7 */ - (PKT_TO_STRATUM(pkt->stratum) >= NTP_MAXSTRATUM || - PKT_TO_STRATUM(pkt->stratum) > sys_stratum)) - peer->flash |= TEST7; /* peer stratum out of bounds */ - if (p_dist >= NTP_MAXDISPERSE /* test 8 */ - || p_dist <= (-NTP_MAXDISPERSE) - || p_disp >= NTP_MAXDISPERSE) - peer->flash |= TEST8; /* delay/dispersion too big */ - - /* - * If the packet header is invalid (tests 5 through 8), exit - */ - if (peer->flash & (TEST5 | TEST6 | TEST7 | TEST8)) { - -#ifdef DEBUG - if (debug > 1) - printf("invalid packet header %s %02x\n", - ntoa(&peer->srcadr), peer->flash); -#endif - - return(0); - } - - /* - * Valid header; update our state. - */ - peer->leap = PKT_LEAP(pkt->li_vn_mode); - peer->pmode = PKT_MODE(pkt->li_vn_mode); - if (has_mac) - peer->pkeyid = ntohl(pkt->keyid); - else - peer->pkeyid = 0; - ostratum = peer->stratum; - peer->stratum = PKT_TO_STRATUM(pkt->stratum); - peer->precision = pkt->precision; - peer->rootdelay = p_dist; - peer->rootdispersion = p_disp; - peer->refid = pkt->refid; - NTOHL_FP(&pkt->reftime, &peer->reftime); - oreach = peer->reach; - if (peer->reach == 0) { - peer->timereachable = current_time; - /* - * If this guy was previously unreachable, set his - * polling interval to the minimum and reset the - * unreach counter. - */ - peer->unreach = 0; - peer->hpoll = peer->minpoll; - } - peer->reach |= 1; - - /* - * If running in a client/server association, calculate the - * clock offset c, roundtrip delay d and dispersion e. We use - * the equations (reordered from those in the spec). Note that, - * in a broadcast association, org has been set to the time of - * last reception. Note the computation of dispersion includes - * the system precision plus that due to the frequency error - * since the originate time. - * - * c = ((t2 - t3) + (t1 - t0)) / 2 - * d = (t2 - t3) - (t1 - t0) - * e = (org - rec) (seconds only) - */ - t10 = p_xmt; /* compute t1 - t0 */ - L_SUB(&t10, &peer->rec); - t23 = p_rec; /* compute t2 - t3 */ - L_SUB(&t23, &p_org); - ci = t10; - precision = FP_SECOND >> -(int)sys_precision; - if (precision == 0) - precision = 1; - ei = precision + peer->rec.l_ui - p_org.l_ui; - - /* - * If running in a broacast association, the clock offset is (t1 - * - t0) corrected by the one-way delay, but we can't measure - * that directly; therefore, we start up in client/server mode, - * calculate the clock offset, using the engineered refinement - * algorithms, while also receiving broadcasts. When a broadcast - * is received in client/server mode, we calculate a correction - * factor to use after switching back to broadcast mode. We know - * NTP_SKEWFACTOR == 16, which accounts for the simplified ei - * calculation. - * - * If FLAG_MCAST2 is set, we are a broadcast/multicast client. - * If FLAG_MCAST1 is set, we haven't calculated the propagation - * delay. If hmode is MODE_CLIENT, we haven't set the local - * clock in client/server mode. Initially, we come up - * MODE_CLIENT. When the clock is first updated and FLAG_MCAST2 - * is set, we switch from MODE_CLIENT to MODE_BCLIENT. - */ - if (peer->pmode == MODE_BROADCAST) { - if (peer->flags & FLAG_MCAST1) { - if (peer->hmode == MODE_BCLIENT) - peer->flags &= ~FLAG_MCAST1; - L_SUB(&ci, &peer->offset); - L_NEG(&ci); - peer->estbdelay = LFPTOFP(&ci); - return (1); - - } - FPTOLFP(peer->estbdelay, &t10); - L_ADD(&ci, &t10); - di = peer->delay; - - } else { - L_ADD(&ci, &t23); - L_RSHIFT(&ci); - L_SUB(&t23, &t10); - di = LFPTOFP(&t23); - } - -#ifdef DEBUG - if (debug > 3) - printf("offset: %s, delay %s, error %s\n", - lfptoa(&ci, 6), fptoa(di, 5), fptoa(ei, 5)); -#endif - if (di >= NTP_MAXDISPERSE || di <= (-NTP_MAXDISPERSE) - || ei >= NTP_MAXDISPERSE) /* test 4 */ - peer->flash |= TEST4; /* delay/dispersion too big */ - - /* - * If the packet data is invalid (tests 1 through 4), exit. - */ - if (peer->flash) { - -#ifdef DEBUG - if (debug) - printf("invalid packet data %s %02x\n", - ntoa(&peer->srcadr), peer->flash); -#endif - - /* - * If there was a reachability change report it even - * though the packet was bogus. - */ - if (oreach == 0) - report_event(EVNT_REACH, peer); - return(1); - } - - /* - * This one is valid. Mark it so, give it to clock_filter(). - */ - clock_filter(peer, &ci, di, (u_fp)ei); - - /* - * If this guy was previously unreachable, report him reachable. - * Note we do this here so that the peer values we return are - * the updated ones. - */ - if (oreach == 0) - report_event(EVNT_REACH, peer); - - /* - * Now update the clock. If we have found a system peer and this - * is a broadcast/multicast client, switch to listen mode. - */ - clock_update(peer); - if (sys_peer && peer->flags & FLAG_MCAST2) - peer->hmode = MODE_BCLIENT; - return(1); -} - - -/* - * clock_update - Clock-update procedure, see section 3.4.5. - */ -void -clock_update(peer) - struct peer *peer; -{ - u_char oleap; - u_char ostratum; - s_fp d; - extern u_char leap_mask; - -#ifdef DEBUG - if (debug) - printf("clock_update(%s)\n", ntoa(&peer->srcadr)); -#endif - - record_peer_stats(&peer->srcadr, ctlpeerstatus(peer), - &peer->offset, peer->delay, peer->dispersion); - - /* - * Call the clock selection algorithm to see if this update - * causes the peer to change. If this is not the system peer, - * quit now. - */ - clock_select(); - if (peer != sys_peer) - return; - - /* - * Update the system state. This updates the system stratum, - * leap bits, root delay, root dispersion, reference ID and - * reference time. We also update select dispersion and max - * frequency error. - */ - oleap = sys_leap; - ostratum = sys_stratum; - sys_stratum = peer->stratum + 1; - if (sys_stratum == 1) - sys_refid = peer->refid; - else - sys_refid = peer->srcadr.sin_addr.s_addr; - sys_reftime = peer->rec; - d = peer->delay; - if (d < 0) - d = -d; - sys_rootdelay = peer->rootdelay + d; - d = peer->soffset; - if (d < 0) - d = -d; - d += peer->dispersion + peer->selectdisp; - if (!peer->flags & FLAG_REFCLOCK && d < NTP_MINDISPERSE) - d = NTP_MINDISPERSE; - sys_rootdispersion = peer->rootdispersion + d; - - /* - * Reset/adjust the system clock. Watch for timewarps here. - */ - switch (local_clock(&sys_offset, peer)) { - case -1: - - /* - * Clock is too screwed up. Just exit for now. - */ - report_event(EVNT_SYSFAULT, (struct peer *)0); - exit(1); - /*NOTREACHED*/ - case 0: - - /* - * Clock was slewed. Continue on normally. - */ - sys_leap = leap_consensus & leap_mask; - L_CLR(&sys_refskew); - break; - - case 1: - - /* - * Clock was stepped. Clear filter registers - * of all peers. - */ - clear_all(); - leap_process(); /* reset the leap interrupt */ - sys_leap = LEAP_NOTINSYNC; - sys_refskew.l_i = NTP_MAXSKEW; sys_refskew.l_f = 0; - report_event(EVNT_CLOCKRESET, (struct peer *)0); - break; - } - sys_maxd = peer->dispersion + peer->selectdisp; - if (oleap != sys_leap) - report_event(EVNT_SYNCCHG, (struct peer *)0); - if (ostratum != sys_stratum) - report_event(EVNT_PEERSTCHG, (struct peer *)0); -} - - -/* - * poll_update - update peer poll interval. See Section 3.4.8 of the - * spec. - */ -void -poll_update(peer, new_hpoll, randomize) - struct peer *peer; - unsigned int new_hpoll; - int randomize; -{ - register struct event *evp; - register u_long new_timer; - u_char newpoll, oldpoll; - -#ifdef DEBUG - if (debug > 1) - printf("poll_update(%s, %d, %d)\n", ntoa(&peer->srcadr), - new_hpoll, randomize); -#endif - /* - * Catch reference clocks here. The polling interval for a - * reference clock is fixed and needn't be maintained by us. - */ - if (peer->flags & FLAG_REFCLOCK || peer->hmode == - MODE_BROADCAST) - return; - - /* - * This routine * will randomly perturb the new peer.timer if - * requested, to try to prevent synchronization with the remote - * peer from occuring. There are three options, based on the - * value of randomize: - * - * POLL_NOTRANDOM - essentially the spec algorithm. If - * peer.timer is greater than the new polling interval, - * drop it to the new interval. - * - * POLL_RANDOMCHANGE - make changes randomly. If peer.timer - * must be changed, based on the comparison about, randomly - * perturb the new value of peer.timer. - * - * POLL_MAKERANDOM - make next interval random. Calculate - * a randomly perturbed poll interval. If this value is - * less that peer.timer, update peer.timer. - */ - oldpoll = peer->hpoll; - if (peer->hmode == MODE_BCLIENT) - peer->hpoll = peer->ppoll; - else if ((peer->flags & FLAG_SYSPEER) && new_hpoll > sys_poll) - peer->hpoll = max(peer->minpoll, sys_poll); - else { - if (new_hpoll > peer->maxpoll) - peer->hpoll = peer->maxpoll; - else if (new_hpoll < peer->minpoll) - peer->hpoll = peer->minpoll; - else - peer->hpoll = new_hpoll; - } - - /* hpoll <= maxpoll for sure */ - newpoll = max((u_char)min(peer->ppoll, peer->hpoll), - peer->minpoll); - if (randomize == POLL_MAKERANDOM || (randomize == - POLL_RANDOMCHANGE && newpoll != oldpoll)) - new_timer = (1 << (newpoll - 1)) - + ranp2(newpoll - 1) + current_time; - else - new_timer = (1 << newpoll) + current_time; - evp = &(peer->event_timer); - if (evp->next == 0 || evp->event_time > new_timer) { - TIMER_DEQUEUE(evp); - evp->event_time = new_timer; - TIMER_ENQUEUE(timerqueue, evp); - } -} - -/* - * clear_all - clear all peer filter registers. This is done after - * a step change in the time. - */ -static void -clear_all() -{ - register int i; - register struct peer *peer; - - for (i = 0; i < HASH_SIZE; i++) - for (peer = peer_hash[i]; peer != 0; peer = peer->next) { - peer_clear(peer); - } - - /* - * Clear sys_peer. We'll sync to one later. - */ - sys_peer = 0; - sys_stratum = STRATUM_UNSPEC; -} - - -/* - * clear - clear peer filter registers. See Section 3.4.7 of the spec. - */ -void -peer_clear(peer) - register struct peer *peer; -{ - register int i; - -#ifdef DEBUG - if (debug) - printf("clear(%s)\n", ntoa(&peer->srcadr)); -#endif - memset(CLEAR_TO_ZERO(peer), 0, LEN_CLEAR_TO_ZERO); - peer->hpoll = peer->minpoll; - peer->dispersion = NTP_MAXDISPERSE; - for (i = 0; i < NTP_SHIFT; i++) - peer->filter_error[i] = NTP_MAXDISPERSE; - poll_update(peer, peer->minpoll, POLL_RANDOMCHANGE); - clock_select(); - - /* - * Clear out the selection counters - */ - peer->candidate = 0; - peer->select = 0; - peer->correct = 0; - peer->was_sane = 0; - - /* - * Since we have a chance to correct possible funniness in - * our selection of interfaces on a multihomed host, do so - * by setting us to no particular interface. - */ - peer->dstadr = any_interface; -} - - -/* - * clock_filter - add incoming clock sample to filter register and run - * the filter procedure to find the best sample. - */ -void -clock_filter(peer, sample_offset, sample_delay, sample_error) - register struct peer *peer; - l_fp *sample_offset; - s_fp sample_delay; - u_fp sample_error; -{ - register int i, j, k, n; - register u_char *ord; - s_fp distance[NTP_SHIFT]; - long skew, skewmax; - -#ifdef DEBUG - if (debug) - printf("clock_filter(%s, %s, %s, %s)\n", - ntoa(&peer->srcadr), lfptoa(sample_offset, 6), - fptoa(sample_delay, 5), ufptoa(sample_error, 5)); -#endif - - /* - * Update sample errors and calculate distances. Also initialize - * sort index vector. We know NTP_SKEWFACTOR == 16 - */ - skew = sys_clock - peer->update; - peer->update = sys_clock; - ord = peer->filter_order; - j = peer->filter_nextpt; - for (i = 0; i < NTP_SHIFT; i++) { - peer->filter_error[j] += (u_fp)skew; - if (peer->filter_error[j] > NTP_MAXDISPERSE) - peer->filter_error[j] = NTP_MAXDISPERSE; - distance[i] = peer->filter_error[j] + - (peer->filter_delay[j] >> 1); - ord[i] = j; - if (--j < 0) - j += NTP_SHIFT; - } - - /* - * Insert the new sample at the beginning of the register. - */ - peer->filter_delay[peer->filter_nextpt] = sample_delay; - peer->filter_offset[peer->filter_nextpt] = *sample_offset; - peer->filter_soffset[peer->filter_nextpt] = - LFPTOFP(sample_offset); - peer->filter_error[peer->filter_nextpt] = sample_error; - distance[0] = sample_error + (sample_delay >> 1); - - /* - * Sort the samples in the register by distance. The winning - * sample will be in ord[0]. Sort the samples only if the - * samples are not too old and the delay is meaningful. - */ - skewmax = 0; - for (n = 0; n < NTP_SHIFT && sample_delay; n++) { - for (j = 0; j < n && skewmax < - CLOCK_MAXSEC; j++) { - if (distance[j] > distance[n]) { - s_fp ftmp; - - ftmp = distance[n]; - k = ord[n]; - distance[n] = distance[j]; - ord[n] = ord[j]; - distance[j] = ftmp; - ord[j] = k; - } - } - skewmax += (1 << peer->hpoll); - } - peer->filter_nextpt++; - if (peer->filter_nextpt >= NTP_SHIFT) - peer->filter_nextpt = 0; - - /* - * We compute the dispersion as per the spec. Note that, to make - * things simple, both the l_fp and s_fp offsets are retained - * and that the s_fp could be nonsense if the l_fp is greater - * than about 32000 s. However, the sanity checks in - * ntp_loopfilter() require the l_fp offset to be less than 1000 - * s anyway, so not to worry. - */ - if (peer->filter_error[ord[0]] >= NTP_MAXDISPERSE) { - peer->dispersion = NTP_MAXDISPERSE; - } else { - s_fp d; - u_fp y; - - peer->delay = peer->filter_delay[ord[0]]; - peer->offset = peer->filter_offset[ord[0]]; - peer->soffset = LFPTOFP(&peer->offset); - peer->dispersion = peer->filter_error[ord[0]]; - - y = 0; - for (i = NTP_SHIFT - 1; i > 0; i--) { - if (peer->filter_error[ord[i]] >= - NTP_MAXDISPERSE) - d = NTP_MAXDISPERSE; - else { - d = peer->filter_soffset[ord[i]] - - peer->filter_soffset[ord[0]]; - if (d < 0) - d = -d; - if (d > NTP_MAXDISPERSE) - d = NTP_MAXDISPERSE; - } - /* - * XXX This *knows* NTP_FILTER is 1/2 - */ - y = ((u_fp)d + y) >> 1; - } - peer->dispersion += y; - - /* - * Calculate synchronization distance backdated to - * sys_lastselect (clock_select will fix it). We know - * NTP_SKEWFACTOR == 16. - */ - d = peer->delay; - if (d < 0) - d = -d; - d += peer->rootdelay; - peer->synch = (d >> 1) + peer->rootdispersion + - peer->dispersion - (sys_clock - sys_lastselect); - } -} - - -/* - * clock_select - find the pick-of-the-litter clock - */ -void -clock_select() -{ - register struct peer *peer; - register int i; - register int nlist, nl3; - register s_fp d, e; - register int j; - register int n; - register int allow, found, k; - s_fp low = 0x7fffffff; - s_fp high = -0x7ffffff; - u_fp synch[NTP_MAXCLOCK], error[NTP_MAXCLOCK]; - struct peer *osys_peer; - struct peer *typeacts = 0; - struct peer *typelocal = 0; - struct peer *typepps = 0; - struct peer *typeprefer = 0; - struct peer *typesystem = 0; - - static int list_alloc = 0; - static struct endpoint *endpoint; - static int *index; - static struct peer **peer_list; - static int endpoint_size = 0, index_size = 0, peer_list_size = 0; - -#ifdef DEBUG - if (debug > 1) - printf("clock_select()\n"); -#endif - - /* - * Initizialize. If a prefer peer does not survive this thing, - * the pps_update switch will remain zero. - */ - pps_update = 0; - nlist = 0; - for (n = 0; n < HASH_SIZE; n++) - nlist += peer_hash_count[n]; - if (nlist > list_alloc) { - if (list_alloc > 0) { - free(endpoint); - free(index); - free(peer_list); - } - while (list_alloc < nlist) { - list_alloc += 5; - endpoint_size += 5 * 3 * sizeof *endpoint; - index_size += 5 * 3 * sizeof *index; - peer_list_size += 5 * sizeof *peer_list; - } - endpoint = (struct endpoint *)emalloc(endpoint_size); - index = (int *)emalloc(index_size); - peer_list = (struct peer **)emalloc(peer_list_size); - } - - /* - * This first chunk of code is supposed to go through all - * peers we know about to find the NTP_MAXLIST peers which - * are most likely to succeed. We run through the list - * doing the sanity checks and trying to insert anyone who - * looks okay. We are at all times aware that we should - * only keep samples from the top two strata and we only need - * NTP_MAXLIST of them. - */ - nlist = nl3 = 0; /* none yet */ - for (n = 0; n < HASH_SIZE; n++) { - for (peer = peer_hash[n]; peer != 0; peer = peer->next) { - /* - * Clear peer selection stats - */ - peer->was_sane = 0; - peer->correct = 0; - peer->candidate = 0; - peer->select = 0; - - peer->flags &= ~FLAG_SYSPEER; - /* - * Update synch distance (NTP_SKEWFACTOR == 16). - * Note synch distance check instead of spec - * dispersion check. Naughty. - */ - peer->synch += (sys_clock - sys_lastselect); - - if (peer->reach == 0) - continue; /* unreachable */ - if (peer->stratum > 1 && peer->refid == - peer->dstadr->sin.sin_addr.s_addr) - continue; /* sync loop */ - if (peer->stratum >= NTP_MAXSTRATUM || - peer->stratum > sys_stratum) - continue; /* bad stratum */ - - if (peer->dispersion >= NTP_MAXDISTANCE) { - peer->seldisptoolarge++; - continue; /* too noisy or broken */ - } - if (peer->org.l_ui < peer->reftime.l_ui) { - peer->selbroken++; - continue; /* very broken host */ - } - - /* - * Don't allow the local-clock or acts drivers - * in the kitchen at this point, unless the - * prefer peer. Do that later, but only if - * nobody else is around. - */ - if (peer->refclktype == REFCLK_LOCALCLOCK) { - typelocal = peer; - if (!(peer->flags & FLAG_PREFER)) - continue; /* no local clock */ - } - if (peer->refclktype == REFCLK_NIST_ACTS) { - typeacts = peer; - if (!(peer->flags & FLAG_PREFER)) - continue; /* no acts */ - } - - /* - * If we get this far, we assume the peer is - * acceptable. - */ - peer->was_sane = 1; - peer_list[nlist++] = peer; - - /* - * Insert each interval endpoint on the sorted - * list. - */ - e = peer->soffset + peer->synch; /* Upper end */ - for (i = nl3 - 1; i >= 0; i--) { - if (e >= endpoint[index[i]].val) - break; - index[i + 3] = index[i]; - } - index[i + 3] = nl3; - endpoint[nl3].type = 1; - endpoint[nl3++].val = e; - - e -= peer->synch; /* Center point */ - for ( ; i >= 0; i--) { - if (e >= endpoint[index[i]].val) - break; - index[i + 2] = index[i]; - } - index[i + 2] = nl3; - endpoint[nl3].type = 0; - endpoint[nl3++].val = e; - - e -= peer->synch; /* Lower end */ - for ( ; i >= 0; i--) { - if (e >= endpoint[index[i]].val) - break; - index[i + 1] = index[i]; - } - index[i + 1] = nl3; - endpoint[nl3].type = -1; - endpoint[nl3++].val = e; - } - } - sys_lastselect = sys_clock; - -#ifdef DEBUG - if (debug > 2) - for (i = 0; i < nl3; i++) - printf("select: endpoint %2d %s\n", - endpoint[index[i]].type, - fptoa(endpoint[index[i]].val, 6)); -#endif - - i = 0; - j = nl3 - 1; - allow = nlist; /* falsetickers assumed */ - found = 0; - while (allow > 0) { - allow--; - for (n = 0; i <= j; i++) { - n += endpoint[index[i]].type; - if (n < 0) - break; - if (endpoint[index[i]].type == 0) - found++; - } - for (n = 0; i <= j; j--) { - n += endpoint[index[j]].type; - if (n > 0) - break; - if (endpoint[index[j]].type == 0) - found++; - } - if (found > allow) - break; - low = endpoint[index[i++]].val; - high = endpoint[index[j--]].val; - } - - /* - * If no survivors remain at this point, check if the acts or - * local clock drivers have been found. If so, nominate one of - * them as the only survivor. Otherwise, give up and declare us - * unsynchronized. - */ - if ((allow << 1) >= nlist) { - if (typeacts != 0) { - typeacts->was_sane = 1; - peer_list[0] = typeacts; - nlist = 1; - } else if (typelocal != 0) { - typelocal->was_sane = 1; - peer_list[0] = typelocal; - nlist = 1; - } else { - if (sys_peer != 0) - report_event(EVNT_PEERSTCHG, - (struct peer *)0); - sys_peer = 0; - sys_stratum = STRATUM_UNSPEC; - return; - } - } - -#ifdef DEBUG - if (debug > 2) - printf("select: low %s high %s\n", fptoa(low, 6), - fptoa(high, 6)); -#endif - - /* - * Clustering algorithm. Process intersection list to discard - * outlyers. Construct candidate list in cluster order - * determined by the sum of peer synchronization distance plus - * scaled stratum. We must find at least one peer. - */ - j = 0; - for (i = 0; i < nlist; i++) { - peer = peer_list[i]; - if (nlist > 1 && (peer->soffset < low || high < - peer->soffset)) - continue; - peer->correct = 1; - d = peer->synch + ((u_long)peer->stratum << - NTP_DISPFACTOR); - if (j >= NTP_MAXCLOCK) { - if (d >= synch[j - 1]) - continue; - else - j--; - } - for (k = j; k > 0; k--) { - if (d >= synch[k - 1]) - break; - synch[k] = synch[k - 1]; - peer_list[k] = peer_list[k - 1]; - } - peer_list[k] = peer; - synch[k] = d; - j++; - } - nlist = j; - -#ifdef DEBUG - if (debug > 2) - for (i = 0; i < nlist; i++) - printf("select: candidate %s cdist %s\n", - ntoa(&peer_list[i]->srcadr), - fptoa(synch[i], 6)); -#endif - - /* - * Now, prune outlyers by root dispersion. Continue as long as - * there are more than NTP_MINCLOCK survivors and the minimum - * select dispersion is greater than the maximum peer - * dispersion. Stop if we are about to discard a preferred peer. - */ - for (i = 0; i < nlist; i++) { - peer = peer_list[i]; - peer->candidate = i + 1; - error[i] = peer_list[i]->rootdispersion + - peer_list[i]->dispersion + - (sys_clock - peer_list[i]->update); - } - while (1) { - u_fp maxd = 0; - e = error[0]; - for (k = i = nlist - 1; i >= 0; i--) { - u_fp sdisp = 0; - - for (j = nlist - 1; j > 0; j--) { - d = peer_list[i]->soffset - - peer_list[j]->soffset; - if (d < 0) - d = -d; - sdisp += d; - sdisp = ((sdisp >> 1) + sdisp) >> 1; - } - peer_list[i]->selectdisp = sdisp; - if (sdisp > maxd) { - maxd = sdisp; - k = i; - } - if (error[i] < e) - e = error[i]; - } - if (nlist <= NTP_MINCLOCK || maxd <= e || - peer_list[k]->flags & FLAG_PREFER) - break; - for (j = k + 1; j < nlist; j++) { - peer_list[j - 1] = peer_list[j]; - error[j - 1] = error[j]; - } - nlist--; - } - -#ifdef DEBUG - if (debug > 1) { - for (i = 0; i < nlist; i++) - printf("select: survivor %s offset %s, cdist %s\n", - ntoa(&peer_list[i]->srcadr), - lfptoa(&peer_list[i]->offset, 6), - fptoa(synch[i], 5)); - } -#endif - - /* - * What remains is a list of not greater than NTP_MINCLOCK - * peers. We want only a peer at the lowest stratum to become - * the system peer, although all survivors are eligible for the - * combining algorithm. First record their order, diddle the - * flags and clamp the poll intervals. Then, consider the peers - * at the lowest stratum. Of these, OR the leap bits on the - * assumption that, if some of them honk nonzero bits, they must - * know what they are doing. Also, check for prefer and pps - * peers. If a prefer peer is found within CLOCK_MAX, update the - * pps switch. Of the other peers not at the lowest stratum, - * check if the system peer is among them and, if found, zap - * him. We note that the head of the list is at the lowest - * stratum and that unsynchronized peers cannot survive this - * far. - */ - leap_consensus = 0; - for (i = nlist - 1; i >= 0; i--) { - peer_list[i]->select = i + 1; - peer_list[i]->flags |= FLAG_SYSPEER; - poll_update(peer_list[i], peer_list[i]->hpoll, - POLL_RANDOMCHANGE); - if (peer_list[i]->stratum == peer_list[0]->stratum) { - leap_consensus |= peer_list[i]->leap; - if (peer_list[i]->refclktype == REFCLK_ATOM_PPS) - typepps = peer_list[i]; - if (peer_list[i] == sys_peer) - typesystem = peer_list[i]; - if (peer_list[i]->flags & FLAG_PREFER) { - typeprefer = peer_list[i]; - if (typeprefer->soffset >= -CLOCK_MAX_FP && - typeprefer->soffset < CLOCK_MAX_FP) - pps_update = 1; - } - } else { - if (peer_list[i] == sys_peer) - sys_peer = 0; - } - } - - /* - * Mitigation rules of the game. There are several types of - * peers that make a difference here: (1) prefer local peers - * (type REFCLK_LOCALCLOCK with FLAG_PREFER) or prefer acts - * peers (type REFCLK_NIST_ATOM with FLAG_PREFER), (2) pps peers - * (type REFCLK_ATOM_PPS), (3) remaining prefer peers (flag - * FLAG_PREFER), (4) the existing system peer, if any, (5) the - * head of the survivor list. Note that only one peer can be - * declared prefer. The order of preference is in the order - * stated. Note that all of these must be at the lowest stratum, - * i.e., the stratum of the head of the survivor list. - */ - osys_peer = sys_peer; - if (typeprefer && (typeprefer == typelocal || typeprefer == - typeacts || !typepps)) { - sys_peer = typeprefer; - sys_peer->selectdisp = 0; - sys_offset = sys_peer->offset; -#ifdef DEBUG - if (debug) - printf("select: prefer offset %s\n", - lfptoa(&sys_offset, 6)); -#endif - } else if (typepps) { - sys_peer = typepps; - sys_peer->selectdisp = 0; - sys_offset = sys_peer->offset; -#ifdef DEBUG - if (debug) - printf("select: pps offset %s\n", - lfptoa(&sys_offset, 6)); -#endif - } else { - if (!typesystem) - sys_peer = peer_list[0]; - clock_combine(peer_list, nlist); -#ifdef DEBUG - if (debug) - printf("select: combine offset %s\n", - lfptoa(&sys_offset, 6)); -#endif - } - - /* - * If we got a new system peer from all of this, report the - * event and clamp the system poll interval. - */ - if (osys_peer != sys_peer) { - sys_poll = sys_peer->minpoll; - report_event(EVNT_PEERSTCHG, (struct peer *)0); - } -} - -/* - * clock_combine - combine offsets from selected peers - * - * Note: this routine uses only those peers at the lowest stratum. - * Strictly speaking, this is at variance with the spec. - */ -void -clock_combine(peers, npeers) - struct peer **peers; - int npeers; -{ - register int i, j, k; - register u_fp a, b, d; - u_fp synch[NTP_MAXCLOCK]; - l_fp coffset[NTP_MAXCLOCK]; - l_fp diff; - - /* - * Sort the offsets by synch distance. - */ - k = 0; - for (i = 0; i < npeers; i++) { - if (peers[i]->stratum > sys_peer->stratum) - continue; - d = peers[i]->synch; - for (j = k; j > 0; j--) { - if (synch[j - 1] <= d) - break; - synch[j] = synch[j - 1]; - coffset[j] = coffset[j - 1]; - } - synch[j] = d; - coffset[j] = peers[i]->offset; - k++; - } - - /* - * Succesively combine the two offsets with the highest - * distance and enter the result into the sorted list. - */ - for (i = k - 2; i >= 0; i--) { - /* - * The possible weights for the most distant offset - * are 1/2, 1/4, 1/8 and zero. We combine the synch - * distances as if they were variances of the offsets; - * the given weights allow us to stay within 16/15 of - * the optimum combined variance at each step, and - * within 8/7 on any series. - * - * The breakeven points for the weigths are found - * where the smaller distance is 3/8, 3/16 and 1/16 - * of the sum, respectively. - */ - d = synch[i]; - a = (d + synch[i + 1]) >> 2; /* (d1+d2)/4 */ - b = a>>1; /* (d1+d2)/8 */ - if (d <= (b>>1)) /* d1 <= (d1+d2)/16 */ - /* - * Below 1/16, no combination is done, - * we just drop the distant offset. - */ - continue; - - /* - * The offsets are combined by shifting their - * difference the appropriate number of times and - * adding it back in. - */ - diff = coffset[i + 1]; - L_SUB(&diff, &coffset[i]); - L_RSHIFT(&diff); - if (d >= a + b) { /* d1 >= 3(d1+d2)/8 */ - /* - * Above 3/8, the weight is 1/2, and the - * combined distance is (d1+d2)/4 - */ - d = a; - } else { - a >>= 2; /* (d1+d2)/16 */ - L_RSHIFT(&diff); - if (d >= a + b) { /* d1 >= 3(d1+d2)/16 */ - /* - * Between 3/16 and 3/8, the weight - * is 1/4, and the combined distance - * is (9d1+d2)/16 = d1/2 + (d1+d2)/16 - */ - d = (d>>1) + a; - } else { - /* - * Between 1/16 and 3/16, the weight - * is 1/8, and the combined distance - * is (49d1+d2)/64 = 3d1/4+(d1+d2)/64 - * (We know d > a, so the shift is safe). - */ - L_RSHIFT(&diff); - d -= (d - a)>>2; - } - } - /* - * Now we can make the combined offset and insert it - * in the list. - */ - L_ADD(&diff, &coffset[i]); - for (j = i; j > 0; j--) { - if (d >= synch[j - 1]) - break; - synch[j] = synch[j - 1]; - coffset[j] = coffset[j - 1]; - } - synch[j] = d; - coffset[j] = diff; - } - - /* - * The result is put where clock_update() can find it. - */ - sys_offset = coffset[0]; -} - - -/* - * fast_xmit - fast path send for stateless (non-)associations - */ -void -fast_xmit(rbufp, rmode, authentic) - struct recvbuf *rbufp; - int rmode; - int authentic; -{ - struct pkt xpkt; - register struct pkt *rpkt; - u_char xmode; - u_short xkey = 0; - int docrypt = 0; - l_fp xmt_ts; - u_fp precision; - -#ifdef DEBUG - if (debug > 1) - printf("fast_xmit(%s, %d)\n", ntoa(&rbufp->recv_srcadr), rmode); -#endif - - /* - * Make up new packet and send it quick - */ - rpkt = &rbufp->recv_pkt; - if (rmode == MODE_ACTIVE) - xmode = MODE_PASSIVE; - else - xmode = MODE_SERVER; - - if (rbufp->recv_length >= LEN_PKT_MAC) { - docrypt = rbufp->recv_length - LEN_PKT_NOMAC; - if (authentic) - xkey = ntohl(rpkt->keyid); - } - - xpkt.li_vn_mode = PKT_LI_VN_MODE(sys_leap, - PKT_VERSION(rpkt->li_vn_mode), xmode); - xpkt.stratum = STRATUM_TO_PKT(sys_stratum); - xpkt.ppoll = max(NTP_MINPOLL, rpkt->ppoll); - xpkt.precision = sys_precision; - xpkt.rootdelay = HTONS_FP(sys_rootdelay); - precision = FP_SECOND >> -(int)sys_precision; - if (precision == 0) - precision = 1; - xpkt.rootdispersion = HTONS_FP(sys_rootdispersion + - precision + LFPTOFP(&sys_refskew)); - xpkt.refid = sys_refid; - HTONL_FP(&sys_reftime, &xpkt.reftime); - xpkt.org = rpkt->xmt; - HTONL_FP(&rbufp->recv_time, &xpkt.rec); - - /* - * If we are encrypting, do it. Else don't. Easy. - */ - if (docrypt) { - int maclen; - - xpkt.keyid = htonl(xkey); - auth1crypt(xkey, (U_LONG *)&xpkt, LEN_PKT_NOMAC); - get_systime(&xmt_ts); - L_ADDUF(&xmt_ts, sys_authdelay); - HTONL_FP(&xmt_ts, &xpkt.xmt); - maclen = auth2crypt(xkey, (U_LONG *)&xpkt, LEN_PKT_NOMAC); - sendpkt(&rbufp->recv_srcadr, rbufp->dstadr, -9, &xpkt, - LEN_PKT_NOMAC + maclen); - } else { - /* - * Get xmt timestamp, then send it without mac field - */ - get_systime(&xmt_ts); - HTONL_FP(&xmt_ts, &xpkt.xmt); - sendpkt(&rbufp->recv_srcadr, rbufp->dstadr, -10, &xpkt, - LEN_PKT_NOMAC); - } -} - -/* - * Find the precision of this particular machine - */ -#define DUSECS 1000000 /* us in a s */ -#define HUSECS (1 << 20) /* approx DUSECS for shifting etc */ -#define MINSTEP 5 /* minimum clock increment (ys) */ -#define MAXSTEP 20000 /* maximum clock increment (us) */ -#define MINLOOPS 5 /* minimum number of step samples */ - -/* - * This routine calculates the differences between successive calls to - * gettimeofday(). If a difference is less than zero, the us field - * has rolled over to the next second, so we add a second in us. If - * the difference is greater than zero and less than MINSTEP, the - * clock has been advanced by a small amount to avoid standing still. - * If the clock has advanced by a greater amount, then a timer interrupt - * has occurred and this amount represents the precision of the clock. - * In order to guard against spurious values, which could occur if we - * happen to hit a fat interrupt, we do this for MINLOOPS times and - * keep the minimum value obtained. - */ -int default_get_precision() -{ - struct timeval tp; - struct timezone tzp; - long last; - int i; - long diff; - long val; - long usec; - - usec = 0; - val = MAXSTEP; - GETTIMEOFDAY(&tp, &tzp); - last = tp.tv_usec; - for (i = 0; i < MINLOOPS && usec < HUSECS;) { - GETTIMEOFDAY(&tp, &tzp); - diff = tp.tv_usec - last; - last = tp.tv_usec; - if (diff < 0) - diff += DUSECS; - usec += diff; - if (diff > MINSTEP) { - i++; - if (diff < val) - val = diff; - } - } - syslog(LOG_INFO, "precision = %d usec", val); - if (usec >= HUSECS) - val = MINSTEP; /* val <= MINSTEP; fast machine */ - diff = HUSECS; - for (i = 0; diff > val; i--) - diff >>= 1; - return (i); -} - -/* - * init_proto - initialize the protocol module's data - */ -void -init_proto() -{ - l_fp dummy; - - /* - * Fill in the sys_* stuff. Default is don't listen to - * broadcasting, don't authenticate. - */ - sys_leap = LEAP_NOTINSYNC; - sys_stratum = STRATUM_UNSPEC; - sys_precision = (s_char)default_get_precision(); - sys_rootdelay = 0; - sys_rootdispersion = 0; - sys_refid = 0; - L_CLR(&sys_reftime); - sys_refskew.l_i = NTP_MAXSKEW; sys_refskew.l_f = 0; - sys_peer = 0; - sys_poll = NTP_MINPOLL; - get_systime(&dummy); - sys_lastselect = sys_clock; - - sys_bclient = 0; - sys_bdelay = DEFBROADDELAY; - sys_authenticate = 0; - sys_authdelay = DEFAUTHDELAY; - - sys_stattime = 0; - sys_badstratum = 0; - sys_oldversionpkt = 0; - sys_newversionpkt = 0; - sys_badlength = 0; - sys_unknownversion = 0; - sys_processed = 0; - sys_badauth = 0; - - /* - * Default these to enable - */ - pll_enable = 1; - stats_control = 1; -} - - -/* - * proto_config - configure the protocol module - */ -void -proto_config(item, value) - int item; - u_long value; -{ - /* - * Figure out what he wants to change, then do it - */ - switch (item) { - case PROTO_PLL: - /* - * Turn on/off pll clock correction - */ - pll_enable = (int)value; - break; - - case PROTO_MONITOR: - /* - * Turn on/off monitoring - */ - if (value) - mon_start(MON_ON); - else - mon_stop(MON_ON); - break; - - case PROTO_FILEGEN: - /* - * Turn on/off statistics - */ - stats_control = (int)value; - break; - - case PROTO_BROADCLIENT: - /* - * Turn on/off facility to listen to broadcasts - */ - sys_bclient = (int)value; - if (value) - io_setbclient(); - else - io_unsetbclient(); - break; - - case PROTO_MULTICAST_ADD: - /* - * Add muliticast group address - */ - sys_bclient = 1; - io_multicast_add(value); - break; - - case PROTO_MULTICAST_DEL: - /* - * Delete multicast group address - */ - sys_bclient = 1; - io_multicast_del(value); - break; - - case PROTO_PRECISION: - /* - * Set system precision - */ - sys_precision = (s_char)value; - break; - - case PROTO_BROADDELAY: - /* - * Set default broadcast delay (s_fp) - */ - if (sys_bdelay < 0) - sys_bdelay = -(-value >> 16); - else - sys_bdelay = value >> 16; - break; - - case PROTO_AUTHENTICATE: - /* - * Specify the use of authenticated data - */ - sys_authenticate = (int)value; - break; - - - case PROTO_AUTHDELAY: - /* - * Set authentication delay (l_fp fraction) - */ - sys_authdelay = value; - break; - - default: - /* - * Log this error - */ - syslog(LOG_ERR, "proto_config: illegal item %d, value %ld", - item, value); - break; - } -} - - -/* - * proto_clr_stats - clear protocol stat counters - */ -void -proto_clr_stats() -{ - sys_badstratum = 0; - sys_oldversionpkt = 0; - sys_newversionpkt = 0; - sys_unknownversion = 0; - sys_badlength = 0; - sys_processed = 0; - sys_badauth = 0; - sys_stattime = current_time; - sys_limitrejected = 0; -} diff --git a/usr.sbin/xntpd/xntpd/ntp_refclock.c b/usr.sbin/xntpd/xntpd/ntp_refclock.c deleted file mode 100644 index 29c80d94fe82..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_refclock.c +++ /dev/null @@ -1,1286 +0,0 @@ -/* - * ntp_refclock - processing support for reference clocks - */ -#ifdef REFCLOCK - -#include <stdio.h> -#include <sys/types.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_unixtime.h" -#include "ntp_refclock.h" -#include "ntp_stdlib.h" - -#ifdef PPS -#include <sys/ppsclock.h> -#endif /* PPS */ - -/* - * Reference clock support is provided here by maintaining the fiction - * that the clock is actually a peer. As no packets are exchanged with a - * reference clock, however, we replace the transmit, receive and packet - * procedures with separate code to simulate them. Routines - * refclock_transmit() and refclock_receive() maintain the peer - * variables in a state analogous to an actual peer and pass reference - * clock data on through the filters. Routines refclock_peer() and - * refclock_unpeer() are called to initialize and terminate reference - * clock associations. A set of utility routines is included to open - * serial devices, process sample data, edit input lines to extract - * embedded timestamps and to peform various debugging functions. - * - * The main interface used by these routines is the refclockproc - * structure, which contains for most drivers the decimal equivalants of - * the year, day, month, hour, second and millisecond/microsecond - * decoded from the ASCII timecode. Additional information includes the - * receive timestamp, exception report, statistics tallies, etc. In - * addition, there may be a driver-specific unit structure used for - * local control of the device. - * - * The support routines are passed a pointer to the peer structure, - * which is used for all peer-specific processing and contains a pointer - * to the refclockproc structure, which in turn containes a pointer to - * the unit structure, if used. In addition, some routines expect an - * address in the dotted quad form 127.127.t.u, where t is the clock - * type and u the unit. A table typeunit[type][unit] contains the peer - * structure pointer for each configured clock type and unit. - * - * Most drivers support the 1-pps signal provided by some radios and - * connected via a level converted described in the gadget directory. - * The signal is captured using a separate, dedicated serial port and - * the tty_clk line discipline/streams modules described in the kernel - * directory. For the highest precision, the signal is captured using - * the carrier-detect line of the same serial port using the ppsclock - * streams module described in the ppsclock directory. - */ -#define REFCLOCKMAXDISPERSE (FP_SECOND/4) /* max sample dispersion */ -#define MAXUNIT 44 /* max units */ -#ifndef CLKLDISC -#define CLKLDISC 10 /* XXX temp tty_clk line discipline */ -#endif -#ifndef CHULDISC -#define CHULDISC 10 /* XXX temp tty_chu line discipline */ -#endif - -/* - * The refclock configuration table. Imported from refclock_conf - */ -extern struct refclock *refclock_conf[]; -extern u_char num_refclock_conf; - -/* - * Imported from the I/O module - */ -extern struct interface *any_interface; -extern struct interface *loopback_interface; - -/* - * Imported from ntp_loopfilter module - */ -extern int fdpps; /* pps file descriptor */ - -/* - * Imported from the timer module - */ -extern u_long current_time; -extern struct event timerqueue[]; - -/* - * Imported from the main and peer modules. We use the same algorithm - * for spacing out timers at configuration time that the peer module - * does. - */ -extern u_long init_peer_starttime; -extern int initializing; -extern int debug; - -/* - * Type/unit peer index. Used to find the peer structure for control and - * debugging. When all clock drivers have been converted to new style, - * this dissapears. - */ -static struct peer *typeunit[REFCLK_MAX + 1][MAXUNIT]; - - -/* - * refclock_report - note the occurance of an event - * - * This routine presently just remembers the report and logs it, but - * does nothing heroic for the trap handler. It tries to be a good - * citizen and bothers the system log only if things change. - */ -void -refclock_report(peer, code) - struct peer *peer; - u_char code; -{ - struct refclockproc *pp; - - if (!(pp = peer->procptr)) - return; - if (code == CEVNT_BADREPLY) - pp->badformat++; - if (code == CEVNT_BADTIME) - pp->baddata++; - if (code == CEVNT_TIMEOUT) - pp->noreply++; - if (pp->currentstatus != code) { - pp->currentstatus = code; - if (code == CEVNT_NOMINAL) - return; - pp->lastevent = code; - if (code == CEVNT_FAULT) - syslog(LOG_ERR, - "clock %s fault %x", ntoa(&peer->srcadr), code); - else { - syslog(LOG_INFO, - "clock %s event %x", ntoa(&peer->srcadr), code); - } - } -} - - -/* - * init_refclock - initialize the reference clock drivers - * - * This routine calls each of the drivers in turn to initialize internal - * variables, if necessary. Most drivers have nothing to say at this - * point. - */ -void -init_refclock() -{ - int i, j; - - for (i = 0; i < num_refclock_conf; i++) { - if (refclock_conf[i]->clock_init != noentry) - (refclock_conf[i]->clock_init)(); - for (j = 0; j < MAXUNIT; j++) - typeunit[i][j] = 0; - } -} - - -/* - * refclock_newpeer - initialize and start a reference clock - * - * This routine allocates and initializes the interface structure which - * supports a reference clock in the form of an ordinary NTP peer. A - * driver-specific support routine completes the initialization, if - * used. Default peer variables which identify the clock and establish - * its reference ID and stratum are set here. It returns one if success - * and zero if the clock address is invalid or already running, - * insufficient resources are available or the driver declares a bum - * rap. - */ -int -refclock_newpeer(peer) - struct peer *peer; /* peer structure pointer */ -{ - struct refclockproc *pp; - u_char clktype; - int unit; - - /* - * Check for valid clock address. If already running, shut it * down first. - */ - if (!ISREFCLOCKADR(&peer->srcadr)) { - syslog(LOG_ERR, - "refclock_newpeer: clock address %s invalid", - ntoa(&peer->srcadr)); - return (0); - } - clktype = REFCLOCKTYPE(&peer->srcadr); - unit = REFCLOCKUNIT(&peer->srcadr); - if (clktype >= num_refclock_conf || unit > MAXUNIT || - refclock_conf[clktype]->clock_start == noentry) { - syslog(LOG_ERR, - "refclock_newpeer: clock type %d invalid\n", - clktype); - return (0); - } - refclock_unpeer(peer); - - /* - * Allocate and initialize interface structure - */ - if (!(pp = (struct refclockproc *) - emalloc(sizeof(struct refclockproc)))) - return (0); - memset((char *)pp, 0, sizeof(struct refclockproc)); - typeunit[clktype][unit] = peer; - peer->procptr = pp; - - /* - * Initialize structures - */ - peer->refclktype = clktype; - peer->refclkunit = unit; - peer->flags |= FLAG_REFCLOCK; - peer->event_timer.peer = peer; - peer->event_timer.event_handler = refclock_transmit; - pp->type = clktype; - pp->timestarted = current_time; - peer->stratum = STRATUM_REFCLOCK; - peer->refid = peer->srcadr.sin_addr.s_addr; - peer->maxpoll = peer->minpoll; - - /* - * Do driver dependent initialization - */ - if (!((refclock_conf[clktype]->clock_start)(unit, peer))) { - free(pp); - return (0); - } - peer->hpoll = peer->minpoll; - peer->ppoll = peer->maxpoll; - if (peer->stratum <= 1) - peer->refid = pp->refid; - else - peer->refid = peer->srcadr.sin_addr.s_addr; - - /* - * Set up the timeout for polling and reachability determination - */ - if (initializing) { - init_peer_starttime += (1 << EVENT_TIMEOUT); - if (init_peer_starttime >= (1 << peer->minpoll)) - init_peer_starttime = (1 << EVENT_TIMEOUT); - peer->event_timer.event_time = init_peer_starttime; - } else { - peer->event_timer.event_time = current_time + - (1 << peer->hpoll); - } - TIMER_ENQUEUE(timerqueue, &peer->event_timer); - return (1); -} - - -/* - * refclock_unpeer - shut down a clock - */ -void -refclock_unpeer(peer) - struct peer *peer; /* peer structure pointer */ -{ - u_char clktype; - int unit; - - /* - * Wiggle the driver to release its resources, then give back - * the interface structure. - */ - if (!peer->procptr) - return; - clktype = peer->refclktype; - unit = peer->refclkunit; - if (refclock_conf[clktype]->clock_shutdown != noentry) - (refclock_conf[clktype]->clock_shutdown)(unit, peer); - free(peer->procptr); - peer->procptr = 0; -} - - -/* - * refclock_transmit - simulate the transmit procedure - * - * This routine implements the NTP transmit procedure for a reference - * clock. This provides a mechanism to call the driver at the NTP poll - * interval, as well as provides a reachability mechanism to detect a - * broken radio or other madness. - */ -void -refclock_transmit(peer) - struct peer *peer; /* peer structure pointer */ -{ - struct refclockproc *pp; - u_char clktype; - int unit; - u_char opeer_reach; - - pp = peer->procptr; - clktype = peer->refclktype; - unit = peer->refclkunit; - peer->sent++; - - /* - * The transmit procedure is supposed to freeze a timestamp. - * Get one just for fun, and to tell when we last were here. - */ - get_systime(&peer->xmt); - - /* - * Fiddle reachability. - */ - opeer_reach = peer->reach; - peer->reach <<= 1; - if (peer->reach == 0) { - /* - * Clear this one out. No need to redo selection since - * this fellow will definitely be suffering from - * dispersion madness. - */ - if (opeer_reach != 0) { - peer_clear(peer); - peer->timereachable = current_time; - report_event(EVNT_UNREACH, peer); - } - - /* - * Update reachability and poll variables - */ - } else if ((opeer_reach & 3) == 0) { - l_fp off; - - if (peer->valid > 0) - peer->valid--; - L_CLR(&off); - clock_filter(peer, &off, 0, NTP_MAXDISPERSE); - if (peer->flags & FLAG_SYSPEER) - clock_select(); - } else if (peer->valid < NTP_SHIFT) - peer->valid++; - - /* - * If he wants to be polled, do it. New style drivers do not use - * the unit argument, since the fudge stuff is in the - * refclockproc structure. - */ - if (refclock_conf[clktype]->clock_poll != noentry) - (refclock_conf[clktype]->clock_poll)(unit, peer); - - /* - * Finally, reset the timer - */ - peer->event_timer.event_time += (1 << peer->hpoll); - TIMER_ENQUEUE(timerqueue, &peer->event_timer); -} - - -/* - * Compare two l_fp's - used with qsort() - */ -static int -refclock_cmpl_fp(p1, p2) - register void *p1, *p2; /* l_fp to compare */ -{ - - if (!L_ISGEQ((l_fp *)p1, (l_fp *)p2)) - return (-1); - if (L_ISEQU((l_fp *)p1, (l_fp *)p2)) - return (0); - return (1); -} - - -/* - * refclock_process - process a pile of samples from the clock - * - * This routine converts the timecode in the form days, hours, miinutes, - * seconds, milliseconds/microseconds to internal timestamp format. It - * then calculates the difference from the receive timestamp and - * assembles the samples in a shift register. It implements a recursive - * median filter to suppress spikes in the data, as well as determine a - * rough dispersion estimate. A configuration constant time adjustment - * fudgetime1 can be added to the final offset to compensate for various - * systematic errors. The routine returns one if success and zero if - * failure due to invalid timecode data or very noisy offsets. - */ -int -refclock_process(pp, nstart, nskeep) - struct refclockproc *pp; /* peer structure pointer */ - int nstart; /* stages of median filter */ - int nskeep; /* stages after outlyer trim */ -{ - int i, n; - l_fp offset, median, lftmp; - l_fp off[MAXSTAGE]; - u_fp disp; - - /* - * Compute the timecode timestamp from the days, hours, minutes, - * seconds and milliseconds/microseconds of the timecode. Use - * clocktime() for the aggregate seconds and the msec/usec for - * the fraction, when present. Note that this code relies on the - * filesystem time for the years and does not use the years of - * the timecode. - */ - pp->nstages = nstart; - if (!clocktime(pp->day, pp->hour, pp->minute, pp->second, GMT, - pp->lastrec.l_ui, &pp->yearstart, &pp->lastref.l_ui)) - return (0); - if (pp->usec) { - TVUTOTSF(pp->usec, pp->lastref.l_uf); - } else { - MSUTOTSF(pp->msec, pp->lastref.l_uf); - } - - /* - * Subtract the receive timestamp from the timecode timestamp - * to form the raw offset. Insert in the median filter shift - * register. - */ - i = ((int)(pp->coderecv)) % pp->nstages; - offset = pp->lastref; - L_SUB(&offset, &pp->lastrec); - pp->filter[i] = offset; - if (pp->coderecv == 0) - for (i = 1; i < pp->nstages; i++) - pp->filter[i] = pp->filter[0]; - pp->coderecv++; - - /* - * Copy the raw offsets and sort into ascending order - */ - for (i = 0; i < pp->nstages; i++) - off[i] = pp->filter[i]; - qsort((char *)off, pp->nstages, sizeof(l_fp), refclock_cmpl_fp); - - /* - * Reject the furthest from the median of nstages samples until - * nskeep samples remain. - */ - i = 0; - n = pp->nstages; - while ((n - i) > nskeep) { - lftmp = off[n - 1]; - median = off[(n + i) / 2]; - L_SUB(&lftmp, &median); - L_SUB(&median, &off[i]); - if (L_ISHIS(&median, &lftmp)) { - /* reject low end */ - i++; - } else { - /* reject high end */ - n--; - } - } - - /* - * Compute the dispersion based on the difference between the - * extremes of the remaining offsets. Add to this the time since - * the last clock update, which represents the dispersion - * increase with time. We know that NTP_MAXSKEW is 16. If the - * sum is greater than the allowed sample dispersion, bail out. - * If the loop is unlocked, return the most recent offset; - * otherwise, return the median offset. In either case include - * the configured fudgetime1 adjustment. - */ - lftmp = off[n - 1]; - L_SUB(&lftmp, &off[i]); - disp = LFPTOFP(&lftmp) + current_time - pp->lasttime; - if (disp > REFCLOCKMAXDISPERSE) - return (0); - pp->offset = offset; - L_ADD(&pp->offset, &pp->fudgetime1); - pp->dispersion = disp; - return (1); -} - - -/* - * refclock_receive - simulate the receive and packet procedures - * - * This routine simulates the NTP receive and packet procedures for a - * reference clock. This provides a mechanism in which the ordinary NTP - * filter, selection and combining algorithms can be used to suppress - * misbehaving radios and to mitigate between them when more than one is - * available for backup. - */ -void -refclock_receive(peer, offset, delay, dispersion, reftime, rectime, leap) - struct peer *peer; /* peer structure pointer */ - l_fp *offset; /* computed offset (s) */ - s_fp delay; /* computed delay to peer */ - u_fp dispersion; /* computed dispersion to peer */ - l_fp *reftime; /* time at last clock update */ - l_fp *rectime; /* time at last peer update */ - int leap; /* synchronization/leap code */ -{ - int restrict; - int trustable; - u_fp precision; - - peer->received++; -#ifdef DEBUG - if (debug) - printf("refclock_receive: %s %s %s %s)\n", - ntoa(&peer->srcadr), lfptoa(offset, 6), - fptoa(delay, 5), ufptoa(dispersion, 5)); -#endif - - /* - * The authentication and access-control machinery works, but - * its utility may be questionable. - */ - restrict = restrictions(&peer->srcadr); - if (restrict & (RES_IGNORE|RES_DONTSERVE)) - return; - peer->processed++; - peer->timereceived = current_time; - if (restrict & RES_DONTTRUST) - trustable = 0; - else - trustable = 1; - - if (peer->flags & FLAG_AUTHENABLE) { - if (trustable) - peer->flags |= FLAG_AUTHENTIC; - else - peer->flags &= ~FLAG_AUTHENTIC; - } - peer->leap = leap; - - /* - * Set the timestamps. rec and org are in local time, while ref - * is in timecode time. - */ - peer->rec = peer->org = *rectime; - peer->reftime = *reftime; - - /* - * If the interface has been set to any_interface, set it to the - * loopback address if we have one. This is so that peers which - * are unreachable are easy to see in the peer display. - */ - if (peer->dstadr == any_interface && loopback_interface != 0) - peer->dstadr = loopback_interface; - - /* - * Set peer.pmode based on the hmode. For appearances only. - */ - switch (peer->hmode) { - - case MODE_ACTIVE: - peer->pmode = MODE_PASSIVE; - break; - - default: - peer->pmode = MODE_SERVER; - break; - } - - /* - * Abandon ship if the radio came bum. We only got this far - * in order to make pretty billboards, even if bum. - */ - if (leap == LEAP_NOTINSYNC) - return; - /* - * If this guy was previously unreachable, report him - * reachable. - */ - if (peer->reach == 0) report_event(EVNT_REACH, peer); - peer->reach |= 1; - - /* - * Give the data to the clock filter and update the clock. Note - * the clock reading precision initialized by the driver is - * added at this point. - */ - precision = FP_SECOND >> -(int)peer->precision; - if (precision == 0) - precision = 1; - refclock_report(peer, CEVNT_NOMINAL); - clock_filter(peer, offset, delay, dispersion + precision); - clock_update(peer); -} - - -/* - * refclock_gtlin - groom next input line and extract timestamp - * - * This routine processes the timecode received from the clock and - * removes the parity bit and control characters. If a timestamp is - * present in the timecode, as produced by the tty_clk line - * discipline/streams module, it returns that as the timestamp; - * otherwise, it returns the buffer timestamp. The routine return code - * is the number of characters in the line. - */ -int -refclock_gtlin(rbufp, lineptr, bmax, tsptr) - struct recvbuf *rbufp; /* receive buffer pointer */ - char *lineptr; /* current line pointer */ - int bmax; /* remaining characters in line */ - l_fp *tsptr; /* pointer to timestamp returned */ -{ - char *dpt, *dpend, *dp; - int i; - l_fp trtmp, tstmp; - char c; - - /* - * Check for the presence of a timestamp left by the tty_clock - * line discipline/streams module and, if present, use that - * instead of the buffer timestamp captured by the I/O routines. - * We recognize a timestamp by noting its value is earlier than - * the buffer timestamp, but not more than one second earlier. - */ - dpt = (char *)&rbufp->recv_space; - dpend = dpt + rbufp->recv_length; - trtmp = rbufp->recv_time; - if (dpend >= dpt + 8) { - if (buftvtots(dpend - 8, &tstmp)) { - L_SUB(&trtmp, &tstmp); - if (trtmp.l_ui == 0) { -#ifdef DEBUG - if (debug) { - printf( - "refclock_gtlin: fd %d ldisc %s", - rbufp->fd, - lfptoa(&trtmp, 6)); - gettstamp(&trtmp); - L_SUB(&trtmp, &tstmp); - printf(" sigio %s\n", - lfptoa(&trtmp, 6)); - } -#endif - dpend -= 8; - trtmp = tstmp; - } else - trtmp = rbufp->recv_time; - } - } - - /* - * Edit timecode to remove control chars. Don't monkey with the - * line buffer if the input buffer contains no ASCII printing - * characters. - */ - if (dpend - dpt > bmax - 1) - dpend = dpt + bmax - 1; - for (dp = lineptr; dpt < dpend; dpt++) { - c = *dpt & 0x7f; - if (c >= ' ') - *dp++ = c; - } - i = dp - lineptr; - if (i > 0) - *dp = '\0'; - -#ifdef DEBUG - if (debug) - printf("refclock_gtlin: fd %d time %s timecode %d %s\n", - rbufp->fd, ulfptoa(&trtmp, 6), i, lineptr); -#endif - *tsptr = trtmp; - return (i); -} - - -/* - * refclock_open - open serial port for reference clock - * - * This routine opens a serial port for I/O and sets default options. It - * returns the file descriptor if success and zero if failure. - */ -int -refclock_open(dev, speed, flags) - char *dev; /* device name pointer */ - int speed; /* serial port speed (code) */ - int flags; /* line discipline flags */ -{ - int fd; -#ifdef HAVE_TERMIOS - struct termios ttyb, *ttyp; -#endif /* HAVE_TERMIOS */ -#ifdef HAVE_SYSV_TTYS - struct termio ttyb, *ttyp; -#endif /* HAVE_SYSV_TTYS */ -#ifdef HAVE_BSD_TTYS - struct sgttyb ttyb, *ttyp; -#endif /* HAVE_BSD_TTYS */ -#ifdef HAVE_MODEM_CONTROL - u_long ltemp; -#endif /* HAVE_MODEM_CONTROL */ - - /* - * Open serial port and set default options - */ - fd = open(dev, O_RDWR, 0777); - if (fd == -1) { - syslog(LOG_ERR, "refclock_open: %s: %m", dev); - return (0); - } - - /* - * The following sections initialize the serial line port in - * canonical (line-oriented) mode and set the specified line - * speed, 8 bits and no parity. The modem control, break, erase - * and kill functions are normally disabled. There is a - * different section for each terminal interface, as selected at - * compile time. - */ - ttyp = &ttyb; -#ifdef HAVE_TERMIOS - - /* - * POSIX serial line parameters (termios interface) - */ - if (tcgetattr(fd, ttyp) < 0) { - syslog(LOG_ERR, - "refclock_open: fd %d tcgetattr %m", fd); - return (0); - } - - /* - * Set canonical mode and local connection; set specified speed, - * 8 bits and no parity; map CR to NL; ignore break. - */ - ttyp->c_iflag = IGNBRK | IGNPAR | ICRNL; - ttyp->c_oflag = 0; - ttyp->c_cflag = CS8 | CLOCAL | CREAD; - (void)cfsetispeed(&ttyb, speed); - (void)cfsetospeed(&ttyb, speed); - ttyp->c_lflag = ICANON; - ttyp->c_cc[VERASE] = ttyp->c_cc[VKILL] = '\0'; -#ifdef HAVE_MODEM_CONTROL - /* - * If we have modem control, check to see if modem leads are - * active; if so, set remote connection. This is necessary for - * the kernel pps mods to work. - */ - ltemp = 0; - if (ioctl(fd, TIOCMGET, (char *)<emp) < 0) - syslog(LOG_ERR, - "refclock_open: fd %d TIOCMGET %m", fd); -#if DEBUG - if (debug) - printf("refclock_open: fd %d modem status %lx\n", - fd, ltemp); -#endif - if (ltemp & TIOCM_DSR) - ttyp->c_cflag &= ~CLOCAL; -#endif /* HAVE_MODEM_CONTROL */ - if (tcsetattr(fd, TCSANOW, ttyp) < 0) { - syslog(LOG_ERR, - "refclock_open: fd %d tcsetattr %m", fd); - return (0); - } - if (tcflush(fd, TCIOFLUSH) < 0) { - syslog(LOG_ERR, - "refclock_open: fd %d tcflush %m", fd); - return (0); - } -#endif /* HAVE_TERMIOS */ - -#ifdef HAVE_SYSV_TTYS - - /* - * System V serial line parameters (termio interface) - * - */ - if (ioctl(fd, TCGETA, ttyp) < 0) { - syslog(LOG_ERR, - "refclock_open: fd %d TCGETA %m", fd); - return (0); - } - - /* - * Set canonical mode and local connection; set specified speed, - * 8 bits and no parity; map CR to NL; ignore break. - */ - ttyp->c_iflag = IGNBRK | IGNPAR | ICRNL; - ttyp->c_oflag = 0; - ttyp->c_cflag = speed | CS8 | CLOCAL | CREAD; - ttyp->c_lflag = ICANON; - ttyp->c_cc[VERASE] = ttyp->c_cc[VKILL] = '\0'; -#ifdef HAVE_MODEM_CONTROL - /* - * If we have modem control, check to see if modem leads are - * active; if so, set remote connection. This is necessary for - * the kernel pps mods to work. - */ - ltemp = 0; - if (ioctl(fd, TIOCMGET, (char *)<emp) < 0) - syslog(LOG_ERR, - "refclock_open: fd %d TIOCMGET %m", fd); -#if DEBUG - if (debug) - printf("refclock_open: fd %d modem status %lx\n", - fd, ltemp); -#endif - if (ltemp & TIOCM_DSR) - ttyp->c_cflag &= ~CLOCAL; -#endif /* HAVE_MODEM_CONTROL */ - if (ioctl(fd, TCSETA, ttyp) < 0) { - syslog(LOG_ERR, - "refclock_open: fd %d TCSETA %m", fd); - return (0); - } -#endif /* HAVE_SYSV_TTYS */ - -#ifdef HAVE_BSD_TTYS - - /* - * 4.3bsd serial line parameters (sgttyb interface) - */ - if (ioctl(fd, TIOCGETP, (char *)ttyp) < 0) { - syslog(LOG_ERR, - "refclock_open: fd %d TIOCGETP %m", fd); - return (0); - } - ttyp->sg_ispeed = ttyp->sg_ospeed = speed; - ttyp->sg_flags = EVENP | ODDP | CRMOD; - if (ioctl(fd, TIOCSETP, (char *)ttyp) < 0) { - syslog(LOG_ERR, - "refclock_open: TIOCSETP %m"); - return (0); - } -#endif /* HAVE_BSD_TTYS */ - - if (!refclock_ioctl(fd, flags)) { - (void)close(fd); - syslog(LOG_ERR, "refclock_open: fd %d ioctl fails", - fd); - return (0); - } - return (fd); -} - - -/* - * refclock_ioctl - set serial port control functions - * - * This routine attempts to hide the internal, system-specific details - * of serial ports. It can handle POSIX (termios), SYSV (termio) and BSD - * (sgtty) interfaces with varying degrees of success. The routine sets - * up the tty_clk, chu_clk and ppsclock streams module/line discipline, - * if compiled in the daemon and requested in the call. The routine - * returns one if success and zero if failure. - */ -int -refclock_ioctl(fd, flags) - int fd; /* file descriptor */ - int flags; /* line discipline flags */ -{ -#ifdef HAVE_TERMIOS - struct termios ttyb, *ttyp; -#endif /* HAVE_TERMIOS */ -#ifdef HAVE_SYSV_TTYS - struct termio ttyb, *ttyp; -#endif /* HAVE_SYSV_TTYS */ -#ifdef HAVE_BSD_TTYS - struct sgttyb ttyb, *ttyp; -#endif /* HAVE_BSD_TTYS */ - -#ifdef DEBUG - if (debug) - printf("refclock_ioctl: fd %d flags %x\n", - fd, flags); -#endif - - /* - * The following sections select optional features, such as - * modem control, line discipline and so forth. Some require - * specific operating system support in the form of streams - * modules, which can be loaded and unloaded at run time without - * rebooting the kernel, or line discipline modules, which must - * be compiled in the kernel. The streams modules require System - * V STREAMS support, while the line discipline modules require - * 4.3bsd or later. The checking frenzy is attenuated here, - * since the device is already open. - * - * Note that both the clk and ppsclock modules are optional; the - * dang thing still works, but the accuracy improvement using - * them will not be available. The ppsclock module is associated - * with a specific, declared line and should be used only once. - * If requested, the chu module is mandatory, since the driver - * will not work without it. - * - * Use the LDISC_PPS option ONLY with Sun baseboard ttya or - * ttyb. Using it with the SPIF multipexor crashes the kernel. - */ - if (flags == 0) - return (1); - -#if !(defined(HAVE_TERMIOS) || defined(HAVE_BSD_TTYS)) - if (flags & (LDISC_CLK | LDISC_CHU | LDISC_PPS | LDISC_ACTS)) - syslog(LOG_ERR, - "refclock_ioctl: unsupported terminal interface"); - return (0); -#endif /* HAVE_TERMIOS HAVE_BSD_TTYS */ - - ttyp = &ttyb; - -#ifdef STREAM -#ifdef CLK - - /* - * The CLK option provides timestamping at the driver level. - * It requires the tty_clk streams module and System V STREAMS - * support. - */ - if (flags & (LDISC_CLK | LDISC_CLKPPS | LDISC_ACTS)) { - if (ioctl(fd, I_PUSH, "clk") < 0) - syslog(LOG_NOTICE, - "refclock_ioctl: optional clk streams module unavailable"); - else { - char *str; - - if (flags & LDISC_PPS) - str = "\377"; - else if (flags & LDISC_ACTS) - str = "*"; - else - str = "\n"; - if (ioctl(fd, CLK_SETSTR, str) < 0) - syslog(LOG_ERR, - "refclock_ioctl: CLK_SETSTR %m"); - } - } - - /* - * The ACTS line discipline requires additional line-ending - * character '*'. - */ - if (flags & LDISC_ACTS) { - (void)tcgetattr(fd, ttyp); - ttyp->c_cc[VEOL] = '*'; - (void)tcsetattr(fd, TCSANOW, ttyp); - } -#else - if (flags & LDISC_CLK) - syslog(LOG_NOTICE, - "refclock_ioctl: optional clk streams module unsupported"); -#endif /* CLK */ -#ifdef CHU - - /* - * The CHU option provides timestamping and decoding for the CHU - * timecode. It requires the tty_chu streams module and System V - * STREAMS support. - */ - if (flags & LDISC_CHU) { - (void)tcgetattr(fd, ttyp); - ttyp->c_lflag = 0; - ttyp->c_cc[VERASE] = ttyp->c_cc[VKILL] = '\0'; - ttyp->c_cc[VMIN] = 1; - ttyp->c_cc[VTIME] = 0; - (void)tcsetattr(fd, TCSANOW, ttyp); - (void)tcflush(fd, TCIOFLUSH); - while (ioctl(fd, I_POP, 0) >= 0); - if (ioctl(fd, I_PUSH, "chu") < 0) { - syslog(LOG_ERR, - "refclock_ioctl: required chu streams module unavailable"); - return (0); - } - } -#else - if (flags & LDISC_CHU) { - syslog(LOG_ERR, - "refclock_ioctl: required chu streams module unsupported"); - return (0); - } -#endif /* CHU */ -#ifdef PPS - - /* - * The PPS option provides timestamping at the driver level. - * It uses a 1-pps signal and level converter (gadget box) and - * requires the ppsclock streams module and System V STREAMS - * support. - */ - if (flags & LDISC_PPS) { - if (fdpps != -1) { - syslog(LOG_ERR, - "refclock_ioctl: ppsclock already configured"); - return (0); - } - if (ioctl(fd, I_PUSH, "ppsclock") < 0) - syslog(LOG_NOTICE, - "refclock_ioctl: optional ppsclock streams module unavailable"); - else - fdpps = fd; - } -#else - if (flags & LDISC_PPS) - syslog(LOG_NOTICE, - "refclock_ioctl: optional ppsclock streams module unsupported"); -#endif /* PPS */ - -#else /* STREAM */ - -#ifdef HAVE_TERMIOS -#ifdef CLK - - /* - * The CLK option provides timestamping at the driver level. It - * requires the tty_clk line discipline and 4.3bsd or later. - */ - if (flags & (LDISC_CLK | LDISC_CLKPPS | LDISC_ACTS)) { - (void)tcgetattr(fd, ttyp); - ttyp->c_lflag = 0; - if (flags & LDISC_CLKPPS) - ttyp->c_cc[VERASE] = ttyp->c_cc[VKILL] = '\377'; - else if (flags & LDISC_ACTS) { - ttyp->c_cc[VERASE] = '*'; - ttyp->c_cc[VKILL] = '#'; - } else - ttyp->c_cc[VERASE] = ttyp->c_cc[VKILL] = '\n'; - ttyp->c_cc[VMIN] = 1; - ttyp->c_cc[VTIME] = 0; - ttyp->c_line = CLKLDISC; - (void)tcsetattr(fd, TCSANOW, ttyp); - (void)tcflush(fd, TCIOFLUSH); - } -#else - if (flags & LDISC_CLK) - syslog(LOG_NOTICE, - "refclock_ioctl: optional clk line discipline unsupported"); -#endif /* CLK */ -#ifdef CHU - /* - * The CHU option provides timestamping and decoding for the CHU - * timecode. It requires the tty_chu line disciplne and 4.3bsd - * or later. - */ - if (flags & LDISC_CHU) { - (void)tcgetattr(fd, ttyp); - ttyp->c_lflag = 0; - ttyp->c_cc[VERASE] = ttyp->c_cc[VKILL] = '\r'; - ttyp->c_cc[VMIN] = 1; - ttyp->c_cc[VTIME] = 0; - ttyp->c_line = CHULDISC; - (void)tcsetattr(fd, TCSANOW, ttyp) < 0); - (void)tcflush(fd, TCIOFLUSH); - } -#else - if (flags & LDISC_CHU) { - syslog(LOG_ERR, - "refclock_ioctl: required chu line discipline unsupported"); - return (0); - } -#endif /* CHU */ -#endif /* HAVE_TERMIOS */ - -#ifdef HAVE_BSD_TTYS -#ifdef CLK - - /* - * The CLK option provides timestamping at the driver level. It - * requires the tty_clk line discipline and 4.3bsd or later. - */ - if (flags & (LDISC_CLK | LDISC_CLKPPS | LDISC_ACTS)) { - int ldisc = CLKLDISC; - - (void)ioctl(fd, TIOCGETP, (char *)ttyp); - if (flags & LDISC_CLKPPS) - ttyp->sg_erase = ttyp->sg_kill = '\377'; - else if (flags & LDISC_ACTS) { - ttyp->sg_erase = '*'; - ttyp->sg_kill = '#'; - } else - ttyp->sg_erase = ttyp->sg_kill = '\r'; - ttyp->sg_flags = RAW; - (void)ioctl(fd, TIOCSETP, ttyp); - if (ioctl(fd, TIOCSETD, (char *)&ldisc) < 0) - syslog(LOG_NOTICE, - "refclock_ioctl: optional clk line discipline unavailable"); - } -#else - if (flags & LDISC_CLK) - syslog(LOG_NOTICE, - "refclock_ioctl: optional clk line discipline unsupported"); - -#endif /* CLK */ -#ifdef CHU - - /* - * The CHU option provides timestamping and decoding for the CHU - * timecode. It requires the tty_chu line disciplne and 4.3bsd - * or later. - */ - if (flags & LDISC_CHU) { - int ldisc = CHULDISC; - - (void)ioctl(fd, TIOCGETP, (char *)ttyp); - ttyp->sg_erase = ttyp->sg_kill = '\r'; - ttyp->sg_flags = RAW; - (void)ioctl(fd, TIOCSETP, (char *)ttyp); - if (ioctl(fd, TIOCSETD, (char *)&ldisc) < 0) { - syslog(LOG_ERR, - "refclock_ioctl: required chu line discipline unavailable"); - return (0); - } - } -#else - if (flags & LDISC_CHU) { - syslog(LOG_ERR, - "refclock_ioctl: required chu line discipline unsupported"); - return (0); - } -#endif /* CHU */ -#endif /* HAVE_BSD_TTYS */ - -#endif /* STREAM */ - - return (1); -} - - -/* - * refclock_control - set and/or return clock values - * - * This routine is used mainly for debugging. It returns designated - * values from the interface structure that can be displayed using - * xntpdc and the clockstat command. It can also be used to initialize - * configuration variables, such as fudgetimes, fudgevalues, reference - * ID and stratum. - */ -void -refclock_control(srcadr, in, out) - struct sockaddr_in *srcadr; - struct refclockstat *in; - struct refclockstat *out; -{ - struct peer *peer; - struct refclockproc *pp; - u_char clktype; - int unit; - - /* - * Check for valid address and running peer - */ - if (!ISREFCLOCKADR(srcadr)) - return; - clktype = REFCLOCKTYPE(srcadr); - unit = REFCLOCKUNIT(srcadr); - if (clktype >= num_refclock_conf || unit > MAXUNIT) - return; - if (!(peer = typeunit[clktype][unit])) - return; - pp = peer->procptr; - - /* - * Initialize requested data - */ - if (in != 0) { - if (in->haveflags & CLK_HAVETIME1) - pp->fudgetime1 = in->fudgetime1; - if (in->haveflags & CLK_HAVETIME2) - pp->fudgetime2 = in->fudgetime2; - if (in->haveflags & CLK_HAVEVAL1) - peer->stratum = in->fudgeval1; - if (in->haveflags & CLK_HAVEVAL2) - pp->refid = in->fudgeval2; - if (peer->stratum <= 1) - peer->refid = pp->refid; - else - peer->refid = peer->srcadr.sin_addr.s_addr; - if (in->haveflags & CLK_HAVEFLAG1) { - pp->sloppyclockflag &= ~CLK_FLAG1; - pp->sloppyclockflag |= in->flags & CLK_FLAG1; - } - if (in->haveflags & CLK_HAVEFLAG2) { - pp->sloppyclockflag &= ~CLK_FLAG2; - pp->sloppyclockflag |= in->flags & CLK_FLAG2; - } - if (in->haveflags & CLK_HAVEFLAG3) { - pp->sloppyclockflag &= ~CLK_FLAG3; - pp->sloppyclockflag |= in->flags & CLK_FLAG3; - } - if (in->haveflags & CLK_HAVEFLAG4) { - pp->sloppyclockflag &= ~CLK_FLAG4; - pp->sloppyclockflag |= in->flags & CLK_FLAG4; - } - if (in->flags & CLK_FLAG3) - (void)refclock_ioctl(pp->io.fd, LDISC_PPS); - } - - /* - * Readback requested data - */ - if (out != 0) { - out->haveflags = CLK_HAVETIME1 | CLK_HAVEVAL1 | - CLK_HAVEVAL2 | CLK_HAVEFLAG4; - out->fudgetime1 = pp->fudgetime1; - out->fudgetime2 = pp->fudgetime2; - out->fudgeval1 = peer->stratum; - out->fudgeval2 = pp->refid; - out->flags = pp->sloppyclockflag; - - out->timereset = current_time - pp->timestarted; - out->polls = pp->polls; - out->noresponse = pp->noreply; - out->badformat = pp->badformat; - out->baddata = pp->baddata; - - out->lastevent = pp->lastevent; - out->currentstatus = pp->currentstatus; - out->type = pp->type; - out->clockdesc = pp->clockdesc; - out->lencode = pp->lencode; - out->lastcode = pp->lastcode; - } - - /* - * Give the stuff to the clock - */ - if (refclock_conf[clktype]->clock_control != noentry) - (refclock_conf[clktype]->clock_control)(unit, in, out); -} - - -/* - * refclock_buginfo - return debugging info - * - * This routine is used mainly for debugging. It returns designated - * values from the interface structure that can be displayed using - * xntpdc and the clkbug command. - */ -void -refclock_buginfo(srcadr, bug) - struct sockaddr_in *srcadr; /* clock address */ - struct refclockbug *bug; /* output structure */ -{ - struct peer *peer; - struct refclockproc *pp; - u_char clktype; - int unit; - int i; - - /* - * Check for valid address and peer structure - */ - if (!ISREFCLOCKADR(srcadr)) - return; - clktype = REFCLOCKTYPE(srcadr); - unit = REFCLOCKUNIT(srcadr); - if (clktype >= num_refclock_conf || unit > MAXUNIT) - return; - if (!(peer = typeunit[clktype][unit])) - return; - pp = peer->procptr; - - /* - * Copy structure values - */ - bug->nvalues = 8; - bug->values[0] = pp->year; - bug->values[1] = pp->day; - bug->values[2] = pp->hour; - bug->values[3] = pp->minute; - bug->values[4] = pp->second; - bug->values[5] = pp->msec; - bug->values[6] = pp->yearstart; - bug->values[7] = pp->coderecv; - - bug->ntimes = pp->nstages + 3; - if (bug->ntimes > NCLKBUGTIMES) - bug->ntimes = NCLKBUGTIMES; - bug->stimes = 0xfffffffc; - bug->times[0] = pp->lastref; - bug->times[1] = pp->lastrec; - UFPTOLFP(pp->dispersion, &bug->times[2]); - for (i = 0; i < bug->ntimes; i++) - bug->times[i + 3] = pp->filter[i]; - - /* - * Give the stuff to the clock - */ - if (refclock_conf[clktype]->clock_buginfo != noentry) - (refclock_conf[clktype]->clock_buginfo)(unit, bug); -} - -#endif /* REFCLOCK */ diff --git a/usr.sbin/xntpd/xntpd/ntp_request.c b/usr.sbin/xntpd/xntpd/ntp_request.c deleted file mode 100644 index 9f58d2259fbd..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_request.c +++ /dev/null @@ -1,2453 +0,0 @@ -/* - * ntp_request.c - respond to information requests - */ -#include <sys/types.h> -#include <stdio.h> -#include <errno.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "signal.h" -#include "ntp_request.h" -#include "ntp_control.h" -#include "ntp_refclock.h" -#include "ntp_if.h" -#include "ntp_stdlib.h" - -#ifdef KERNEL_PLL -#ifdef HAVE_SYS_TIMEX_H -#include <sys/timex.h> -#else -#include "sys/timex.h" -#endif - -#ifndef NTP_SYSCALLS_LIBC -#define ntp_gettime(t) syscall(SYS_ntp_gettime, (t)) -#define ntp_adjtime(t) syscall(SYS_ntp_adjtime, (t)) -#endif -#endif /* KERNEL_PLL */ - -/* - * Structure to hold request procedure information - */ -#define NOAUTH 0 -#define AUTH 1 - -#define NO_REQUEST (-1) - -struct req_proc { - short request_code; /* defined request code */ - short needs_auth; /* true when authentication needed */ - short sizeofitem; /* size of request data item */ - void (*handler)(); /* routine to handle request */ -}; - -/* - * Universal request codes - */ -static struct req_proc univ_codes[] = { - { NO_REQUEST, NOAUTH, 0, 0 } -}; - -static void req_ack P((struct sockaddr_in *, struct interface *, struct req_pkt *, int)); -static char * prepare_pkt P((struct sockaddr_in *, struct interface *, struct req_pkt *, u_int)); -static char * more_pkt P((void)); -static void flush_pkt P((void)); -static void peer_list P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void peer_list_sum P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void peer_info P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void peer_stats P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void sys_info P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void sys_stats P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void mem_stats P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void io_stats P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void timer_stats P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void loop_info P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void do_conf P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void do_unconf P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void set_sys_flag P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void clr_sys_flag P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void setclr_flags P((struct sockaddr_in *, struct interface *, struct req_pkt *, u_long)); -static void do_monitor P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void do_nomonitor P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void list_restrict P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void do_resaddflags P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void do_ressubflags P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void do_unrestrict P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void do_restrict P((struct sockaddr_in *, struct interface *, struct req_pkt *, int)); -static void mon_getlist_0 P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void mon_getlist_1 P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void reset_stats P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void reset_peer P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void do_key_reread P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void do_dirty_hack P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void dont_dirty_hack P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void trust_key P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void untrust_key P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void do_trustkey P((struct sockaddr_in *, struct interface *, struct req_pkt *, int)); -static void get_auth_info P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void reset_auth_stats P((void)); -static void req_get_traps P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void req_set_trap P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void req_clr_trap P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void do_setclr_trap P((struct sockaddr_in *, struct interface *, struct req_pkt *, int)); -static void set_request_keyid P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void set_control_keyid P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void get_ctl_stats P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void get_leap_info P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -#ifdef KERNEL_PLL -static void get_kernel_info P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -#endif /* KERNEL_PLL */ -#ifdef REFCLOCK -static void get_clock_info P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -static void set_clock_fudge P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -#endif /* REFCLOCK */ -static void set_precision P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -#ifdef REFCLOCK -static void get_clkbug_info P((struct sockaddr_in *, struct interface *, struct req_pkt *)); -#endif /* REFCLOCK */ - -/* - * Xntpd request codes - */ -static struct req_proc xntp_codes[] = { - { REQ_PEER_LIST, NOAUTH, 0, peer_list }, - { REQ_PEER_LIST_SUM, NOAUTH, 0, peer_list_sum }, - { REQ_PEER_INFO, NOAUTH, sizeof(struct info_peer_list), peer_info }, - { REQ_PEER_STATS, NOAUTH, sizeof(struct info_peer_list), peer_stats }, - { REQ_SYS_INFO, NOAUTH, 0, sys_info }, - { REQ_SYS_STATS, NOAUTH, 0, sys_stats }, - { REQ_IO_STATS, NOAUTH, 0, io_stats }, - { REQ_MEM_STATS, NOAUTH, 0, mem_stats }, - { REQ_LOOP_INFO, NOAUTH, 0, loop_info }, - { REQ_TIMER_STATS, NOAUTH, 0, timer_stats }, - { REQ_CONFIG, AUTH, sizeof(struct conf_peer), do_conf }, - { REQ_UNCONFIG, AUTH, sizeof(struct conf_unpeer), do_unconf }, - { REQ_SET_SYS_FLAG, AUTH, sizeof(struct conf_sys_flags), set_sys_flag }, - { REQ_CLR_SYS_FLAG, AUTH, sizeof(struct conf_sys_flags), clr_sys_flag }, - { REQ_MONITOR, AUTH, 0, do_monitor }, - { REQ_NOMONITOR, AUTH, 0, do_nomonitor }, - { REQ_GET_RESTRICT, NOAUTH, 0, list_restrict }, - { REQ_RESADDFLAGS, AUTH, sizeof(struct conf_restrict), do_resaddflags }, - { REQ_RESSUBFLAGS, AUTH, sizeof(struct conf_restrict), do_ressubflags }, - { REQ_UNRESTRICT, AUTH, sizeof(struct conf_restrict), do_unrestrict }, - { REQ_MON_GETLIST, NOAUTH, 0, mon_getlist_0 }, - { REQ_MON_GETLIST_1, NOAUTH, 0, mon_getlist_1 }, - { REQ_RESET_STATS, AUTH, sizeof(struct reset_flags), reset_stats }, - { REQ_RESET_PEER, AUTH, sizeof(struct conf_unpeer), reset_peer }, - { REQ_REREAD_KEYS, AUTH, 0, do_key_reread }, - { REQ_DO_DIRTY_HACK, AUTH, 0, do_dirty_hack }, - { REQ_DONT_DIRTY_HACK, AUTH, 0, dont_dirty_hack }, - { REQ_TRUSTKEY, AUTH, sizeof(u_long), trust_key }, - { REQ_UNTRUSTKEY, AUTH, sizeof(u_long), untrust_key }, - { REQ_AUTHINFO, NOAUTH, 0, get_auth_info }, - { REQ_TRAPS, NOAUTH, 0, req_get_traps }, - { REQ_ADD_TRAP, AUTH, sizeof(struct conf_trap), req_set_trap }, - { REQ_CLR_TRAP, AUTH, sizeof(struct conf_trap), req_clr_trap }, - { REQ_REQUEST_KEY, AUTH, sizeof(u_long), set_request_keyid }, - { REQ_CONTROL_KEY, AUTH, sizeof(u_long), set_control_keyid }, - { REQ_GET_CTLSTATS, NOAUTH, 0, get_ctl_stats }, - { REQ_GET_LEAPINFO, NOAUTH, 0, get_leap_info }, - { REQ_SET_PRECISION, AUTH, sizeof(long), set_precision }, -#ifdef KERNEL_PLL - { REQ_GET_KERNEL, NOAUTH, 0, get_kernel_info }, -#endif /* KERNEL_PLL */ -#ifdef REFCLOCK - { REQ_GET_CLOCKINFO, NOAUTH, sizeof(U_LONG), get_clock_info }, - { REQ_SET_CLKFUDGE, AUTH, sizeof(struct conf_fudge), set_clock_fudge }, - { REQ_GET_CLKBUGINFO, NOAUTH, sizeof(U_LONG), get_clkbug_info }, -#endif - { NO_REQUEST, NOAUTH, 0, 0 } -}; - - -/* - * Authentication keyid used to authenticate requests. Zero means we - * don't allow writing anything. - */ -u_long info_auth_keyid; - - -/* - * Statistic counters to keep track of requests and responses. - */ -u_long numrequests; /* number of requests we've received */ -u_long numresppkts; /* number of resp packets sent with data */ - -u_long errorcounter[INFO_ERR_AUTH+1]; /* lazy way to count errors, indexed */ - /* by the error code */ - -#if defined(KERNEL_PLL) && !defined(NTP_SYSCALLS_LIBC) -extern int syscall P((int, void *, ...)); -#endif /* KERNEL_PLL */ - -/* - * Imported from the I/O module - */ -extern struct interface *any_interface; - -/* - * Imported from the main routines - */ -extern int debug; - -/* - * Imported from the timer module - */ -extern u_long current_time; - -/* - * Imported from ntp_loopfilter.c - */ -extern int pll_control; -extern int pll_enable; -extern int pps_control; - -/* - * Imported from ntp_monitor.c - */ -extern int mon_enabled; - -/* - * Imported from ntp_util.c - */ -extern int stats_control; - -extern struct peer *peer_hash[]; -extern struct peer *sys_peer; - -/* - * A hack. To keep the authentication module clear of xntp-ism's, we - * include a time reset variable for its stats here. - */ -static u_long auth_timereset; - -/* - * Response packet used by these routines. Also some state information - * so that we can handle packet formatting within a common set of - * subroutines. Note we try to enter data in place whenever possible, - * but the need to set the more bit correctly means we occasionally - * use the extra buffer and copy. - */ -static struct resp_pkt rpkt; -static int seqno; -static int nitems; -static int itemsize; -static int databytes; -static char exbuf[RESP_DATA_SIZE]; -static int usingexbuf; -static struct sockaddr_in *toaddr; -static struct interface *frominter; - -/* - * init_request - initialize request data - */ -void -init_request() -{ - int i; - - numrequests = 0; - numresppkts = 0; - auth_timereset = 0; - info_auth_keyid = 0; /* by default, can't do this */ - - for (i = 0; i < sizeof(errorcounter)/sizeof(errorcounter[0]); i++) - errorcounter[i] = 0; -} - - -/* - * req_ack - acknowledge request with no data - */ -static void -req_ack(srcadr, inter, inpkt, errcode) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; - int errcode; -{ - /* - * fill in the fields - */ - rpkt.rm_vn_mode = RM_VN_MODE(RESP_BIT, 0); - rpkt.auth_seq = AUTH_SEQ(0, 0); - rpkt.implementation = inpkt->implementation; - rpkt.request = inpkt->request; - rpkt.err_nitems = ERR_NITEMS(errcode, 0); - rpkt.mbz_itemsize = MBZ_ITEMSIZE(0); - - /* - * send packet and bump counters - */ - sendpkt(srcadr, inter, -1, (struct pkt *)&rpkt, RESP_HEADER_SIZE); - errorcounter[errcode]++; -} - - -/* - * prepare_pkt - prepare response packet for transmission, return pointer - * to storage for data item. - */ -static char * -prepare_pkt(srcadr, inter, pkt, structsize) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *pkt; - u_int structsize; -{ -#ifdef DEBUG - if (debug > 3) - printf("request: preparing pkt\n"); -#endif - - /* - * Fill in the implementation, reqest and itemsize fields - * since these won't change. - */ - rpkt.implementation = pkt->implementation; - rpkt.request = pkt->request; - rpkt.mbz_itemsize = MBZ_ITEMSIZE(structsize); - - /* - * Compute the static data needed to carry on. - */ - toaddr = srcadr; - frominter = inter; - seqno = 0; - nitems = 0; - itemsize = structsize; - databytes = 0; - usingexbuf = 0; - - /* - * return the beginning of the packet buffer. - */ - return &rpkt.data[0]; -} - - -/* - * more_pkt - return a data pointer for a new item. - */ -static char * -more_pkt() -{ - /* - * If we were using the extra buffer, send the packet. - */ - if (usingexbuf) { -#ifdef DEBUG - if (debug > 2) - printf("request: sending pkt\n"); -#endif - rpkt.rm_vn_mode = RM_VN_MODE(RESP_BIT, MORE_BIT); - rpkt.auth_seq = AUTH_SEQ(0, seqno); - rpkt.err_nitems = htons((u_short)nitems); - sendpkt(toaddr, frominter, -1, (struct pkt *)&rpkt, - RESP_HEADER_SIZE+databytes); - numresppkts++; - - /* - * Copy data out of exbuf into the packet. - */ - memmove(&rpkt.data[0], exbuf, itemsize); - seqno++; - databytes = 0; - nitems = 0; - usingexbuf = 0; - } - - databytes += itemsize; - nitems++; - if (databytes + itemsize <= RESP_DATA_SIZE) { -#ifdef DEBUG - if (debug > 3) - printf("request: giving him more data\n"); -#endif - /* - * More room in packet. Give him the - * next address. - */ - return &rpkt.data[databytes]; - } else { - /* - * No room in packet. Give him the extra - * buffer unless this was the last in the sequence. - */ -#ifdef DEBUG - if (debug > 3) - printf("request: into extra buffer\n"); -#endif - if (seqno == MAXSEQ) - return (char *)0; - else { - usingexbuf = 1; - return exbuf; - } - } -} - - -/* - * flush_pkt - we're done, return remaining information. - */ -static void -flush_pkt() -{ -#ifdef DEBUG - if (debug > 2) - printf("request: flushing packet, %d items\n", nitems); -#endif - /* - * Must send the last packet. If nothing in here and nothing - * has been sent, send an error saying no data to be found. - */ - if (seqno == 0 && nitems == 0) - req_ack(toaddr, frominter, (struct req_pkt *)&rpkt, - INFO_ERR_NODATA); - else { - rpkt.rm_vn_mode = RM_VN_MODE(RESP_BIT, 0); - rpkt.auth_seq = AUTH_SEQ(0, seqno); - rpkt.err_nitems = htons((u_short)nitems); - sendpkt(toaddr, frominter, -1, (struct pkt *)&rpkt, - RESP_HEADER_SIZE+databytes); - numresppkts++; - } -} - - - -/* - * process_private - process private mode (7) packets - */ -void -process_private(rbufp, mod_okay) - struct recvbuf *rbufp; - int mod_okay; -{ - struct req_pkt *inpkt; - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_proc *proc; - - /* - * Initialize pointers, for convenience - */ - inpkt = (struct req_pkt *)&rbufp->recv_pkt; - srcadr = &rbufp->recv_srcadr; - inter = rbufp->dstadr; - -#ifdef DEBUG - if (debug > 2) - printf("prepare_pkt: impl %d req %d\n", - inpkt->implementation, inpkt->request); -#endif - - /* - * Do some sanity checks on the packet. Return a format - * error if it fails. - */ - if (ISRESPONSE(inpkt->rm_vn_mode) - || ISMORE(inpkt->rm_vn_mode) - || INFO_VERSION(inpkt->rm_vn_mode) > NTP_VERSION - || INFO_VERSION(inpkt->rm_vn_mode) < NTP_OLDVERSION - || INFO_SEQ(inpkt->auth_seq) != 0 - || INFO_ERR(inpkt->err_nitems) != 0 - || INFO_MBZ(inpkt->mbz_itemsize) != 0 - || rbufp->recv_length > REQ_LEN_MAC - || rbufp->recv_length < REQ_LEN_NOMAC) { - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - - - /* - * Get the appropriate procedure list to search. - */ - if (inpkt->implementation == IMPL_UNIV) - proc = univ_codes; - else if (inpkt->implementation == IMPL_XNTPD) - proc = xntp_codes; - else { - req_ack(srcadr, inter, inpkt, INFO_ERR_IMPL); - return; - } - - - /* - * Search the list for the request codes. If it isn't one - * we know, return an error. - */ - while (proc->request_code != NO_REQUEST) { - if (proc->request_code == (short) inpkt->request) - break; - proc++; - } - if (proc->request_code == NO_REQUEST) { - req_ack(srcadr, inter, inpkt, INFO_ERR_REQ); - return; - } - -#ifdef DEBUG - if (debug > 3) - printf("found request in tables\n"); -#endif - - /* - * If we need to authenticate, do so. Note that an - * authenticatable packet must include a mac field, must - * have used key info_auth_keyid and must have included - * a time stamp in the appropriate field. The time stamp - * must be within INFO_TS_MAXSKEW of the receive - * time stamp. - */ - if (proc->needs_auth) { - l_fp ftmp; - - /* - * If this guy is restricted from doing this, don't let him - * If wrong key was used, or packet doesn't have mac, return. - */ - if (!INFO_IS_AUTH(inpkt->auth_seq) || info_auth_keyid == 0 - || ntohl(inpkt->keyid) != info_auth_keyid) { -#ifdef DEBUG - if (debug > 4) - printf( - "failed auth %d info_auth_keyid %lu pkt keyid %u\n", - INFO_IS_AUTH(inpkt->auth_seq), - info_auth_keyid, ntohl(inpkt->keyid)); -#endif - req_ack(srcadr, inter, inpkt, INFO_ERR_AUTH); - return; - } - if (rbufp->recv_length > REQ_LEN_MAC) { -#ifdef DEBUG - if (debug > 4) - printf("bad pkt length %d\n", - rbufp->recv_length); -#endif - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - if (!mod_okay || !authhavekey(info_auth_keyid)) { -#ifdef DEBUG - if (debug > 4) - printf("failed auth mod_okay %d\n", mod_okay); -#endif - req_ack(srcadr, inter, inpkt, INFO_ERR_AUTH); - return; - } - - /* - * calculate absolute time difference between xmit time stamp - * and receive time stamp. If too large, too bad. - */ - NTOHL_FP(&inpkt->tstamp, &ftmp); - L_SUB(&ftmp, &rbufp->recv_time); - if (L_ISNEG(&ftmp)) - L_NEG(&ftmp); - - if (ftmp.l_ui >= INFO_TS_MAXSKEW_UI) { - /* - * He's a loser. Tell him. - */ - req_ack(srcadr, inter, inpkt, INFO_ERR_AUTH); - return; - } - - /* - * So far so good. See if decryption works out okay. - */ - if (!authdecrypt(info_auth_keyid, (U_LONG *)inpkt, - REQ_LEN_NOMAC)) { - req_ack(srcadr, inter, inpkt, INFO_ERR_AUTH); - return; - } - } - - /* - * If we need data, check to see if we have some. If we - * don't, check to see that there is none (picky, picky). - */ - if (INFO_ITEMSIZE(inpkt->mbz_itemsize) != proc->sizeofitem) { - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - if (proc->sizeofitem != 0) - if (proc->sizeofitem*INFO_NITEMS(inpkt->err_nitems) - > sizeof(inpkt->data)) { - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - -#ifdef DEBUG - if (debug > 3) - printf("process_private: all okay, into handler\n"); -#endif - - /* - * Packet is okay. Call the handler to send him data. - */ - (proc->handler)(srcadr, inter, inpkt); -} - - -/* - * peer_list - send a list of the peers - */ -static void -peer_list(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_peer_list *ip; - register struct peer *pp; - register int i; - - ip = (struct info_peer_list *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_peer_list)); - for (i = 0; i < HASH_SIZE && ip != 0; i++) { - pp = peer_hash[i]; - while (pp != 0 && ip != 0) { - ip->address = pp->srcadr.sin_addr.s_addr; - ip->port = pp->srcadr.sin_port; - ip->hmode = pp->hmode; - ip->flags = 0; - if (pp->flags & FLAG_CONFIG) - ip->flags |= INFO_FLAG_CONFIG; - if (pp == sys_peer) - ip->flags |= INFO_FLAG_SYSPEER; - if (pp->candidate != 0) - ip->flags |= INFO_FLAG_SEL_CANDIDATE; - if (pp->select != 0) - ip->flags |= INFO_FLAG_SHORTLIST; - ip = (struct info_peer_list *)more_pkt(); - pp = pp->next; - } - } - flush_pkt(); -} - - -/* - * peer_list_sum - return extended peer list - */ -static void -peer_list_sum(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_peer_summary *ips; - register struct peer *pp; - register int i; - -#ifdef DEBUG - if (debug > 2) - printf("wants peer list summary\n"); -#endif - - ips = (struct info_peer_summary *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_peer_summary)); - for (i = 0; i < HASH_SIZE && ips != 0; i++) { - pp = peer_hash[i]; - while (pp != 0 && ips != 0) { -#ifdef DEBUG - if (debug > 3) - printf("sum: got one\n"); -#endif - ips->dstadr = (pp->processed) ? - pp->cast_flags == MDF_BCAST ? - pp->dstadr->bcast.sin_addr.s_addr: - pp->cast_flags ? - pp->dstadr->sin.sin_addr.s_addr ? - pp->dstadr->sin.sin_addr.s_addr: - pp->dstadr->bcast.sin_addr.s_addr: - 1 : 5; - ips->srcadr = pp->srcadr.sin_addr.s_addr; - ips->srcport = pp->srcadr.sin_port; - ips->stratum = pp->stratum; - ips->hpoll = pp->hpoll; - ips->ppoll = pp->ppoll; - ips->reach = pp->reach; - ips->flags = 0; - if (pp == sys_peer) - ips->flags |= INFO_FLAG_SYSPEER; - if (pp->flags & FLAG_CONFIG) - ips->flags |= INFO_FLAG_CONFIG; - if (pp->flags & FLAG_REFCLOCK) - ips->flags |= INFO_FLAG_REFCLOCK; - if (pp->flags & FLAG_AUTHENABLE) - ips->flags |= INFO_FLAG_AUTHENABLE; - if (pp->flags & FLAG_PREFER) - ips->flags |= INFO_FLAG_PREFER; - if (pp->candidate != 0) - ips->flags |= INFO_FLAG_SEL_CANDIDATE; - if (pp->select != 0) - ips->flags |= INFO_FLAG_SHORTLIST; - ips->hmode = pp->hmode; - ips->delay = HTONS_FP(pp->delay); - HTONL_FP(&pp->offset, &ips->offset); - ips->dispersion = HTONS_FP(pp->dispersion); - - pp = pp->next; - ips = (struct info_peer_summary *)more_pkt(); - } - } - flush_pkt(); -} - - -/* - * peer_info - send information for one or more peers - */ -static void -peer_info (srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_peer_list *ipl; - register struct peer *pp; - register struct info_peer *ip; - register int items; - register int i, j; - struct sockaddr_in addr; - extern struct peer *sys_peer; - - memset((char *)&addr, 0, sizeof addr); - addr.sin_family = AF_INET; - items = INFO_NITEMS(inpkt->err_nitems); - ipl = (struct info_peer_list *) inpkt->data; - ip = (struct info_peer *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_peer)); - while (items-- > 0 && ip != 0) { - addr.sin_port = ipl->port; - addr.sin_addr.s_addr = ipl->address; - ipl++; - if ((pp = findexistingpeer(&addr, (struct peer *)0)) == 0) - continue; - ip->dstadr = (pp->processed) ? - pp->cast_flags == MDF_BCAST ? - pp->dstadr->bcast.sin_addr.s_addr: - pp->cast_flags ? - pp->dstadr->sin.sin_addr.s_addr ? - pp->dstadr->sin.sin_addr.s_addr: - pp->dstadr->bcast.sin_addr.s_addr: - 2 : 6; - ip->srcadr = NSRCADR(&pp->srcadr); - ip->srcport = NSRCPORT(&pp->srcadr); - ip->flags = 0; - if (pp == sys_peer) - ip->flags |= INFO_FLAG_SYSPEER; - if (pp->flags & FLAG_CONFIG) - ip->flags |= INFO_FLAG_CONFIG; - if (pp->flags & FLAG_REFCLOCK) - ip->flags |= INFO_FLAG_REFCLOCK; - if (pp->flags & FLAG_AUTHENABLE) - ip->flags |= INFO_FLAG_AUTHENABLE; - if (pp->flags & FLAG_PREFER) - ip->flags |= INFO_FLAG_PREFER; - if (pp->candidate != 0) - ip->flags |= INFO_FLAG_SEL_CANDIDATE; - if (pp->select != 0) - ip->flags |= INFO_FLAG_SHORTLIST; - ip->leap = pp->leap; - ip->hmode = pp->hmode; - ip->keyid = pp->keyid; - ip->pkeyid = pp->pkeyid; - ip->stratum = pp->stratum; - ip->ppoll = pp->ppoll; - ip->hpoll = pp->hpoll; - ip->precision = pp->precision; - ip->version = pp->version; - ip->valid = pp->valid; - ip->reach = pp->reach; - ip->unreach = pp->unreach; - ip->flash = pp->flash; - ip->estbdelay = HTONS_FP(pp->estbdelay); - ip->ttl = pp->ttl; - ip->associd = htons(pp->associd); - ip->rootdelay = HTONS_FP(pp->rootdelay); - ip->rootdispersion = HTONS_FP(pp->rootdispersion); - ip->refid = pp->refid; - ip->timer = htonl(pp->event_timer.event_time - current_time); - HTONL_FP(&pp->reftime, &ip->reftime); - HTONL_FP(&pp->org, &ip->org); - HTONL_FP(&pp->rec, &ip->rec); - HTONL_FP(&pp->xmt, &ip->xmt); - j = pp->filter_nextpt - 1; - for (i = 0; i < NTP_SHIFT; i++, j--) { - if (j < 0) - j = NTP_SHIFT-1; - ip->filtdelay[i] = HTONS_FP(pp->filter_delay[j]); - HTONL_FP(&pp->filter_offset[j], &ip->filtoffset[i]); - ip->order[i] = (pp->filter_nextpt+NTP_SHIFT-1) - - pp->filter_order[i]; - if (ip->order[i] >= NTP_SHIFT) - ip->order[i] -= NTP_SHIFT; - } - HTONL_FP(&pp->offset, &ip->offset); - ip->delay = HTONS_FP(pp->delay); - ip->dispersion = HTONS_FP(pp->dispersion); - ip->selectdisp = HTONS_FP(pp->selectdisp); - ip = (struct info_peer *)more_pkt(); - } - flush_pkt(); -} - - -/* - * peer_stats - send statistics for one or more peers - */ -static void -peer_stats (srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_peer_list *ipl; - register struct peer *pp; - register struct info_peer_stats *ip; - register int items; - struct sockaddr_in addr; - extern struct peer *sys_peer; - - memset((char *)&addr, 0, sizeof addr); - addr.sin_family = AF_INET; - items = INFO_NITEMS(inpkt->err_nitems); - ipl = (struct info_peer_list *) inpkt->data; - ip = (struct info_peer_stats *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_peer_stats)); - while (items-- > 0 && ip != 0) { - addr.sin_port = ipl->port; - addr.sin_addr.s_addr = ipl->address; - ipl++; - if ((pp = findexistingpeer(&addr, (struct peer *)0)) == 0) - continue; - ip->dstadr = (pp->processed) ? - pp->cast_flags == MDF_BCAST ? - pp->dstadr->bcast.sin_addr.s_addr: - pp->cast_flags ? - pp->dstadr->sin.sin_addr.s_addr ? - pp->dstadr->sin.sin_addr.s_addr: - pp->dstadr->bcast.sin_addr.s_addr: - 3 : 7; - ip->srcadr = NSRCADR(&pp->srcadr); - ip->srcport = NSRCPORT(&pp->srcadr); - ip->flags = 0; - if (pp == sys_peer) - ip->flags |= INFO_FLAG_SYSPEER; - if (pp->flags & FLAG_CONFIG) - ip->flags |= INFO_FLAG_CONFIG; - if (pp->flags & FLAG_REFCLOCK) - ip->flags |= INFO_FLAG_REFCLOCK; - if (pp->flags & FLAG_AUTHENABLE) - ip->flags |= INFO_FLAG_AUTHENABLE; - if (pp->flags & FLAG_PREFER) - ip->flags |= INFO_FLAG_PREFER; - if (pp->candidate != 0) - ip->flags |= INFO_FLAG_SEL_CANDIDATE; - if (pp->select != 0) - ip->flags |= INFO_FLAG_SHORTLIST; - ip->timereceived = htonl(current_time - pp->timereceived); - ip->timetosend - = htonl(pp->event_timer.event_time - current_time); - ip->timereachable = htonl(current_time - pp->timereachable); - ip->sent = htonl(pp->sent); - ip->processed = htonl(pp->processed); - ip->badauth = htonl(pp->badauth); - ip->bogusorg = htonl(pp->bogusorg); - ip->oldpkt = htonl(pp->oldpkt); - ip->seldisp = htonl(pp->seldisptoolarge); - ip->selbroken = htonl(pp->selbroken); - ip->candidate = pp->candidate; - ip = (struct info_peer_stats *)more_pkt(); - } - flush_pkt(); -} - - -/* - * sys_info - return system info - */ -static void -sys_info(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_sys *is; - - /* - * Importations from the protocol module - */ - extern u_char sys_leap; - extern u_char sys_stratum; - extern s_char sys_precision; - extern s_fp sys_rootdelay; - extern u_fp sys_rootdispersion; - extern u_long sys_refid; - extern l_fp sys_reftime; - extern u_char sys_poll; - extern struct peer *sys_peer; - extern int sys_bclient; - extern s_fp sys_bdelay; - extern int sys_authenticate; - extern u_long sys_authdelay; - extern u_fp clock_stability; - extern s_fp clock_frequency; - - is = (struct info_sys *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_sys)); - - if (sys_peer != 0) { - is->peer = NSRCADR(&sys_peer->srcadr); - is->peer_mode = sys_peer->hmode; - } else { - is->peer = 0; - is->peer_mode = 0; - } - is->leap = sys_leap; - is->stratum = sys_stratum; - is->precision = sys_precision; - is->rootdelay = htonl(sys_rootdelay); - is->rootdispersion = htonl(sys_rootdispersion); - is->frequency = htonl(clock_frequency); - is->stability = htonl(clock_stability); - is->refid = sys_refid; - HTONL_FP(&sys_reftime, &is->reftime); - - is->poll = sys_poll; - - is->flags = 0; - if (sys_bclient) - is->flags |= INFO_FLAG_BCLIENT; - if (sys_authenticate) - is->flags |= INFO_FLAG_AUTHENTICATE; - if (pll_enable) - is->flags |= INFO_FLAG_PLL; - if (pll_control) - is->flags |= INFO_FLAG_PLL_SYNC; - if (pps_control) - is->flags |= INFO_FLAG_PPS_SYNC; - if (mon_enabled != MON_OFF) - is->flags |= INFO_FLAG_MONITOR; - if (stats_control) - is->flags |= INFO_FLAG_FILEGEN; - is->bdelay = HTONS_FP(sys_bdelay); - HTONL_UF(sys_authdelay, &is->authdelay); - - (void) more_pkt(); - flush_pkt(); -} - - -/* - * sys_stats - return system statistics - */ -static void -sys_stats(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_sys_stats *ss; - - /* - * Importations from the protocol module - */ - extern u_long sys_stattime; - extern u_long sys_badstratum; - extern u_long sys_oldversionpkt; - extern u_long sys_newversionpkt; - extern u_long sys_unknownversion; - extern u_long sys_badlength; - extern u_long sys_processed; - extern u_long sys_badauth; - extern u_long sys_limitrejected; - - ss = (struct info_sys_stats *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_sys_stats)); - - ss->timeup = htonl(current_time); - ss->timereset = htonl(current_time - sys_stattime); - ss->badstratum = htonl(sys_badstratum); - ss->oldversionpkt = htonl(sys_oldversionpkt); - ss->newversionpkt = htonl(sys_newversionpkt); - ss->unknownversion = htonl(sys_unknownversion); - ss->badlength = htonl(sys_badlength); - ss->processed = htonl(sys_processed); - ss->badauth = htonl(sys_badauth); - ss->limitrejected = htonl(sys_limitrejected); - (void) more_pkt(); - flush_pkt(); -} - - -/* - * mem_stats - return memory statistics - */ -static void -mem_stats(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_mem_stats *ms; - register int i; - - /* - * Importations from the peer module - */ - extern int peer_hash_count[HASH_SIZE]; - extern int peer_free_count; - extern u_long peer_timereset; - extern u_long findpeer_calls; - extern u_long peer_allocations; - extern u_long peer_demobilizations; - extern int total_peer_structs; - - ms = (struct info_mem_stats *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_mem_stats)); - - ms->timereset = htonl(current_time - peer_timereset); - ms->totalpeermem = htons((u_short)total_peer_structs); - ms->freepeermem = htons((u_short)peer_free_count); - ms->findpeer_calls = htonl(findpeer_calls); - ms->allocations = htonl(peer_allocations); - ms->demobilizations = htonl(peer_demobilizations); - - for (i = 0; i < HASH_SIZE; i++) { - if (peer_hash_count[i] > 255) - ms->hashcount[i] = 255; - else - ms->hashcount[i] = (u_char)peer_hash_count[i]; - } - - (void) more_pkt(); - flush_pkt(); -} - - -/* - * io_stats - return io statistics - */ -static void -io_stats(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_io_stats *io; - - /* - * Importations from the io module - */ - extern u_long io_timereset; - extern u_long full_recvbufs; - extern u_long free_recvbufs; - extern u_long total_recvbufs; - extern u_long lowater_additions; - extern u_long packets_dropped; - extern u_long packets_ignored; - extern u_long packets_received; - extern u_long packets_sent; - extern u_long packets_notsent; - extern u_long handler_calls; - extern u_long handler_pkts; - - io = (struct info_io_stats *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_io_stats)); - - io->timereset = htonl(current_time - io_timereset); - io->totalrecvbufs = htons((u_short) total_recvbufs); - io->freerecvbufs = htons((u_short) free_recvbufs); - io->fullrecvbufs = htons((u_short) full_recvbufs); - io->lowwater = htons((u_short) lowater_additions); - io->dropped = htonl(packets_dropped); - io->ignored = htonl(packets_ignored); - io->received = htonl(packets_received); - io->sent = htonl(packets_sent); - io->notsent = htonl(packets_notsent); - io->interrupts = htonl(handler_calls); - io->int_received = htonl(handler_pkts); - - (void) more_pkt(); - flush_pkt(); -} - - -/* - * timer_stats - return timer statistics - */ -static void -timer_stats(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_timer_stats *ts; - - /* - * Importations from the timer module - */ - extern u_long alarm_overflow; - extern u_long timer_timereset; - extern u_long timer_overflows; - extern u_long timer_xmtcalls; - - ts = (struct info_timer_stats *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_timer_stats)); - - ts->timereset = htonl(current_time - timer_timereset); - ts->alarms = htonl(alarm_overflow); - ts->overflows = htonl(timer_overflows); - ts->xmtcalls = htonl(timer_xmtcalls); - - (void) more_pkt(); - flush_pkt(); -} - - -/* - * loop_info - return the current state of the loop filter - */ -static void -loop_info(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_loop *li; - l_fp tmp; - - /* - * Importations from the loop filter module - */ - extern l_fp last_offset; - extern s_fp drift_comp; - extern int tc_counter; - extern u_long last_time; - - li = (struct info_loop *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_loop)); - - HTONL_FP(&last_offset, &li->last_offset); - FPTOLFP(drift_comp, &tmp); - HTONL_FP(&tmp, &li->drift_comp); - li->compliance = htonl(tc_counter); - li->watchdog_timer = htonl(current_time - last_time); - - (void) more_pkt(); - flush_pkt(); -} - - -/* - * do_conf - add a peer to the configuration list - */ -static void -do_conf(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct conf_peer *cp; - register int items; - struct sockaddr_in peeraddr; - int fl; - - /* - * Do a check of everything to see that it looks - * okay. If not, complain about it. Note we are - * very picky here. - */ - items = INFO_NITEMS(inpkt->err_nitems); - cp = (struct conf_peer *)inpkt->data; - - fl = 0; - while (items-- > 0 && !fl) { - if (cp->version > NTP_VERSION - || cp->version < NTP_OLDVERSION) - fl = 1; - if (cp->hmode != MODE_ACTIVE - && cp->hmode != MODE_CLIENT - && cp->hmode != MODE_BROADCAST) - fl = 1; - if (cp->flags & ~(CONF_FLAG_AUTHENABLE | CONF_FLAG_PREFER)) - fl = 1; - cp++; - } - - if (fl) { - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - - /* - * Looks okay, try it out - */ - items = INFO_NITEMS(inpkt->err_nitems); - cp = (struct conf_peer *)inpkt->data; - memset((char *)&peeraddr, 0, sizeof(struct sockaddr_in)); - peeraddr.sin_family = AF_INET; - peeraddr.sin_port = htons(NTP_PORT); - - /* - * Make sure the address is valid - */ -#ifdef REFCLOCK - if (!ISREFCLOCKADR(&peeraddr) && ISBADADR(&peeraddr)) { -#else - if (ISBADADR(&peeraddr)) { -#endif - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - - while (items-- > 0) { - fl = 0; - if (cp->flags & CONF_FLAG_AUTHENABLE) - fl |= FLAG_AUTHENABLE; - if (cp->flags & CONF_FLAG_PREFER) - fl |= FLAG_PREFER; - peeraddr.sin_addr.s_addr = cp->peeraddr; - /* XXX W2DO? minpoll/maxpoll arguments ??? */ - if (peer_config(&peeraddr, (struct interface *)0, - cp->hmode, cp->version, cp->minpoll, cp->maxpoll, - fl, cp->ttl, cp->keyid) == 0) { - req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); - return; - } - cp++; - } - - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} - - -/* - * do_unconf - remove a peer from the configuration list - */ -static void -do_unconf(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct conf_unpeer *cp; - register int items; - register struct peer *peer; - struct sockaddr_in peeraddr; - int bad, found; - - /* - * This is a bit unstructured, but I like to be careful. - * We check to see that every peer exists and is actually - * configured. If so, we remove them. If not, we return - * an error. - */ - peeraddr.sin_family = AF_INET; - peeraddr.sin_port = htons(NTP_PORT); - - items = INFO_NITEMS(inpkt->err_nitems); - cp = (struct conf_unpeer *)inpkt->data; - - bad = 0; - while (items-- > 0 && !bad) { - peeraddr.sin_addr.s_addr = cp->peeraddr; - found = 0; - peer = (struct peer *)0; - while (!found) { - peer = findexistingpeer(&peeraddr, peer); - if (peer == (struct peer *)0) - break; - if (peer->flags & FLAG_CONFIG) - found = 1; - } - if (!found) - bad = 1; - cp++; - } - - if (bad) { - req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); - return; - } - - /* - * Now do it in earnest. - */ - - items = INFO_NITEMS(inpkt->err_nitems); - cp = (struct conf_unpeer *)inpkt->data; - while (items-- > 0) { - peeraddr.sin_addr.s_addr = cp->peeraddr; - peer_unconfig(&peeraddr, (struct interface *)0); - cp++; - } - - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} - - -/* - * set_sys_flag - set system flags - */ -static void -set_sys_flag(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - setclr_flags(srcadr, inter, inpkt, 1); -} - - -/* - * clr_sys_flag - clear system flags - */ -static void -clr_sys_flag(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - setclr_flags(srcadr, inter, inpkt, 0); -} - - -/* - * setclr_flags - do the grunge work of flag setting/clearing - */ -static void -setclr_flags(srcadr, inter, inpkt, set) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; - u_long set; -{ - register u_long flags; - - if (INFO_NITEMS(inpkt->err_nitems) > 1) { - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - - flags = ((struct conf_sys_flags *)inpkt->data)->flags; - - if (flags & ~(SYS_FLAG_BCLIENT | SYS_FLAG_AUTHENTICATE | - SYS_FLAG_PLL | SYS_FLAG_MONITOR | - SYS_FLAG_FILEGEN)) { - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - - if (flags & SYS_FLAG_BCLIENT) - proto_config(PROTO_BROADCLIENT, set); - if (flags & SYS_FLAG_AUTHENTICATE) - proto_config(PROTO_AUTHENTICATE, set); - if (flags & SYS_FLAG_PLL) - proto_config(PROTO_PLL, set); - if (flags & SYS_FLAG_MONITOR) - proto_config(PROTO_MONITOR, set); - if (flags & SYS_FLAG_FILEGEN) - proto_config(PROTO_FILEGEN, set); - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} - - -/* - * do_monitor - turn on monitoring - */ -static void -do_monitor(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - mon_start(MON_ON); - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} - - -/* - * do_nomonitor - turn off monitoring - */ -static void -do_nomonitor(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - mon_stop(MON_ON); - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} - - -/* - * list_restrict - return the restrict list - */ -static void -list_restrict(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_restrict *ir; - register struct restrictlist *rl; - extern struct restrictlist *restrictlist; - -#ifdef DEBUG - if (debug > 2) - printf("wants peer list summary\n"); -#endif - - ir = (struct info_restrict *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_restrict)); - for (rl = restrictlist; rl != 0 && ir != 0; rl = rl->next) { - ir->addr = htonl(rl->addr); - ir->mask = htonl(rl->mask); - ir->count = htonl(rl->count); - ir->flags = htons(rl->flags); - ir->mflags = htons(rl->mflags); - ir = (struct info_restrict *)more_pkt(); - } - flush_pkt(); -} - - - -/* - * do_resaddflags - add flags to a restrict entry (or create one) - */ -static void -do_resaddflags(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - do_restrict(srcadr, inter, inpkt, RESTRICT_FLAGS); -} - - - -/* - * do_ressubflags - remove flags from a restrict entry - */ -static void -do_ressubflags(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - do_restrict(srcadr, inter, inpkt, RESTRICT_UNFLAG); -} - - -/* - * do_unrestrict - remove a restrict entry from the list - */ -static void -do_unrestrict(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - do_restrict(srcadr, inter, inpkt, RESTRICT_REMOVE); -} - - - - - -/* - * do_restrict - do the dirty stuff of dealing with restrictions - */ -static void -do_restrict(srcadr, inter, inpkt, op) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; - int op; -{ - register struct conf_restrict *cr; - register int items; - struct sockaddr_in matchaddr; - struct sockaddr_in matchmask; - int bad; - - /* - * Do a check of the flags to make sure that only - * the NTPPORT flag is set, if any. If not, complain - * about it. Note we are very picky here. - */ - items = INFO_NITEMS(inpkt->err_nitems); - cr = (struct conf_restrict *)inpkt->data; - - bad = 0; - while (items-- > 0 && !bad) { - if (cr->mflags & ~(RESM_NTPONLY)) - bad = 1; - if (cr->flags & ~(RES_ALLFLAGS)) - bad = 1; - if (cr->addr == htonl(INADDR_ANY) && cr->mask != htonl(INADDR_ANY)) - bad = 1; - cr++; - } - - if (bad) { - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - - /* - * Looks okay, try it out - */ - items = INFO_NITEMS(inpkt->err_nitems); - cr = (struct conf_restrict *)inpkt->data; - memset((char *)&matchaddr, 0, sizeof(struct sockaddr_in)); - memset((char *)&matchmask, 0, sizeof(struct sockaddr_in)); - matchaddr.sin_family = AF_INET; - matchmask.sin_family = AF_INET; - - while (items-- > 0) { - matchaddr.sin_addr.s_addr = cr->addr; - matchmask.sin_addr.s_addr = cr->mask; - restrict(op, &matchaddr, &matchmask, cr->mflags, - cr->flags); - cr++; - } - - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} - - -/* - * mon_getlist - return monitor data - */ -static void -mon_getlist_0(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_monitor *im; - register struct mon_data *md; - extern struct mon_data mon_mru_list; - extern int mon_enabled; - -#ifdef DEBUG - if (debug > 2) - printf("wants monitor 0 list\n"); -#endif - if (!mon_enabled) { - req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); - return; - } - - im = (struct info_monitor *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_monitor)); - for (md = mon_mru_list.mru_next; md != &mon_mru_list && im != 0; - md = md->mru_next) { - im->lasttime = htonl(current_time - md->lasttime); - im->firsttime = htonl(current_time - md->firsttime); - if (md->lastdrop) - im->lastdrop = htonl(current_time - md->lastdrop); - else - im->lastdrop = 0; - im->count = htonl(md->count); - im->addr = md->rmtadr; - im->port = md->rmtport; - im->mode = md->mode; - im->version = md->version; - im = (struct info_monitor *)more_pkt(); - } - flush_pkt(); -} - -/* - * mon_getlist - return monitor data - */ -static void -mon_getlist_1(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_monitor_1 *im; - register struct mon_data *md; - extern struct mon_data mon_mru_list; - extern int mon_enabled; - -#ifdef DEBUG - if (debug > 2) - printf("wants monitor 1 list\n"); -#endif - if (!mon_enabled) { - req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); - return; - } - - im = (struct info_monitor_1 *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_monitor_1)); - for (md = mon_mru_list.mru_next; md != &mon_mru_list && im != 0; - md = md->mru_next) { - im->lasttime = htonl(current_time - md->lasttime); - im->firsttime = htonl(current_time - md->firsttime); - if (md->lastdrop) - im->lastdrop = htonl(current_time - md->lastdrop); - else - im->lastdrop = 0; - im->count = htonl(md->count); - im->addr = md->rmtadr; - im->daddr = md->cast_flags == MDF_BCAST ? - md->interface->bcast.sin_addr.s_addr : - md->cast_flags ? - md->interface->sin.sin_addr.s_addr ? - md->interface->sin.sin_addr.s_addr : - md->interface->bcast.sin_addr.s_addr : - 4; - im->flags = md->cast_flags; - im->port = md->rmtport; - im->mode = md->mode; - im->version = md->version; - im = (struct info_monitor_1 *)more_pkt(); - } - flush_pkt(); -} - -/* - * Module entry points and the flags they correspond with - */ -struct reset_entry { - int flag; /* flag this corresponds to */ - void (*handler)(); /* routine to handle request */ -}; - -struct reset_entry reset_entries[] = { - { RESET_FLAG_ALLPEERS, peer_all_reset }, - { RESET_FLAG_IO, io_clr_stats }, - { RESET_FLAG_SYS, proto_clr_stats }, - { RESET_FLAG_MEM, peer_clr_stats }, - { RESET_FLAG_TIMER, timer_clr_stats }, - { RESET_FLAG_AUTH, reset_auth_stats }, - { RESET_FLAG_CTL, ctl_clr_stats }, - { 0, 0 } -}; - -/* - * reset_stats - reset statistic counters here and there - */ -static void -reset_stats(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - u_long flags; - struct reset_entry *rent; - - if (INFO_NITEMS(inpkt->err_nitems) > 1) { - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - - flags = ((struct reset_flags *)inpkt->data)->flags; - - if (flags & ~RESET_ALLFLAGS) { - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - - for (rent = reset_entries; rent->flag != 0; rent++) { - if (flags & rent->flag) - (rent->handler)(); - } - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} - - -/* - * reset_peer - clear a peer's statistics - */ -static void -reset_peer(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct conf_unpeer *cp; - register int items; - register struct peer *peer; - struct sockaddr_in peeraddr; - int bad; - - /* - * We check first to see that every peer exists. If not, - * we return an error. - */ - peeraddr.sin_family = AF_INET; - peeraddr.sin_port = htons(NTP_PORT); - - items = INFO_NITEMS(inpkt->err_nitems); - cp = (struct conf_unpeer *)inpkt->data; - - bad = 0; - while (items-- > 0 && !bad) { - peeraddr.sin_addr.s_addr = cp->peeraddr; - peer = findexistingpeer(&peeraddr, (struct peer *)0); - if (peer == (struct peer *)0) - bad++; - cp++; - } - - if (bad) { - req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); - return; - } - - /* - * Now do it in earnest. - */ - - items = INFO_NITEMS(inpkt->err_nitems); - cp = (struct conf_unpeer *)inpkt->data; - while (items-- > 0) { - peeraddr.sin_addr.s_addr = cp->peeraddr; - peer = findexistingpeer(&peeraddr, (struct peer *)0); - peer_reset(peer); - cp++; - } - - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} - - -/* - * do_key_reread - reread the encryption key file - */ -static void -do_key_reread(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - rereadkeys(); - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} - - -/* - * do_dirty_hack - */ -static void -do_dirty_hack(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - /* historical placeholder */ - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} - - -/* - * dont_dirty_hack - */ -static void -dont_dirty_hack(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - /* historical placeholder */ - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} - - -/* - * trust_key - make one or more keys trusted - */ -static void -trust_key(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - do_trustkey(srcadr, inter, inpkt, 1); -} - - -/* - * untrust_key - make one or more keys untrusted - */ -static void -untrust_key(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - do_trustkey(srcadr, inter, inpkt, 0); -} - - -/* - * do_trustkey - make keys either trustable or untrustable - */ -static void -do_trustkey(srcadr, inter, inpkt, trust) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; - int trust; -{ - register u_long *kp; - register int items; - - items = INFO_NITEMS(inpkt->err_nitems); - kp = (u_long *)inpkt->data; - while (items-- > 0) { - authtrust(*kp, trust); - kp++; - } - - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} - - -/* - * get_auth_info - return some stats concerning the authentication module - */ -static void -get_auth_info(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_auth *ia; - - /* - * Importations from the authentication module - */ - extern u_long authnumkeys; - extern u_long authnumfreekeys; - extern u_long authkeylookups; - extern u_long authkeynotfound; - extern u_long authencryptions; - extern u_long authdecryptions; - extern u_long authkeyuncached; - - ia = (struct info_auth *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_auth)); - - ia->numkeys = htonl(authnumkeys); - ia->numfreekeys = htonl(authnumfreekeys); - ia->keylookups = htonl(authkeylookups); - ia->keynotfound = htonl(authkeynotfound); - ia->encryptions = htonl(authencryptions); - ia->decryptions = htonl(authdecryptions); - ia->keyuncached = htonl(authkeyuncached); - ia->timereset = htonl(current_time - auth_timereset); - - (void) more_pkt(); - flush_pkt(); -} - - - -/* - * reset_auth_stats - reset the authentication stat counters. Done here - * to keep xntp-isms out of the authentication module - */ -static void -reset_auth_stats() -{ - /* - * Importations from the authentication module - */ - extern u_long authkeylookups; - extern u_long authkeynotfound; - extern u_long authencryptions; - extern u_long authdecryptions; - extern u_long authkeyuncached; - - authkeylookups = 0; - authkeynotfound = 0; - authencryptions = 0; - authdecryptions = 0; - authkeyuncached = 0; - auth_timereset = current_time; -} - - -/* - * req_get_traps - return information about current trap holders - */ -static void -req_get_traps(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_trap *it; - register struct ctl_trap *tr; - register int i; - - /* - * Imported from the control module - */ - extern struct ctl_trap ctl_trap[]; - extern int num_ctl_traps; - - if (num_ctl_traps == 0) { - req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); - return; - } - - it = (struct info_trap *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_trap)); - - for (i = 0, tr = ctl_trap; i < CTL_MAXTRAPS; i++, tr++) { - if (tr->tr_flags & TRAP_INUSE) { - if (tr->tr_localaddr == any_interface) - it->local_address = 0; - else - it->local_address - = NSRCADR(&tr->tr_localaddr->sin); - it->trap_address = NSRCADR(&tr->tr_addr); - it->trap_port = NSRCPORT(&tr->tr_addr); - it->sequence = htons(tr->tr_sequence); - it->settime = htonl(current_time - tr->tr_settime); - it->origtime = htonl(current_time - tr->tr_origtime); - it->resets = htonl(tr->tr_resets); - it->flags = htonl((u_long)tr->tr_flags); - it = (struct info_trap *)more_pkt(); - } - } - flush_pkt(); -} - - -/* - * req_set_trap - configure a trap - */ -static void -req_set_trap(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - do_setclr_trap(srcadr, inter, inpkt, 1); -} - - - -/* - * req_clr_trap - unconfigure a trap - */ -static void -req_clr_trap(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - do_setclr_trap(srcadr, inter, inpkt, 0); -} - - - -/* - * do_setclr_trap - do the grunge work of (un)configuring a trap - */ -static void -do_setclr_trap(srcadr, inter, inpkt, set) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; - int set; -{ - register struct conf_trap *ct; - register struct interface *linter; - int res; - struct sockaddr_in laddr; - - /* - * Prepare sockaddr_in structure - */ - memset((char *)&laddr, 0, sizeof laddr); - laddr.sin_family = AF_INET; - laddr.sin_port = ntohs(NTP_PORT); - - /* - * Restrict ourselves to one item only. This eliminates - * the error reporting problem. - */ - if (INFO_NITEMS(inpkt->err_nitems) > 1) { - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - ct = (struct conf_trap *)inpkt->data; - - /* - * Look for the local interface. If none, use the default. - */ - if (ct->local_address == 0) { - linter = any_interface; - } else { - laddr.sin_addr.s_addr = ct->local_address; - linter = findinterface(&laddr); - if (linter == NULL) { - req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); - return; - } - } - - laddr.sin_addr.s_addr = ct->trap_address; - if (ct->trap_port != 0) - laddr.sin_port = ct->trap_port; - else - laddr.sin_port = htons(TRAPPORT); - - if (set) { - res = ctlsettrap(&laddr, linter, 0, - INFO_VERSION(inpkt->rm_vn_mode)); - } else { - res = ctlclrtrap(&laddr, linter, 0); - } - - if (!res) { - req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); - } else { - req_ack(srcadr, inter, inpkt, INFO_OKAY); - } - return; -} - - - -/* - * set_request_keyid - set the keyid used to authenticate requests - */ -static void -set_request_keyid(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - u_long keyid; - - /* - * Restrict ourselves to one item only. - */ - if (INFO_NITEMS(inpkt->err_nitems) > 1) { - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - - keyid = ntohl(*((u_long *)(inpkt->data))); - info_auth_keyid = keyid; - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} - - - -/* - * set_control_keyid - set the keyid used to authenticate requests - */ -static void -set_control_keyid(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - u_long keyid; - extern u_long ctl_auth_keyid; - - /* - * Restrict ourselves to one item only. - */ - if (INFO_NITEMS(inpkt->err_nitems) > 1) { - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - - keyid = ntohl(*((u_long *)(inpkt->data))); - ctl_auth_keyid = keyid; - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} - - - -/* - * get_ctl_stats - return some stats concerning the control message module - */ -static void -get_ctl_stats(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_control *ic; - - /* - * Importations from the control module - */ - extern u_long ctltimereset; - extern u_long numctlreq; - extern u_long numctlbadpkts; - extern u_long numctlresponses; - extern u_long numctlfrags; - extern u_long numctlerrors; - extern u_long numctltooshort; - extern u_long numctlinputresp; - extern u_long numctlinputfrag; - extern u_long numctlinputerr; - extern u_long numctlbadoffset; - extern u_long numctlbadversion; - extern u_long numctldatatooshort; - extern u_long numctlbadop; - extern u_long numasyncmsgs; - - ic = (struct info_control *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_control)); - - ic->ctltimereset = htonl(current_time - ctltimereset); - ic->numctlreq = htonl(numctlreq); - ic->numctlbadpkts = htonl(numctlbadpkts); - ic->numctlresponses = htonl(numctlresponses); - ic->numctlfrags = htonl(numctlfrags); - ic->numctlerrors = htonl(numctlerrors); - ic->numctltooshort = htonl(numctltooshort); - ic->numctlinputresp = htonl(numctlinputresp); - ic->numctlinputfrag = htonl(numctlinputfrag); - ic->numctlinputerr = htonl(numctlinputerr); - ic->numctlbadoffset = htonl(numctlbadoffset); - ic->numctlbadversion = htonl(numctlbadversion); - ic->numctldatatooshort = htonl(numctldatatooshort); - ic->numctlbadop = htonl(numctlbadop); - ic->numasyncmsgs = htonl(numasyncmsgs); - - (void) more_pkt(); - flush_pkt(); -} - - - -/* - * get_leap_info - return some stats concerning the control message module - */ -static void -get_leap_info(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_leap *il; - - /* - * Imported from the protocol module - */ - extern u_char sys_leap; - - /* - * Importations from the leap module - */ - extern u_char leap_indicator; - extern u_char leap_warning; - extern u_char leapbits; - extern u_long leap_timer; - extern u_long leap_processcalls; - extern u_long leap_notclose; - extern u_long leap_monthofleap; - extern u_long leap_dayofleap; - extern u_long leap_hoursfromleap; - extern u_long leap_happened; - - il = (struct info_leap *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_leap)); - - il->sys_leap = sys_leap; - il->leap_indicator = leap_indicator; - il->leap_warning = leap_warning; - il->leap_bits = (leapbits & INFO_LEAP_MASK) - | ((leap_indicator != LEAP_NOWARNING) ? INFO_LEAP_OVERRIDE : 0); - il->leap_timer = htonl(leap_timer - current_time); - il->leap_processcalls = htonl(leap_processcalls); - il->leap_notclose = htonl(leap_notclose); - il->leap_monthofleap = htonl(leap_monthofleap); - il->leap_dayofleap = htonl(leap_dayofleap); - il->leap_hoursfromleap = htonl(leap_hoursfromleap); - il->leap_happened = htonl(leap_happened); - - (void) more_pkt(); - flush_pkt(); -} - - -#ifdef KERNEL_PLL -/* - * get_kernel_info - get kernel pll/pps information - */ -static void -get_kernel_info(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_kernel *ik; - struct timex ntx; - - if (!pll_control) - return; - memset((char *)&ntx, 0, sizeof(ntx)); - (void)ntp_adjtime(&ntx); - - ik = (struct info_kernel *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_kernel)); - - /* - * pll variables - */ - ik->offset = htonl(ntx.offset); - ik->freq = htonl(ntx.freq); - ik->maxerror = htonl(ntx.maxerror); - ik->esterror = htonl(ntx.esterror); - ik->status = htons(ntx.status); - ik->constant = htonl(ntx.constant); - ik->precision = htonl(ntx.precision); - ik->tolerance = htonl(ntx.tolerance); - - /* - * pps variables - */ - ik->ppsfreq = htonl(ntx.ppsfreq); - ik->jitter = htonl(ntx.jitter); - ik->shift = htons(ntx.shift); - ik->stabil = htonl(ntx.stabil); - ik->jitcnt = htonl(ntx.jitcnt); - ik->calcnt = htonl(ntx.calcnt); - ik->errcnt = htonl(ntx.errcnt); - ik->stbcnt = htonl(ntx.stbcnt); - - (void) more_pkt(); - flush_pkt(); -} -#endif /* KERNEL_PLL */ - - -#ifdef REFCLOCK -/* - * get_clock_info - get info about a clock - */ -static void -get_clock_info(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct info_clock *ic; - register U_LONG *clkaddr; - register int items; - struct refclockstat clock; - struct sockaddr_in addr; - - memset((char *)&addr, 0, sizeof addr); - addr.sin_family = AF_INET; - addr.sin_port = htons(NTP_PORT); - items = INFO_NITEMS(inpkt->err_nitems); - clkaddr = (U_LONG *) inpkt->data; - - ic = (struct info_clock *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_clock)); - - while (items-- > 0) { - addr.sin_addr.s_addr = *clkaddr++; - if (!ISREFCLOCKADR(&addr) || - findexistingpeer(&addr, (struct peer *)0) == 0) { - req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); - return; - } - - clock.kv_list = (struct ctl_var *)0; - - refclock_control(&addr, (struct refclockstat *)0, &clock); - - ic->clockadr = addr.sin_addr.s_addr; - ic->type = clock.type; - ic->flags = clock.flags; - ic->lastevent = clock.lastevent; - ic->currentstatus = clock.currentstatus; - ic->polls = htonl(clock.polls); - ic->noresponse = htonl(clock.noresponse); - ic->badformat = htonl(clock.badformat); - ic->baddata = htonl(clock.baddata); - ic->timestarted = htonl(clock.timereset); - HTONL_FP(&clock.fudgetime1, &ic->fudgetime1); - HTONL_FP(&clock.fudgetime2, &ic->fudgetime2); - ic->fudgeval1 = htonl(clock.fudgeval1); - ic->fudgeval2 = htonl(clock.fudgeval2); - - free_varlist(clock.kv_list); - - ic = (struct info_clock *)more_pkt(); - } - flush_pkt(); -} - - - -/* - * set_clock_fudge - get a clock's fudge factors - */ -static void -set_clock_fudge(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register struct conf_fudge *cf; - register int items; - struct refclockstat clock; - struct sockaddr_in addr; - - memset((char *)&addr, 0, sizeof addr); - memset((char *)&clock, 0, sizeof clock); - addr.sin_family = AF_INET; - addr.sin_port = htons(NTP_PORT); - items = INFO_NITEMS(inpkt->err_nitems); - cf = (struct conf_fudge *) inpkt->data; - - while (items-- > 0) { - addr.sin_addr.s_addr = cf->clockadr; - if (!ISREFCLOCKADR(&addr) || - findexistingpeer(&addr, (struct peer *)0) == 0) { - req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); - return; - } - - switch(ntohl(cf->which)) { - case FUDGE_TIME1: - NTOHL_FP(&cf->fudgetime, &clock.fudgetime1); - clock.haveflags = CLK_HAVETIME1; - break; - case FUDGE_TIME2: - NTOHL_FP(&cf->fudgetime, &clock.fudgetime2); - clock.haveflags = CLK_HAVETIME2; - break; - case FUDGE_VAL1: - clock.fudgeval1 = ntohl(cf->fudgeval_flags); - clock.haveflags = CLK_HAVEVAL1; - break; - case FUDGE_VAL2: - clock.fudgeval2 = ntohl(cf->fudgeval_flags); - clock.haveflags = CLK_HAVEVAL2; - break; - case FUDGE_FLAGS: - clock.flags = ntohl(cf->fudgeval_flags) & 0xf; - clock.haveflags = - (CLK_HAVEFLAG1|CLK_HAVEFLAG2|CLK_HAVEFLAG3|CLK_HAVEFLAG4); - break; - default: - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - - refclock_control(&addr, &clock, (struct refclockstat *)0); - } - - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} -#endif - -/* - * set_precision - set the system precision - */ -static void -set_precision(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register long precision; - - precision = ntohl(*(long *)(inpkt->data)); - - if (INFO_NITEMS(inpkt->err_nitems) > 1 || - precision > -1 || precision < -20) { - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - - proto_config(PROTO_PRECISION, precision); - req_ack(srcadr, inter, inpkt, INFO_OKAY); -} - -#ifdef REFCLOCK -/* - * get_clkbug_info - get debugging info about a clock - */ -static void -get_clkbug_info(srcadr, inter, inpkt) - struct sockaddr_in *srcadr; - struct interface *inter; - struct req_pkt *inpkt; -{ - register int i; - register struct info_clkbug *ic; - register U_LONG *clkaddr; - register int items; - struct refclockbug bug; - struct sockaddr_in addr; - - memset((char *)&addr, 0, sizeof addr); - addr.sin_family = AF_INET; - addr.sin_port = htons(NTP_PORT); - items = INFO_NITEMS(inpkt->err_nitems); - clkaddr = (U_LONG *) inpkt->data; - - ic = (struct info_clkbug *)prepare_pkt(srcadr, inter, inpkt, - sizeof(struct info_clkbug)); - - while (items-- > 0) { - addr.sin_addr.s_addr = *clkaddr++; - if (!ISREFCLOCKADR(&addr) || - findexistingpeer(&addr, (struct peer *)0) == 0) { - req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); - return; - } - - memset((char *)&bug, 0, sizeof bug); - refclock_buginfo(&addr, &bug); - if (bug.nvalues == 0 && bug.ntimes == 0) { - req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); - return; - } - - ic->clockadr = addr.sin_addr.s_addr; - i = bug.nvalues; - if (i > NUMCBUGVALUES) - i = NUMCBUGVALUES; - ic->nvalues = (u_char)i; - ic->svalues = htons((u_short)bug.svalues & ((1<<i)-1)); - while (--i >= 0) - ic->values[i] = htonl(bug.values[i]); - - i = bug.ntimes; - if (i > NUMCBUGTIMES) - i = NUMCBUGTIMES; - ic->ntimes = (u_char)i; - ic->stimes = htonl(bug.stimes); - while (--i >= 0) { - HTONL_FP(&bug.times[i], &ic->times[i]); - } - - ic = (struct info_clkbug *)more_pkt(); - } - flush_pkt(); -} -#endif diff --git a/usr.sbin/xntpd/xntpd/ntp_restrict.c b/usr.sbin/xntpd/xntpd/ntp_restrict.c deleted file mode 100644 index 174d07e2cefc..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_restrict.c +++ /dev/null @@ -1,459 +0,0 @@ -/* - * ntp_restrict.c - find out what restrictions this host is running under - */ -#include <stdio.h> -#include <sys/types.h> - -#include "ntpd.h" -#include "ntp_if.h" -#include "ntp_stdlib.h" - -/* - * This code keeps a simple address-and-mask list of hosts we want - * to place restrictions on (or remove them from). The restrictions - * are implemented as a set of flags which tell you what the host - * can't do. There is a subroutine entry to return the flags. The - * list is kept sorted to reduce the average number of comparisons - * and make sure you get the set of restrictions most specific to - * the address. - * - * The algorithm is that, when looking up a host, it is first assumed - * that the default set of restrictions will apply. It then searches - * down through the list. Whenever it finds a match it adopts the match's - * flags instead. When you hit the point where the sorted address is - * greater than the target, you return with the last set of flags you - * found. Because of the ordering of the list, the most specific match - * will provide the final set of flags. - * - * This was originally intended to restrict you from sync'ing to your - * own broadcasts when you are doing that, by restricting yourself - * from your own interfaces. It was also thought it would sometimes - * be useful to keep a misbehaving host or two from abusing your primary - * clock. It has been expanded, however, to suit the needs of those - * with more restrictive access policies. - */ - -/* - * Memory allocation parameters. We allocate INITRESLIST entries - * initially, and add INCRESLIST entries to the free list whenever - * we run out. - */ -#define INITRESLIST 10 -#define INCRESLIST 5 - -/* - * The restriction list - */ - struct restrictlist *restrictlist; -static int restrictcount; /* count of entries in the restriction list */ - -/* - * The free list and associated counters. Also some uninteresting - * stat counters. - */ -static struct restrictlist *resfree; -static int numresfree; /* number of structures on free list */ - -u_long res_calls; -u_long res_found; -u_long res_not_found; -u_long res_timereset; - -/* - * Parameters of the RES_LIMITED restriction option. - * client_limit is the number of hosts allowed per source net - * client_limit_period is the number of seconds after which an entry - * is no longer considered for client limit determination - */ -u_long client_limit; -u_long client_limit_period; -/* - * count number of restriction entries referring to RES_LIMITED - * controls activation/deactivation of monitoring - * (with respect ro RES_LIMITED control) - */ -u_long res_limited_refcnt; - -/* - * Our initial allocation of list entries. - */ -static struct restrictlist resinit[INITRESLIST]; - -/* - * Imported from the timer module - */ -extern u_long current_time; - -/* - * debug flag - */ -extern int debug; - -/* - * init_restrict - initialize the restriction data structures - */ -void -init_restrict() -{ - register int i; - char bp[80]; - - /* - * Zero the list and put all but one on the free list - */ - resfree = 0; - memset((char *)resinit, 0, sizeof resinit); - - for (i = 1; i < INITRESLIST; i++) { - resinit[i].next = resfree; - resfree = &resinit[i]; - } - - numresfree = INITRESLIST-1; - - /* - * Put the remaining item at the head of the - * list as our default entry. Everything in here - * should be zero for now. - */ - resinit[0].addr = htonl(INADDR_ANY); - resinit[0].mask = 0; - restrictlist = &resinit[0]; - restrictcount = 1; - - - /* - * fix up stat counters - */ - res_calls = 0; - res_found = 0; - res_not_found = 0; - res_timereset = 0; - - /* - * set default values for RES_LIMIT functionality - */ - client_limit = 3; - client_limit_period = 3600; - res_limited_refcnt = 0; - - sprintf(bp, "client_limit=%ld", client_limit); - set_sys_var(bp, strlen(bp)+1, RO); - sprintf(bp, "client_limit_period=%ld", client_limit_period); - set_sys_var(bp, strlen(bp)+1, RO); -} - - -/* - * restrictions - return restrictions for this host - */ -int -restrictions(srcadr) - struct sockaddr_in *srcadr; -{ - register struct restrictlist *rl; - register struct restrictlist *match; - register u_long hostaddr; - register int isntpport; - - res_calls++; - /* - * We need the host address in host order. Also need to know - * whether this is from the ntp port or not. - */ - hostaddr = SRCADR(srcadr); - isntpport = (SRCPORT(srcadr) == NTP_PORT); - - /* - * Set match to first entry, which is default entry. Work our - * way down from there. - */ - match = restrictlist; - - for (rl = match->next; rl != 0 && rl->addr <= hostaddr; rl = rl->next) - if ((hostaddr & rl->mask) == rl->addr) { - if ((rl->mflags & RESM_NTPONLY) && !isntpport) - continue; - match = rl; - } - - match->count++; - if (match == restrictlist) - res_not_found++; - else - res_found++; - - /* - * The following implements limiting the number of clients - * accepted from a given network. The notion of "same network" - * is determined by the mask and addr fields of the restrict - * list entry. The monitor mechanism has to be enabled for - * collecting info on current clients. - * - * The policy is as follows: - * - take the list of clients recorded - * from the given "network" seen within the last - * client_limit_period seconds - * - if there are at most client_limit entries: - * --> access allowed - * - otherwise sort by time first seen - * - current client among the first client_limit seen - * hosts? - * if yes: access allowed - * else: eccess denied - */ - if (match->flags & RES_LIMITED) { - int lcnt; - struct mon_data *md, *this_client; - extern int mon_enabled; - extern struct mon_data mon_fifo_list, mon_mru_list; - -#ifdef DEBUG - if (debug > 2) - printf("limited clients check: %ld clients, period %ld seconds, net is 0x%lX\n", - client_limit, client_limit_period, - netof(hostaddr)); -#endif /*DEBUG*/ - if (mon_enabled == MON_OFF) { -#ifdef DEBUG - if (debug > 4) - printf("no limit - monitoring is off\n"); -#endif - return (int)(match->flags & ~RES_LIMITED); - } - - /* - * How nice, MRU list provides our current client as the - * first entry in the list. - * Monitoring was verified to be active above, thus we - * know an entry for our client must exist, or some - * brain dead set the memory limit for mon entries to ZERO!!! - */ - this_client = mon_mru_list.mru_next; - - for (md = mon_fifo_list.fifo_next,lcnt = 0; - md != &mon_fifo_list; - md = md->fifo_next) { - if ((current_time - md->lasttime) - > client_limit_period) { -#ifdef DEBUG - if (debug > 5) - printf("checking: %s: ignore: too old: %ld\n", - numtoa(md->rmtadr), - current_time - md->lasttime); -#endif - continue; - } - if (md->mode == MODE_BROADCAST || - md->mode == MODE_CONTROL || - md->mode == MODE_PRIVATE) { -#ifdef DEBUG - if (debug > 5) - printf("checking: %s: ignore mode %d\n", - numtoa(md->rmtadr), - md->mode); -#endif - continue; - } - if (netof(md->rmtadr) != - netof(hostaddr)) { -#ifdef DEBUG - if (debug > 5) - printf("checking: %s: different net 0x%lX\n", - numtoa(md->rmtadr), - netof(md->rmtadr)); -#endif - continue; - } - lcnt++; - if (lcnt > client_limit || - md->rmtadr == hostaddr) { -#ifdef DEBUG - if (debug > 5) - printf("considering %s: found host\n", - numtoa(md->rmtadr)); -#endif - break; - } -#ifdef DEBUG - else { - if (debug > 5) - printf("considering %s: same net\n", - numtoa(md->rmtadr)); - } -#endif - - } -#ifdef DEBUG - if (debug > 4) - printf("this one is rank %d in list, limit is %lu: %s\n", - lcnt, client_limit, - (lcnt <= client_limit) ? "ALLOW" : "REJECT"); -#endif - if (lcnt <= client_limit) { - this_client->lastdrop = 0; - return (int)(match->flags & ~RES_LIMITED); - } else { - this_client->lastdrop = current_time; - } - } - return (int)match->flags; -} - - -/* - * restrict - add/subtract/manipulate entries on the restrict list - */ -void -restrict(op, resaddr, resmask, mflags, flags) - int op; - struct sockaddr_in *resaddr; - struct sockaddr_in *resmask; - int mflags; - int flags; -{ - register u_long addr; - register u_long mask; - register struct restrictlist *rl; - register struct restrictlist *rlprev; - int i; - - /* - * Get address and mask in host byte order - */ - addr = SRCADR(resaddr); - mask = SRCADR(resmask); - addr &= mask; /* make sure low bits are zero */ - - /* - * If this is the default address, point at first on list. Else - * go searching for it. - */ - if (addr == htonl(INADDR_ANY)) { - rlprev = 0; - rl = restrictlist; - } else { - rlprev = restrictlist; - rl = rlprev->next; - while (rl != 0) { - if (rl->addr > addr) { - rl = 0; - break; - } else if (rl->addr == addr) { - if (rl->mask == mask) { - if ((mflags & RESM_NTPONLY) - == (rl->mflags & RESM_NTPONLY)) - break; /* exact match */ - if (!(mflags & RESM_NTPONLY)) { - /* - * No flag fits before flag - */ - rl = 0; - break; - } - /* continue on */ - } else if (rl->mask > mask) { - rl = 0; - break; - } - } - rlprev = rl; - rl = rl->next; - } - } - /* - * In case the above wasn't clear :-), either rl now points - * at the entry this call refers to, or rl is zero and rlprev - * points to the entry prior to where this one should go in - * the sort. - */ - - /* - * Switch based on operation - */ - switch (op) { - case RESTRICT_FLAGS: - /* - * Here we add bits to the flags. If this is a new - * restriction add it. - */ - if (rl == 0) { - if (numresfree == 0) { - rl = (struct restrictlist *) emalloc( - INCRESLIST*sizeof(struct restrictlist)); - memset((char *)rl, 0, - INCRESLIST*sizeof(struct restrictlist)); - - for (i = 0; i < INCRESLIST; i++) { - rl->next = resfree; - resfree = rl; - rl++; - } - numresfree = INCRESLIST; - } - - rl = resfree; - resfree = rl->next; - numresfree--; - - rl->addr = addr; - rl->mask = mask; - rl->mflags = (u_short)mflags; - - rl->next = rlprev->next; - rlprev->next = rl; - restrictcount++; - } - if ((rl->flags ^ (u_short)flags) & RES_LIMITED) { - res_limited_refcnt++; - mon_start(MON_RES); /* ensure data gets collected */ - } - rl->flags |= (u_short)flags; - break; - - case RESTRICT_UNFLAG: - /* - * Remove some bits from the flags. If we didn't - * find this one, just return. - */ - if (rl != 0) { - if ((rl->flags ^ (u_short)flags) & RES_LIMITED) { - res_limited_refcnt--; - if (res_limited_refcnt == 0) - mon_stop(MON_RES); - } - rl->flags &= (u_short)~flags; - } - break; - - case RESTRICT_REMOVE: - /* - * Remove an entry from the table entirely if we found one. - * Don't remove the default entry and don't remove an - * interface entry. - */ - if (rl != 0 - && rl->addr != htonl(INADDR_ANY) - && !(rl->mflags & RESM_INTERFACE)) { - rlprev->next = rl->next; - restrictcount--; - if (rl->flags & RES_LIMITED) { - res_limited_refcnt--; - if (res_limited_refcnt == 0) - mon_stop(MON_RES); - } - memset((char *)rl, 0, sizeof(struct restrictlist)); - - rl->next = resfree; - resfree = rl; - numresfree++; - } - break; - - default: - /* Oh, well */ - break; - } - - /* done! */ -} diff --git a/usr.sbin/xntpd/xntpd/ntp_timer.c b/usr.sbin/xntpd/xntpd/ntp_timer.c deleted file mode 100644 index 99551f74a9f3..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_timer.c +++ /dev/null @@ -1,187 +0,0 @@ -/* - * ntp_event.c - event timer support routines - */ -#include <stdio.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/time.h> -#include <signal.h> -#include <sys/signal.h> - -#include "ntpd.h" -#include "ntp_stdlib.h" - -/* - * These routines provide support for the event timer. The timer is - * implemented by an interrupt routine which sets a flag once every - * 2**EVENT_TIMEOUT seconds (currently 4), and a timer routine which - * is called when the mainline code gets around to seeing the flag. - * The timer routine dispatches the clock adjustment code if its time - * has come, then searches the timer queue for expiries which are - * dispatched to the transmit procedure. Finally, we call the hourly - * procedure to do cleanup and print a message. - */ - -/* - * Alarm flag. The mainline code imports this. - */ -int alarm_flag; - -/* - * adjust and hourly counters - */ -static u_long adjust_timer; -static u_long hourly_timer; - -/* - * Imported from the leap module. The leap timer. - */ -extern u_long leap_timer; - -/* - * Statistics counter for the interested. - */ -u_long alarm_overflow; - -#define HOUR (60*60) - -/* - * Current_time holds the number of seconds since we started, in - * increments of 2**EVENT_TIMEOUT seconds. The timer queue is the - * hash into which we sort timer entries. - */ -u_long current_time; -struct event timerqueue[TIMER_NSLOTS]; - -/* - * Stats. Number of overflows and number of calls to transmit(). - */ -u_long timer_timereset; -u_long timer_overflows; -u_long timer_xmtcalls; - -static RETSIGTYPE alarming P((int)); - -/* - * init_timer - initialize the timer data structures - */ -void -init_timer() -{ - register int i; - struct itimerval itimer; - - /* - * Initialize... - */ - alarm_flag = 0; - alarm_overflow = 0; - adjust_timer = (1<<CLOCK_ADJ); - hourly_timer = HOUR; - current_time = 0; - timer_overflows = 0; - timer_xmtcalls = 0; - timer_timereset = 0; - - for (i = 0; i < TIMER_NSLOTS; i++) { - /* - * Queue pointers should point at themselves. Event - * times must be set to 0 since this is used to - * detect the queue end. - */ - timerqueue[i].next = &timerqueue[i]; - timerqueue[i].prev = &timerqueue[i]; - timerqueue[i].event_time = 0; - } - - /* - * Set up the alarm interrupt. The first comes 2**EVENT_TIMEOUT - * seconds from now and they continue on every 2**EVENT_TIMEOUT - * seconds. - */ - (void) signal_no_reset(SIGALRM, alarming); - itimer.it_interval.tv_sec = itimer.it_value.tv_sec = (1<<EVENT_TIMEOUT); - itimer.it_interval.tv_usec = itimer.it_value.tv_usec = 0; - setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0); -} - - - -/* - * timer - dispatch anyone who needs to be - */ -void -timer() -{ - register struct event *ev; - register struct event *tq; - - current_time += (1<<EVENT_TIMEOUT); - - /* - * Adjustment timeout first - */ - if (adjust_timer <= current_time) { - adjust_timer += (1<<CLOCK_ADJ); - adj_host_clock(); - } - - /* - * Leap timer next. - */ - if (leap_timer != 0 && leap_timer <= current_time) - leap_process(); - - /* - * Now dispatch any peers whose event timer has expired. - */ - tq = &timerqueue[TIMER_SLOT(current_time)]; - ev = tq->next; - while (ev->event_time != 0 - && ev->event_time < (current_time + (1<<EVENT_TIMEOUT))) { - tq->next = ev->next; - tq->next->prev = tq; - ev->prev = ev->next = 0; - timer_xmtcalls++; - ev->event_handler(ev->peer); - ev = tq->next; - } - - /* - * Finally, call the hourly routine - */ - if (hourly_timer <= current_time) { - hourly_timer += HOUR; - hourly_stats(); - } -} - - -/* - * alarming - tell the world we've been alarmed - */ -static RETSIGTYPE -alarming(sig) -int sig; -{ - extern int initializing; /* from main line code */ - - if (initializing) - return; - if (alarm_flag) - alarm_overflow++; - else - alarm_flag++; -} - - -/* - * timer_clr_stats - clear timer module stat counters - */ -void -timer_clr_stats() -{ - timer_overflows = 0; - timer_xmtcalls = 0; - timer_timereset = current_time; -} diff --git a/usr.sbin/xntpd/xntpd/ntp_unixclock.c b/usr.sbin/xntpd/xntpd/ntp_unixclock.c deleted file mode 100644 index 557ce25eddcb..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_unixclock.c +++ /dev/null @@ -1,634 +0,0 @@ -/* - * ntp_unixclock.c - routines for reading and adjusting a 4BSD-style - * system clock - */ - -#include <nlist.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/time.h> - -#if defined(SYS_HPUX) || defined(sgi) || defined(SYS_BSDI) || defined(SYS_44BSD) -#include <sys/param.h> -#include <utmp.h> -#endif - -#if defined(HAVE_GETBOOTFILE) -#include <paths.h> -#endif - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_unixtime.h" -#include "ntp_stdlib.h" - -#if defined(HAVE_LIBKVM) -#if defined(SYS_BSDI) || defined(SYS_44BSD) -#include <sys/proc.h> -#endif /* SYS_BSDI */ -#include <kvm.h> -#include <limits.h> - -#ifndef _POSIX2_LINE_MAX -#define _POSIX2_LINE_MAX 2048 -#endif -#endif /* HAVE_LIBKVM */ - - -#ifdef RS6000 -#undef hz -#endif /* RS6000 */ - -#ifdef HAVE_SYSCTL -#include <sys/param.h> -#include <sys/sysctl.h> -#include <sys/time.h> -#endif - -extern int debug; -/* - * These routines (init_systime, get_systime, step_systime, adj_systime) - * implement an interface between the (more or less) system independent - * bits of NTP and the peculiarities of dealing with the Unix system - * clock. These routines will run with good precision fairly independently - * of your kernel's value of tickadj. I couldn't tell the difference - * between tickadj==40 and tickadj==5 on a microvax, though I prefer - * to set tickadj == 500/hz when in doubt. At your option you - * may compile this so that your system's clock is always slewed to the - * correct time even for large corrections. Of course, all of this takes - * a lot of code which wouldn't be needed with a reasonable tickadj and - * a willingness to let the clock be stepped occasionally. Oh well. - */ - -/* - * Clock variables. We round calls to adjtime() to adj_precision - * microseconds, and limit the adjustment to tvu_maxslew microseconds - * (tsf_maxslew fractional sec) in one adjustment interval. As we are - * thus limited in the speed and precision with which we can adjust the - * clock, we compensate by keeping the known "error" in the system time - * in sys_clock_offset. This is added to timestamps returned by get_systime(). - * We also remember the clock precision we computed from the kernel in - * case someone asks us. - */ -extern long adj_precision; /* adj precision in usec (tickadj) */ -extern long tvu_maxslew; /* maximum adjust doable in 1<<CLOCK_ADJ sec (usec) */ - -extern u_long tsf_maxslew; /* same as above, as long format */ - -extern l_fp sys_clock_offset; /* correction for current system time */ - -/* - * Import sys_clock (it is updated in get_systime) - */ -extern long sys_clock; - -static void clock_parms P((u_long *, u_long *)); - -/* - * init_systime - initialize the system clock support code, return - * clock precision. - * - * Note that this code obtains to kernel variables related to the local - * clock, tickadj and tick. The code knows how the Berkeley adjtime - * call works, and assumes these two variables are obtainable and are - * used in the same manner. Tick is supposed to be the number of - * microseconds which are added to the system clock at clock interrupt - * time when the time isn't being slewed. Tickadj is supposed to be - * the number of microseconds which are added or subtracted from tick when - * the time is being slewed. - * - * If either of these two variables is missing, or is there but is used - * for a purpose different than that described, you are SOL and may have - * to do some custom kludging. - * - * This really shouldn't be in here. - */ -void -init_systime() -{ - u_long tickadj; - u_long tick; - u_long hz; - - /* - * Obtain the values - */ - clock_parms(&tickadj, &tick); -#ifdef DEBUG - if (debug) - printf("kernel vars: tickadj = %ld, tick = %ld\n", tickadj, tick); -#endif - - /* - * If tickadj or hz wasn't found, we're doomed. If hz is - * unreasonably small, forget it. - */ - if (tickadj == 0 || tick == 0) { - syslog(LOG_ERR, "tickadj or tick unknown, exiting"); - exit(3); - } - if (tick > 65535) { - syslog(LOG_ERR, "tick value of %lu is unreasonably large", - tick); - exit(3); - } - - /* - * Estimate hz from tick - */ - hz = 1000000L / tick; - - /* - * Set adj_precision and the maximum slew based on this. Note - * that maxslew is set slightly shorter than it needs to be as - * insurance that all slews requested will complete in 1<<CLOCK_ADJ - * seconds. - */ -#ifdef ADJTIME_IS_ACCURATE - adj_precision = 1; -#else - adj_precision = tickadj; -#endif /* ADJTIME_IS_ACCURATE */ -#if defined(SLEWALWAYS) && !defined(ADJTIME_IS_ACCURATE) - /* - * give us more time if we are always slewing... just in case - */ - tvu_maxslew = tickadj * (hz-3) * (1<<CLOCK_ADJ); -#else - tvu_maxslew = tickadj * (hz-1) * (1<<CLOCK_ADJ); -#endif /* SLEWALWAYS */ - if (tvu_maxslew > 999990) { - /* - * Don't let the maximum slew exceed 1 second in 4. This - * simplifies calculations a lot since we can then deal - * with less-than-one-second fractions. - */ - tvu_maxslew = (999990/adj_precision) * adj_precision; - } - TVUTOTSF(tvu_maxslew, tsf_maxslew); - syslog(LOG_NOTICE, "tickadj = %d, tick = %d, tvu_maxslew = %d", - tickadj, tick, tvu_maxslew); -#ifdef DEBUG - if (debug) - printf( - "adj_precision = %ld, tvu_maxslew = %ld, tsf_maxslew = 0.%08lx\n", - adj_precision, tvu_maxslew, tsf_maxslew); -#endif - - /* - * Set the current offset to 0 - */ - L_CLR(&sys_clock_offset); -} - -#if defined(HAVE_SYSCTL) && defined(KERN_CLOCKRATE) -static void -clock_parms(tickadj, tick) - u_long *tickadj; - u_long *tick; -{ - int mib[2]; - size_t len; - struct clockinfo x; - - mib[0] = CTL_KERN; - mib[1] = KERN_CLOCKRATE; - len = sizeof(x); - if (sysctl(mib, 2, &x, &len, NULL, 0) == -1) { - syslog(LOG_NOTICE, "sysctl(KERN_CLOCKRATE) failed: %m"); - exit(3); - } - *tickadj = x.tickadj; - *tick = x.tick; -} -#else -#ifdef HAVE_LIBKVM -/* - * clock_parms - return the local clock tickadj and tick parameters - * - * This version uses the SunOS libkvm (or the bsd compatability version). - */ -static void -clock_parms(tickadj, tick) - u_long *tickadj; - u_long *tick; -{ - static struct nlist nl[] = { -#define N_TICKADJ 0 - { "_tickadj" }, -#define N_TICK 1 - { "_tick" }, - { "" }, - }; -#if __convex__ /* { */ - if (K_open((char *)0,O_RDONLY,"/vmunix")!=0) { - syslog(LOG_ERR, "K_open failed"); - exit(3); - } - kusenlist(1); - if (knlist(nl)!=0 - || nl[N_TICKADJ].n_value==0 - || nl[N_TICK].n_value==0) { - syslog(LOG_ERR, "knlist failed"); - exit(3); - } - if (K_read(tickadj,sizeof(*tickadj),nl[N_TICKADJ].n_value) != - sizeof(*tickadj)) { - syslog(LOG_ERR, "K_read tickadj failed"); - exit(3); - } - if (K_read(tick,sizeof(*tick),nl[N_TICK].n_value) != - sizeof(*tick)) { - syslog(LOG_ERR, "K_read tick failed"); - exit(3); - } - (void)K_close(); -#else /* }__convex__{ */ - register kvm_t *kd; - if ((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL)) == NULL) { - syslog(LOG_ERR, "kvm_open failed"); - exit(3); - } - if (kvm_nlist(kd, nl) != 0) { - syslog(LOG_ERR, "kvm_nlist failed"); - exit(3); - } - if (kvm_read(kd, nl[N_TICKADJ].n_value, (char *)tickadj, sizeof(*tickadj)) != - sizeof(*tickadj)) { - syslog(LOG_ERR, "kvm_read tickadj failed"); - exit(3); - } - if (kvm_read(kd, nl[N_TICK].n_value, (char *)tick, sizeof(*tick)) != - sizeof(*tick)) { - syslog(LOG_ERR, "kvm_read tick failed"); - exit(3); - } - if (kvm_close(kd) < 0) { - syslog(LOG_ERR, "kvm_close failed"); - exit(3); - } -#endif /*}convex*/ -#undef N_TICKADJ -#undef N_TICK -} -#endif /* HAVE_LIBKVM */ - - -#ifdef HAVE_READKMEM -/* - * clock_parms - return the local clock tickadj and tick parameters - * - * Note that this version grovels about in /dev/kmem to determine - * these values. This probably should be elsewhere. - */ -#if defined(SYS_UNIXWARE1) -/* - * clock_parms - return the local clock tickadj and tick parameters - * - * The values set here were determined experimentally on a 486 system - * I'm not confident in them. - RAS - * - */ -static void -clock_parms(tickadj, tick) - u_long *tickadj; - u_long *tick; -{ - *tick = 10000; /* microseconds */ - *tickadj = 80; /* microseconds */ -} -#else /* SYS_UNIXWARE1 */ - -#if defined(SYS_AUX3) || defined(SYS_AUX2) || defined(SYS_SVR4) || defined(SYS_PTX) -#define K_TICKADJ_NAME "tickadj" -#define K_TICK_NAME "tick" -#endif - -#ifdef SYS_HPUX -#if defined(hp9000s300) -#define K_TICKADJ_NAME "_tickadj" -#define K_TICK_NAME "_old_tick" -#else -#define K_TICKADJ_NAME "tickadj" -#define K_TICK_NAME "old_tick" -#endif -#endif - -/* The defaults if not defined previously */ -#if !defined(K_TICKADJ_NAME) -#define K_TICKADJ_NAME "_tickadj" -#endif -#if !defined(K_TICK_NAME) -#define K_TICK_NAME "_tick" -#endif - -static void -clock_parms(tickadj, tick) - u_long *tickadj; - u_long *tick; -{ - register int i; - int kmem; -#if defined(HAVE_N_UN) -#define N_NAME n_un.n_name - static struct nlist nl[] = - { {{K_TICKADJ_NAME}}, - {{K_TICK_NAME}}, - {{""}}, - }; -#else -#define N_NAME n_name - static struct nlist nl[] = - { {K_TICKADJ_NAME}, - {K_TICK_NAME}, - {""}, - }; -#endif -#ifdef HAVE_GETBOOTFILE - const char *kernelname; -#else - static char *kernelnames[] = { - "/kernel", - "/vmunix", - "/unix", - "/mach", - "/hp-ux", - "/386bsd", - "/netbsd", -#ifdef KERNELFILE - KERNELFILE, -#endif - NULL - }; -#endif - struct stat stbuf; - int vars[2]; - -#define K_TICKADJ 0 -#define K_TICK 1 - - /* - * Check to see what to use for the object file for names and get - * the locations of the necessary kernel variables. - */ -#ifdef HAVE_GETBOOTFILE - kernelname = getbootfile(); - if (kernelname && - ((stat(kernelname, &stbuf) == -1) || (nlist(kernelname, nl) < 0))) { -#else - for (i = 0; kernelnames[i] != NULL; i++) { - if (stat(kernelnames[i], &stbuf) == -1) - continue; - if (nlist(kernelnames[i], nl) >= 0) - break; - } - if (kernelnames[i] == NULL) { -#endif - syslog(LOG_ERR, - "Clock init couldn't find kernel object file"); - exit(3); - } - - /* - * Read clock parameters from kernel - */ - kmem = open("/dev/kmem", O_RDONLY); - if (kmem < 0) { - syslog(LOG_ERR, "Can't open /dev/kmem for reading: %m"); -#ifdef DEBUG - if (debug) - perror("/dev/kmem"); -#endif - exit(3); - } - - for (i = 0; i < (sizeof(vars)/sizeof(vars[0])); i++) { - off_t where; - - vars[i] = 0; - if ((where = nl[i].n_value) == 0) { - syslog(LOG_ERR, "Unknown kernal var %s", - nl[i].N_NAME); - continue; - } - if (lseek(kmem, where, SEEK_SET) == -1) { - syslog(LOG_ERR, "lseek for %s fails: %m", - nl[i].N_NAME); - continue; - } - if (read(kmem, &vars[i], sizeof(int)) != sizeof(int)) { - syslog(LOG_ERR, "read for %s fails: %m", - nl[i].N_NAME); - } - } - close(kmem); - - *tickadj = (u_long)vars[K_TICKADJ]; - *tick = (u_long)vars[K_TICK]; - -#undef K_TICKADJ -#undef K_TICK -#undef K_TICKADJ_NAME -#undef K_TICK_NAME -#undef N_NAME -} -#endif /* SYS_UNIXWARE1 */ -#endif /* HAVE_READKMEM */ - -#if defined(SOLARIS)&&defined(ADJTIME_IS_ACCURATE) -/* - * clock_parms for Solaris 2.2 and later, with high-res timer kernel code. - * The clock code changed in Solaris 2.2, and tickadj went away. - * The good news is that ADJTIME_IS_ACCURATE and tick is available through - * sysconf(). - */ -static void -clock_parms(tickadj, tick) - u_long *tickadj; - u_long *tick; -{ - int hz; - - hz = (int) sysconf (_SC_CLK_TCK); - *tick = 1000000L/hz; - *tickadj = (*tick/16); /* There is no tickadj, and it is only set here - for tvu_maxslew calculation above. Really, - clock_parms should return adj_precision - and tvu_maxslew, instead of the very - BSD-centric tickadj */ - -#ifdef DEBUG - if (debug) printf ("Solaris tick = %d\n", *tick); -#endif -} -#endif /* SOLARIS_HRTIME */ - - -#if defined(sgi) -/* - * clock_parms - return the local clock tickadj and tick parameters - * - * The values set here were determined experimentally on a 4D/220 and - * an R4000-50 server under IRIX 4.0.5. - */ -static void -clock_parms(tickadj, tick) - u_long *tickadj; - u_long *tick; -{ - *tick = 10000; - *tickadj = 150; -} -#endif /* sgi */ - -#ifdef NOKMEM - -#ifndef HZ -#define HZ 60 -#endif - -/* - * clock_parms - return the local clock tickadj and tick parameters - * - * Note that this version uses static values! - */ -static void -clock_parms(tickadj, tick) - u_long *tickadj; - u_long *tick; -{ -#ifdef RS6000 - *tickadj = 1000; -#else /*RS6000*/ -#if SYS_DOMAINOS - *tickadj = 668; -#else /*SYS_DOMAINOS*/ - *tickadj = 500 / HZ; -#endif /*SYS_DOMAINOS*/ -#endif /*RS6000*/ - *tick = 1000000L / HZ; - -#ifdef DEBUG - if (debug) - printf("NOTE: Using preset values for tick and tickadj !!\n"); -#endif -} -#endif /*NOKMEM*/ - -#if ((defined(SOLARIS)&&!defined(ADJTIME_IS_ACCURATE))|| (defined(RS6000)&&!defined(NOKMEM))||defined(SYS_SINIXM) ) -#ifndef _SC_CLK_TCK -#include <unistd.h> -#endif -/* - * clock_parms - return the local clock tickadj and tick parameters - * - * Note that this version grovels about in /dev/kmem to determine - * these values. This probably should be elsewhere. - */ -static void -clock_parms(tickadj, tick) - u_long *tickadj; - u_long *tick; -{ - register int i; - int kmem; -#define N_NAME n_name - static struct nlist nl[] = - { {"tickadj"}, - {""}, - }; - static char *kernelnames[] = { - "/kernel/unix", - "/unix", - NULL - }; - struct stat stbuf; - int vars[1]; - -#define K_TICKADJ 0 - /* - * Read clock parameters from kernel - */ - kmem = open("/dev/kmem", O_RDONLY); - if (kmem < 0) { - syslog(LOG_ERR, "Can't open /dev/kmem for reading: %m"); -#ifdef DEBUG - if (debug) - perror("/dev/kmem"); -#endif - exit(3); - } - - for (i = 0; kernelnames[i] != NULL; i++) { - if (stat(kernelnames[i], &stbuf) == -1) - continue; - if (nlist(kernelnames[i], nl) >= 0) - break; - } - if (kernelnames[i] == NULL) { - syslog(LOG_ERR, - "Clock init couldn't find kernel as either /vmunix or /unix"); - exit(3); - } - - for (i = 0; i < (sizeof(vars)/sizeof(vars[0])); i++) { - off_t where; - - vars[i] = 0; - if ((where = nl[i].n_value) == 0) { - syslog(LOG_ERR, "Unknown kernal var %s", - nl[i].N_NAME); - continue; - } - if (lseek(kmem, where, SEEK_SET) == -1) { - syslog(LOG_ERR, "lseek for %s fails: %m", - nl[i].N_NAME); - continue; - } - if (read(kmem, &vars[i], sizeof(int)) != sizeof(int)) { - syslog(LOG_ERR, "read for %s fails: %m", - nl[i].N_NAME); - } -#if defined(RS6000) - /* - * Aix requires one more round of indirection. - */ - if (lseek(kmem, vars[i], SEEK_SET) == -1) { - syslog(LOG_ERR, "lseek for %s fails: %m", - nl[i].N_NAME); - continue; - } - if (read(kmem, &vars[i], sizeof(int)) != sizeof(int)) { - syslog(LOG_ERR, "read for %s fails: %m", - nl[i].N_NAME); - } -#endif - } - close(kmem); - - *tickadj = (u_long)vars[K_TICKADJ]; - *tick = (u_long)(1000000/sysconf(_SC_CLK_TCK)); - -#undef K_TICKADJ -#undef N_NAME -} -#endif /* SOLARIS */ - -#ifdef SYS_LINUX -#include "sys/timex.h" -static void -clock_parms(tickadj, tick) - u_long *tickadj; - u_long *tick; -{ - struct timex txc; - - txc.mode = 0; - __adjtimex(&txc); - - *tickadj = (u_long)1; /* our adjtime is accurate */ - *tick = (u_long)txc.tick; -} -#endif /* SYS_LINUX */ -#endif diff --git a/usr.sbin/xntpd/xntpd/ntp_util.c b/usr.sbin/xntpd/xntpd/ntp_util.c deleted file mode 100644 index e44927631984..000000000000 --- a/usr.sbin/xntpd/xntpd/ntp_util.c +++ /dev/null @@ -1,441 +0,0 @@ -/* - * ntp_util.c - stuff I didn't have any other place for - */ -#include <stdio.h> -#include <errno.h> -#include <ctype.h> -#include <sys/types.h> -#include <sys/ioctl.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_unixtime.h" -#include "ntp_filegen.h" -#include "ntp_if.h" -#include "ntp_stdlib.h" - -#ifdef DOSYNCTODR -#include <sys/resource.h> -#endif - -/* - * This contains odds and ends. Right now the only thing you'll find - * in here is the hourly stats printer and some code to support rereading - * the keys file, but I may eventually put other things in here such as - * code to do something with the leap bits. - */ - -/* - * Name of the keys file - */ -static char *key_file_name; - -/* - * The name of the drift_comp file and the temporary. - */ -static char *stats_drift_file; -static char *stats_temp_file; - -/* - * Statistics file stuff - */ -#ifndef NTP_VAR -#define NTP_VAR "/var/NTP/" /* NOTE the trailing '/' */ -#endif - -#ifndef MAXPATHLEN -#define MAXPATHLEN 1024 -#endif - -static char statsdir[MAXPATHLEN] = NTP_VAR; - -static FILEGEN peerstats; -static FILEGEN loopstats; -static FILEGEN clockstats; -/* - * We query the errno to see what kind of error occured - * when opening the drift file. - */ -extern int errno; - -/* - * This controls whether stats are written to the fileset. Provided - * so that xntpdc can turn off stats when the file system fills up. - */ -int stats_control; - -#ifdef DEBUG -extern int debug; -#endif - -/* - * init_util - initialize the utilities - */ -void -init_util() -{ - stats_drift_file = 0; - stats_temp_file = 0; - key_file_name = 0; - -#define PEERNAME "peerstats" -#define LOOPNAME "loopstats" -#define CLOCKNAME "clockstats" - peerstats.fp = NULL; - peerstats.prefix = &statsdir[0]; - peerstats.basename = emalloc(strlen(PEERNAME)+1); - strcpy(peerstats.basename, PEERNAME); - peerstats.id = 0; - peerstats.type = FILEGEN_DAY; - peerstats.flag = FGEN_FLAG_LINK; /* not yet enabled !!*/ - filegen_register("peerstats", &peerstats); - - loopstats.fp = NULL; - loopstats.prefix = &statsdir[0]; - loopstats.basename = emalloc(strlen(LOOPNAME)+1); - strcpy(loopstats.basename, LOOPNAME); - loopstats.id = 0; - loopstats.type = FILEGEN_DAY; - loopstats.flag = FGEN_FLAG_LINK; /* not yet enabled !!*/ - filegen_register("loopstats", &loopstats); - - clockstats.fp = NULL; - clockstats.prefix = &statsdir[0]; - clockstats.basename = emalloc(strlen(CLOCKNAME)+1); - strcpy(clockstats.basename, CLOCKNAME); - clockstats.id = 0; - clockstats.type = FILEGEN_DAY; - clockstats.flag = FGEN_FLAG_LINK; /* not yet enabled !!*/ - filegen_register("clockstats", &clockstats); - -#undef PEERNAME -#undef LOOPNAME -#undef CLOCKNAME - -} - - -/* - * hourly_stats - print some interesting stats - */ -void -hourly_stats() -{ - FILE *fp; - extern l_fp last_offset; - extern s_fp drift_comp; - extern u_char sys_poll; - extern int pll_status; - -#ifdef DOSYNCTODR - struct timeval tv; - int o_prio; - - /* - * Sometimes having a Sun can be a drag. - * - * The kernel variable dosynctodr controls whether the system's - * soft clock is kept in sync with the battery clock. If it - * is zero, then the soft clock is not synced, and the battery - * clock is simply left to rot. That means that when the system - * reboots, the battery clock (which has probably gone wacky) - * sets the soft clock. That means xntpd starts off with a very - * confused idea of what time it is. It then takes a large - * amount of time to figure out just how wacky the battery clock - * has made things drift, etc, etc. The solution is to make the - * battery clock sync up to system time. The way to do THAT is - * to simply set the time of day to the current time of day, but - * as quickly as possible. This may, or may not be a sensible - * thing to do. - * - * CAVEAT: settimeofday() steps the sun clock by about 800 us, - * so setting DOSYNCTODR seems a bad idea in the - * case of us resolution - */ - - o_prio=getpriority(PRIO_PROCESS,0); /* Save setting */ - if (setpriority(PRIO_PROCESS,0,-20) != 0) /* overdrive */ - { - syslog(LOG_ERR, "can't elevate priority: %m"); - goto skip; - } - GETTIMEOFDAY(&tv,(struct timezone *)NULL); - if (SETTIMEOFDAY(&tv,(struct timezone *)NULL) != 0) - { - syslog(LOG_ERR, "can't sync battery time: %m"); - } - setpriority(PRIO_PROCESS,0,o_prio); /* downshift */ - - skip: -#endif - - syslog(LOG_INFO, "offset %s freq %s poll %d", - lfptoa(&last_offset, 6), fptoa(drift_comp, 3), - sys_poll); - - if (stats_drift_file != 0) { - if ((fp = fopen(stats_temp_file, "w")) == NULL) { - syslog(LOG_ERR, "can't open %s: %m", - stats_temp_file); - return; - } - fprintf(fp, "%s %x\n", fptoa(drift_comp, 3), - pll_status); - (void)fclose(fp); - /* atomic */ - (void) rename(stats_temp_file, stats_drift_file); - } -} - - -/* - * stats_config - configure the stats operation - */ -void -stats_config(item, value) - int item; - char *value; /* only one type so far */ -{ - FILE *fp; - char buf[128]; - l_fp old_drift; - int temp = 0; - int len; - - switch(item) { - case STATS_FREQ_FILE: - if (stats_drift_file != 0) { - (void) free(stats_drift_file); - (void) free(stats_temp_file); - stats_drift_file = 0; - stats_temp_file = 0; - } - - if (value == 0 || (len = strlen(value)) == 0) - break; - - stats_drift_file = emalloc((u_int)(len + 1)); - stats_temp_file = emalloc((u_int)(len + - sizeof(".TEMP"))); - memmove(stats_drift_file, value, len+1); - memmove(stats_temp_file, value, len); - memmove(stats_temp_file + len, ".TEMP", - sizeof(".TEMP")); - L_CLR(&old_drift); - - /* - * Open drift file and read frequency and mode. - */ - if ((fp = fopen(stats_drift_file, "r")) == NULL) { - if (errno != ENOENT) - syslog(LOG_ERR, "can't open %s: %m", - stats_drift_file); - loop_config(LOOP_DRIFTCOMP, &old_drift, 0); - break; - } - - if (fscanf(fp, "%s %x", buf, &temp) == 0) { - syslog(LOG_ERR, "can't read %s: %m", - stats_drift_file); - (void) fclose(fp); - loop_config(LOOP_DRIFTCOMP, &old_drift, 0); - break; - } - (void) fclose(fp); - if (!atolfp(buf, &old_drift)) { - syslog(LOG_ERR, "drift value %s invalid", buf); - break; - } - loop_config(LOOP_DRIFTCOMP, &old_drift, temp); - break; - - case STATS_STATSDIR: - if (strlen(value) >= sizeof(statsdir)) { - syslog(LOG_ERR, - "value for statsdir too long (>%d, sigh)", - sizeof(statsdir)-1); - } else { - l_fp now; - - gettstamp(&now); - strcpy(statsdir,value); - if(peerstats.prefix == &statsdir[0] && - peerstats.fp != NULL) { - fclose(peerstats.fp); - peerstats.fp = NULL; - filegen_setup(&peerstats, now.l_ui); - } - if(loopstats.prefix == &statsdir[0] && - loopstats.fp != NULL) { - fclose(loopstats.fp); - loopstats.fp = NULL; - filegen_setup(&loopstats, now.l_ui); - } - if(clockstats.prefix == &statsdir[0] && - clockstats.fp != NULL) { - fclose(clockstats.fp); - clockstats.fp = NULL; - filegen_setup(&clockstats, now.l_ui); - } - } - break; - - case STATS_PID_FILE: - if ((fp = fopen(value, "w")) == NULL) { - syslog(LOG_ERR, "Can't open %s: %m", value); - break; - } - fprintf(fp, "%d", getpid()); - fclose(fp);; - break; - - default: - /* oh well */ - break; - } -} - -/* - * record_peer_stats - write peer statistics to file - * - * file format: - * day (mjd) - * time (s past midnight) - * peer (ip address) - * peer status word (hex) - * peer offset (s) - * peer delay (s) - * peer dispersion (s) - */ -void -record_peer_stats(addr, status, offset, delay, dispersion) - struct sockaddr_in *addr; - int status; - l_fp *offset; - s_fp delay; - u_fp dispersion; -{ - struct timeval tv; - u_long day, sec, msec; - - if (!stats_control) - return; - GETTIMEOFDAY(&tv, (struct timezone *)NULL); - day = tv.tv_sec / 86400 + MJD_1970; - sec = tv.tv_sec % 86400; - msec = tv.tv_usec / 1000; - - filegen_setup(&peerstats, (u_long)(tv.tv_sec + JAN_1970)); - if (peerstats.fp != NULL) { - fprintf(peerstats.fp, "%lu %lu.%03lu %s %x %s %s %s\n", - day, sec, msec, ntoa(addr), status, lfptoa(offset, 6), - fptoa(delay, 5), ufptoa(dispersion, 5)); - fflush(peerstats.fp); - } -} -/* - * record_loop_stats - write loop filter statistics to file - * - * file format: - * day (mjd) - * time (s past midnight) - * offset (s) - * frequency (approx ppm) - * time constant (log base 2) - */ -void -record_loop_stats(offset, freq, poll) - l_fp *offset; - s_fp freq; - u_char poll; -{ - struct timeval tv; - u_long day, sec, msec; - - if (!stats_control) - return; - GETTIMEOFDAY(&tv, (struct timezone *)NULL); - day = tv.tv_sec / 86400 + MJD_1970; - sec = tv.tv_sec % 86400; - msec = tv.tv_usec / 1000; - - filegen_setup(&loopstats, (u_long)(tv.tv_sec + JAN_1970)); - if (loopstats.fp != NULL) { - fprintf(loopstats.fp, "%lu %lu.%03lu %s %s %d\n", - day, sec, msec, lfptoa(offset, 6), - fptoa(freq, 4), poll); - fflush(loopstats.fp); - } -} - -/* - * record_clock_stats - write clock statistics to file - * - * file format: - * day (mjd) - * time (s past midnight) - * peer (ip address) - * text message - */ -void -record_clock_stats(addr, text) - struct sockaddr_in *addr; - char *text; -{ - struct timeval tv; - u_long day, sec, msec; - - if (!stats_control) - return; - GETTIMEOFDAY(&tv, (struct timezone *)NULL); - day = tv.tv_sec / 86400 + MJD_1970; - sec = tv.tv_sec % 86400; - msec = tv.tv_usec / 1000; - - filegen_setup(&clockstats, (u_long)(tv.tv_sec + JAN_1970)); - if (clockstats.fp != NULL) { - fprintf(clockstats.fp, "%lu %lu.%03lu %s %s\n", - day, sec, msec, ntoa(addr), text); - fflush(clockstats.fp); - } -} - -/* - * getauthkeys - read the authentication keys from the specified file - */ -void -getauthkeys(keyfile) - char *keyfile; -{ - int len; - - len = strlen(keyfile); - if (len == 0) - return; - - if (key_file_name != 0) { - if (len > (int)strlen(key_file_name)) { - (void) free(key_file_name); - key_file_name = 0; - } - } - - if (key_file_name == 0) - key_file_name = emalloc((u_int)(len + 1)); - - memmove(key_file_name, keyfile, len+1); - - authreadkeys(key_file_name); -} - - -/* - * rereadkeys - read the authentication key file over again. - */ -void -rereadkeys() -{ - if (key_file_name != 0) - authreadkeys(key_file_name); -} diff --git a/usr.sbin/xntpd/xntpd/ntpd.c b/usr.sbin/xntpd/xntpd/ntpd.c deleted file mode 100644 index bd3600442d01..000000000000 --- a/usr.sbin/xntpd/xntpd/ntpd.c +++ /dev/null @@ -1,463 +0,0 @@ -/* - * ntpd.c - main program for the fixed point NTP daemon - * - * $FreeBSD$ - */ -#include <stdio.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/param.h> -#include <sys/signal.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/resource.h> -#if defined(SYS_HPUX) -#include <sys/lock.h> -#include <sys/rtprio.h> -#endif - -#if defined(SYS_SVR4) || defined (SYS_UNIXWARE1) -#include <termios.h> -#endif - -#if (defined(SYS_SOLARIS)&&!defined(bsd)) || defined(__svr4__) -#include <termios.h> -#endif - -#include "ntpd.h" -#include "ntp_select.h" -#include "ntp_io.h" -#include "ntp_stdlib.h" - -#ifdef LOCK_PROCESS -#ifdef SYS_SOLARIS -#include <sys/mman.h> -#else -#include <sys/lock.h> -#endif -#endif - -/* - * Signals we catch for debugging. If not debugging we ignore them. - */ -#define MOREDEBUGSIG SIGUSR1 -#define LESSDEBUGSIG SIGUSR2 - -/* - * Signals which terminate us gracefully. - */ -#define SIGDIE1 SIGHUP -#define SIGDIE2 SIGINT -#define SIGDIE3 SIGQUIT -#define SIGDIE4 SIGTERM - -/* - * Scheduling priority we run at - */ -#define NTPD_PRIO (-12) - -/* - * Debugging flag - */ -int debug; - -/* - * Initializing flag. All async routines watch this and only do their - * thing when it is clear. - */ -int initializing; - -/* - * Version declaration - */ -extern char *Version; - -/* - * Alarm flag. Imported from timer module - */ -extern int alarm_flag; - -#if !defined(SYS_386BSD) && !defined(SYS_BSDI) && !defined(SYS_44BSD) -/* - * We put this here, since the argument profile is syscall-specific - */ -extern int syscall P((int, struct timeval *, struct timeval *)); -#endif /* !SYS_386BSD */ - -#ifdef SIGDIE1 -static RETSIGTYPE finish P((int)); -#endif /* SIGDIE1 */ - -#ifdef DEBUG -static RETSIGTYPE moredebug P((int)); -static RETSIGTYPE lessdebug P((int)); -#endif /* DEBUG */ - -/* - * Main program. Initialize us, disconnect us from the tty if necessary, - * and loop waiting for I/O and/or timer expiries. - */ -int -main(argc, argv) - int argc; - char *argv[]; -{ - char *cp; - int was_alarmed; - struct recvbuf *rbuflist; - struct recvbuf *rbuf; - - initializing = 1; /* mark that we are initializing */ - debug = 0; /* no debugging by default */ - - getstartup(argc, argv); /* startup configuration, may set debug */ - -#ifndef NODETACH - /* - * Detach us from the terminal. May need an #ifndef GIZMO. - */ -#ifdef DEBUG - if (!debug) { -#endif /* DEBUG */ -#undef BSD19906 -#if defined(BSD)&&!defined(sun)&&!defined(SYS_SINIXM) -#if (BSD >= 199006 && !defined(i386)) -#define BSD19906 -#endif /* BSD... */ -#endif /* BSD sun */ -#if defined(BSD19906) || defined(SYS_44BSD) - daemon(0, 0); -#else /* BSD19906 */ - if (fork()) - exit(0); - - { - u_long s; - int max_fd; -#if defined(NTP_POSIX_SOURCE) && !defined(SYS_386BSD) - max_fd = sysconf(_SC_OPEN_MAX); -#else /* NTP_POSIX_SOURCE */ - max_fd = getdtablesize(); -#endif /* NTP_POSIX_SOURCE */ - for (s = 0; s < max_fd; s++) - (void) close(s); - (void) open("/", 0); - (void) dup2(0, 1); - (void) dup2(0, 2); -#ifdef NTP_POSIX_SOURCE -#if defined(SOLARIS) || defined(SYS_PTX) || defined(SYS_AUX3) || defined(SYS_AIX) || defined(SYS_ULTRIX) - (void) setsid(); -#else - (void) setpgid(0, 0); -#endif -#else /* NTP_POSIX_SOURCE */ -#ifdef HAVE_ATT_SETPGRP - (void) setpgrp(); -#else /* HAVE_ATT_SETPGRP */ - (void) setpgrp(0, getpid()); -#endif /* HAVE_ATT_SETPGRP */ -#if defined(SYS_HPUX) - if (fork()) - exit(0); -#else /* SYS_HPUX */ -#ifdef SYS_DOMAINOS -/* - * This breaks... the program fails to listen to any packets coming - * in on the UDP socket. So how do you break terminal affiliation? - */ -#else /* SYS_DOMAINOS */ - { - int fid; - - fid = open("/dev/tty", 2); - if (fid >= 0) { - (void) ioctl(fid, (u_long) TIOCNOTTY, - (char *) 0); - (void) close(fid); - } - (void) setpgrp(0, getpid()); - } -#endif /* SYS_DOMAINOS */ -#endif /* SYS_HPUX */ -#endif /* NTP_POSIX_SOURCE */ - } -#endif /* BSD19906 */ -#ifdef DEBUG - } -#endif /* DEBUG */ -#endif /* NODETACH */ - - /* - * Logging. This may actually work on the gizmo board. Find a name - * to log with by using the basename of argv[0] - */ - cp = strrchr(argv[0], '/'); - if (cp == 0) - cp = argv[0]; - else - cp++; - -#ifndef LOG_DAEMON - openlog(cp, LOG_PID); -#else - -#ifndef LOG_NTP -#define LOG_NTP LOG_DAEMON -#endif - openlog(cp, LOG_PID | LOG_NDELAY, LOG_NTP); -#ifdef DEBUG - if (debug) - setlogmask(LOG_UPTO(LOG_DEBUG)); - else -#endif /* DEBUG */ - setlogmask(LOG_UPTO(LOG_DEBUG)); /* @@@ was INFO */ -#endif /* LOG_DAEMON */ - - syslog(LOG_NOTICE, Version); - - -#if defined(SYS_HPUX) - /* - * Lock text into ram, set real time priority - */ - if (plock(TXTLOCK) < 0) - syslog(LOG_ERR, "plock() error: %m"); - if (rtprio(0, 120) < 0) - syslog(LOG_ERR, "rtprio() error: %m"); -#else -#if defined(LOCK_PROCESS) -#if defined(MCL_CURRENT) && defined(MCL_FUTURE) - /* - * lock the process into memory - */ - if (mlockall(MCL_CURRENT|MCL_FUTURE) < 0) - syslog(LOG_ERR, "mlockall(): %m"); -#else -#if defined(PROCLOCK) - /* - * lock the process into memory - */ - if (plock(PROCLOCK) < 0) - syslog(LOG_ERR, "plock(): %m"); -#endif -#endif -#endif -#if defined(NTPD_PRIO) && NTPD_PRIO != 0 - /* - * Set the priority. - */ -#ifdef HAVE_ATT_NICE - nice (NTPD_PRIO); -#endif /* HAVE_ATT_NICE */ -#ifdef HAVE_BSD_NICE - (void) setpriority(PRIO_PROCESS, 0, NTPD_PRIO); -#endif /* HAVE_BSD_NICE */ - -#endif /* !PROCLOCK || !LOCK_PROCESS */ -#endif /* SYS_HPUX */ - - /* - * Set up signals we pay attention to locally. - */ -#ifdef SIGDIE1 - (void) signal_no_reset(SIGDIE1, finish); -#endif /* SIGDIE1 */ -#ifdef SIGDIE2 - (void) signal_no_reset(SIGDIE2, finish); -#endif /* SIGDIE2 */ -#ifdef SIGDIE3 - (void) signal_no_reset(SIGDIE3, finish); -#endif /* SIGDIE3 */ -#ifdef SIGDIE4 - (void) signal_no_reset(SIGDIE4, finish); -#endif /* SIGDIE4 */ - -#ifdef DEBUG - (void) signal_no_reset(MOREDEBUGSIG, moredebug); - (void) signal_no_reset(LESSDEBUGSIG, lessdebug); -#else - (void) signal_no_reset(MOREDEBUGSIG, SIG_IGN); - (void) signal_no_reset(LESSDEBUGSIG, SIG_IGN); -#endif /* DEBUG */ - - /* - * Set up signals we should never pay attention to. - */ -#ifdef SIGPIPE - (void) signal_no_reset(SIGPIPE, SIG_IGN); -#endif /* SIGPIPE */ - - /* - * Call the init_ routines to initialize the data structures. - * Note that init_systime() may run a protocol to get a crude - * estimate of the time as an NTP client when running on the - * gizmo board. It is important that this be run before - * init_subs() since the latter uses the time of day to seed - * the random number generator. That is not the only - * dependency between these, either, be real careful about - * reordering. - */ - init_auth(); - init_util(); - init_restrict(); - init_mon(); - init_systime(); - init_timer(); - init_lib(); - init_random(); - init_request(); - init_control(); - init_leap(); - init_peer(); -#ifdef REFCLOCK - init_refclock(); -#endif - init_proto(); - init_io(); - init_loopfilter(); - - mon_start(MON_ON); /* monitor on by default now */ - /* turn off in config if unwanted */ - - /* - * Get configuration. This (including argument list parsing) is - * done in a separate module since this will definitely be different - * for the gizmo board. - */ - getconfig(argc, argv); - initializing = 0; - - /* - * Report that we're up to any trappers - */ - report_event(EVNT_SYSRESTART, (struct peer *)0); - - /* - * Use select() on all on all input fd's for unlimited - * time. select() will terminate on SIGALARM or on the - * reception of input. Using select() means we can't do - * robust signal handling and we get a potential race - * between checking for alarms and doing the select(). - * Mostly harmless, I think. - */ - was_alarmed = 0; - rbuflist = (struct recvbuf *)0; - for (;;) { -#ifndef HAVE_SIGNALED_IO - extern fd_set activefds; - extern int maxactivefd; - - fd_set rdfdes; - int nfound; -#else - block_io_and_alarm(); -#endif - - - rbuflist = getrecvbufs(); /* get received buffers */ - if (alarm_flag) { /* alarmed? */ - was_alarmed = 1; - alarm_flag = 0; - } - - if (!was_alarmed && rbuflist == (struct recvbuf *)0) { - /* - * Nothing to do. Wait for something. - */ -#ifndef HAVE_SIGNALED_IO - rdfdes = activefds; - nfound = select(maxactivefd+1, &rdfdes, (fd_set *)0, - (fd_set *)0, (struct timeval *)0); - if (nfound > 0) { - l_fp ts; - - get_systime(&ts); - (void)input_handler(&ts); - } else if (nfound == -1 && errno != EINTR) - syslog(LOG_ERR, "select() error: %m"); -#else - wait_for_signal(); -#endif - if (alarm_flag) { /* alarmed? */ - was_alarmed = 1; - alarm_flag = 0; - } - rbuflist = getrecvbufs(); /* get received buffers */ - } -#ifdef HAVE_SIGNALED_IO - unblock_io_and_alarm(); -#endif - - /* - * Out here, signals are unblocked. Call timer routine - * to process expiry. - */ - if (was_alarmed) { - timer(); - was_alarmed = 0; - } - - /* - * Call the data procedure to handle each received - * packet. - */ - while (rbuflist != (struct recvbuf *)0) { - rbuf = rbuflist; - rbuflist = rbuf->next; - (rbuf->receiver)(rbuf); - freerecvbuf(rbuf); - } - /* - * Go around again - */ - } -} - - -#ifdef SIGDIE1 -/* - * finish - exit gracefully - */ -static RETSIGTYPE -finish(sig) -int sig; -{ - - /* - * Log any useful info before exiting. - */ -#ifdef notdef - log_exit_stats(); -#endif - exit(0); -} -#endif /* SIGDIE1 */ - - -#ifdef DEBUG -/* - * moredebug - increase debugging verbosity - */ -static RETSIGTYPE -moredebug(sig) -int sig; -{ - if (debug < 255) { - debug++; - syslog(LOG_DEBUG, "debug raised to %d", debug); - } -} - -/* - * lessdebug - decrease debugging verbosity - */ -static RETSIGTYPE -lessdebug(sig) -int sig; -{ - if (debug > 0) { - debug--; - syslog(LOG_DEBUG, "debug lowered to %d", debug); - } -} -#endif /* DEBUG */ diff --git a/usr.sbin/xntpd/xntpd/refclock_acts.c b/usr.sbin/xntpd/xntpd/refclock_acts.c deleted file mode 100644 index ad3c33a881a6..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_acts.c +++ /dev/null @@ -1,895 +0,0 @@ -/* - * refclock_acts - clock driver for the NIST Automated Computer Time - * Service aka Amalgamated Containerized Trash Service (ACTS) - */ -#if defined(REFCLOCK) && defined(ACTS) - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_unixtime.h" -#include "ntp_refclock.h" -#include "ntp_stdlib.h" - -/* - * 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 is - * designed primarily for use as a backup 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 a residence telephone in Newark, DE, costs between 14 - * and 27 cents, depending on time of day, and from a campus telephone - * between 3 and 4 cents, although it is not clear what carrier and time - * of day discounts apply in this case. 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 modem setup string is hard-coded in - * the driver and may require changes for nonstandard modems or special - * circumstances. - * - * Further information can be found in the README.refclock file in the - * xntp3 distribution. - * - * 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 AUTO 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 auto mode) if all other synchronization sources are lost. - * In either auto 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. - * - * 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. - */ - -/* - * DESCRIPTION OF THE AUTOMATED COMPUTER TELEPHONE SERVICE (ACTS) - * (reformatted from ACTS on-line computer help information) - * - * The following is transmitted (at 1200 baud) following completion of - * the telephone connection. - * - * National Institute of Standards and Technology - * Telephone Time Service, Generator 3B - * Enter question mark "?" for HELP - * D L D - * MJD YR MO DA H M S ST S UT1 msADV <OTM> - * 47999 90-04-18 21:39:15 50 0 +.1 045.0 UTC(NIST) * - * 47999 90-04-18 21:39:16 50 0 +.1 045.0 UTC(NIST) * - * 47999 90-04-18 21:39:17 50 0 +.1 045.0 UTC(NIST) * - * 47999 90-04-18 21:39:18 50 0 +.1 045.0 UTC(NIST) * - * 47999 90-04-18 21:39:19 50 0 +.1 037.6 UTC(NIST) # - * 47999 90-04-18 21:39:20 50 0 +.1 037.6 UTC(NIST) # - * etc..etc...etc....... - * - * UTC = Universal Time Coordinated, the official world time referred to - * the zero meridian. - * - * DST Daylight savings time characters, valid for the continental - * U.S., are set as follows: - * - * 00 We are on standard time (ST). - * 01-49 Now on DST, go to ST when your local time is 2:00 am and - * the count is 01. The count is decremented daily at 00 - * (UTC). - * 50 We are on DST. - * 51-99 Now on ST, go to DST when your local time is 2:00 am and - * the count is 51. The count is decremented daily at 00 - * (UTC). - * - * The two DST characters provide up to 48 days advance notice of a - * change in time. The count remains at 00 or 50 at other times. - * - * LS Leap second flag is set to "1" to indicate that a leap second is - * to be added as 23:59:60 (UTC) on the last day of the current UTC - * month. The LS flag will be reset to "0" starting with 23:59:60 - * (UTC). The flag will remain on for the entire month before the - * second is added. Leap seconds are added as needed at the end of - * any month. Usually June and/or December are chosen. - * - * The leap second flag will be set to a "2" to indicate that a - * leap second is to be deleted at 23:59:58--00:00:00 on the last - * day of the current month. (This latter provision is included per - * international recommendation, however it is not likely to be - * required in the near future.) - * - * DUT1 Approximate difference between earth rotation time (UT1) and - * UTC, in steps of 0.1 second: DUT1 = UT1 - UTC. - * - * MJD Modified Julian Date, often used to tag certain scientific data. - * - * The full time format is sent at 1200 baud, 8 bit, 1 stop, no parity. - * The format at 300 Baud is also 8 bit, 1 stop, no parity. At 300 Baud - * the MJD and DUT1 values are deleted and the time is transmitted only - * on even seconds. - * - * Maximum on line time will be 56 seconds. If all lines are busy at any - * time, the oldest call will be terminated if it has been on line more - * than 28 seconds, otherwise, the call that first reaches 28 seconds - * will be terminated. - * - * Current time is valid at the "on-time" marker (OTM), either "*" or - * "#". The nominal on-time marker (*) will be transmitted 45 ms early - * to account for the 8 ms required to send 1 character at 1200 Baud, - * plus an additional 7 ms for delay from NIST to the user, and - * approximately 30 ms "scrambler" delay inherent in 1200 Baud modems. - * If the caller echoes all characters, NIST will measure the round trip - * delay and advance the on-time marker so that the midpoint of the stop - * bit arrives at the user on time. The amount of msADV will reflect the - * actual required advance in milliseconds and the OTM will be a "#". - * - * (The NIST system requires 4 or 5 consecutive delay measurements which - * are consistent before switching from "*" to "#". If the user has a - * 1200 Baud modem with the same internal delay as that used by NIST, - * then the "#" OTM should arrive at the user within +-2 ms of the - * correct time. - * - * However, NIST has studied different brands of 1200 Baud modems and - * found internal delays from 24 ms to 40 ms and offsets of the "#" OTM - * of +-10 ms. For many computer users, +-10 ms accuracy should be more - * than adequate since many computer internal clocks can only be set - * with granularity of 20 to 50 ms. In any case, the repeatability of - * the offset for the "#" OTM should be within +-2 ms, if the dial-up - * path is reciprocal and the user doesn't change the brand or model of - * modem used. - * - * This should be true even if the dial-up path on one day is a land- - * line of less than 40 ms (one way) and on the next day is a satellite - * link of 260 to 300 ms. In the rare event that the path is one way by - * satellite and the other way by land line with a round trip - * measurement in the range of 90 to 260 ms, the OTM will remain a "*" - * indicating 45 ms advance. - * - * For user comments write: - * NIST-ACTS - * Time and Frequency Division - * Mail Stop 847 - * 325 Broadway - * Boulder, CO 80303 - * - * Software for setting (PC)DOS compatable machines is available on a - * 360-kbyte diskette for $35.00 from: NIST Office of Standard Reference - * Materials B311-Chemistry Bldg, NIST, Gaithersburg, MD, 20899, (301) - * 975-6776 - */ - -/* - * Interface definitions - */ -#define DEVICE "/dev/acts%d" /* device name and unit */ -#define SPEED232 B1200 /* uart speed (1200 cowardly baud) */ -#define PRECISION (-10) /* precision assumed (about 1 ms) */ -#define REFID "ACTS" /* reference ID */ -#define DESCRIPTION "NIST Automated Computer Time Service" /* WRU */ - -#define MODE_AUTO 0 /* automatic mode */ -#define MODE_BACKUP 1 /* backup mode */ -#define MODE_MANUAL 2 /* manual mode */ - -#define NSAMPLES 3 /* stages of median filter */ -#define MSGCNT 10 /* we need this many ACTS messages */ -#define SMAX 80 /* max token string length */ -#define LENCODE 50 /* length of valid timecode string */ -#define ACTS_MINPOLL 10 /* log2 min poll interval (1024 s) */ -#define ACTS_MAXPOLL 14 /* log2 max poll interval (16384 s) */ -#define MAXOUTAGE 3600 /* max before ACTS kicks in (s) */ - -/* - * Modem control strings. These may have to be changed for some modems. - * - * AT command prefix - * B1 initiate call negotiation using Bell 212A - * &C1 enable carrier detect - * &D2 hang up and return to command mode on DTR transition - * E0 modem command echo disabled - * l1 set modem speaker volume to low level - * M1 speaker enabled untill carrier detect - * Q0 return result codes - * V1 return result codes as English words - */ -#define MODEM_SETUP "ATB1&C1&D2E0L1M1Q0V1" /* modem setup */ -#define MODEM_HANGUP "ATH" /* modem disconnect */ - -/* - * Timeouts - */ -#define IDLE 60 /* idle timeout (s) */ -#define WAIT 2 /* wait timeout (s) */ -#define ANSWER 30 /* answer timeout (s) */ -#define CONNECT 10 /* connect timeout (s) */ -#define TIMECODE 15 /* timecode timeout (s) */ - -/* - * Imported from ntp_timer module - */ -extern u_long current_time; /* current time (s) */ -extern u_long last_time; /* last clock update time (s) */ -extern struct event timerqueue[]; /* inner space */ - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * Imported from ntp_config module - */ -extern char sys_phone[][MAXDIAL]; /* modem dial strings */ - -/* - * Imported from ntp_proto module - */ -extern struct peer *sys_peer; /* who is running the show */ -extern u_char sys_poll; /* log2 of system poll interval */ -extern struct peer *sys_peer; /* system peer structure pointer */ - -/* - * Tables to compute the ddd of year from icky dd/mm timecode. Viva la - * leap. - */ -static day1tab[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; -static day2tab[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; - -/* - * Unit control structure - */ -struct actsunit { - struct event timer; /* timeout timer */ - int pollcnt; /* poll message counter */ - - int state; /* the first one was Delaware */ - int run; /* call program run switch */ - int msgcnt; /* count of ACTS messages received */ - long redial; /* interval to next automatic call */ - double msADV; /* millisecond advance of last message */ -}; - -/* - * Function prototypes - */ -static int acts_start P((int, struct peer *)); -static void acts_shutdown P((int, struct peer *)); -static void acts_receive P((struct recvbuf *)); -static void acts_poll P((int, struct peer *)); -static void acts_timeout P((struct peer *)); -static void acts_disc P((struct peer *)); -static int acts_write P((struct peer *, char *)); - -/* - * Transfer vector - */ -struct refclock refclock_acts = { - acts_start, /* start up driver */ - acts_shutdown, /* shut down driver */ - acts_poll, /* transmit poll message */ - noentry, /* not used (old acts_control) */ - noentry, /* not used (old acts_init) */ - noentry, /* not used (old acts_buginfo) */ - NOFLAGS /* not used */ -}; - - -/* - * acts_start - open the devices and initialize data for processing - */ -static int -acts_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct actsunit *up; - struct refclockproc *pp; - int fd; - char device[20]; - int dtr = TIOCM_DTR; - - /* - * Open serial port. Use ACTS line discipline, if available. It - * pumps a timestamp into the data stream at every on-time - * character '*' found. Note: the port must have modem control - * or deep pockets for the phone bill. HP-UX 9.03 users should - * have very deep pockets. - */ - (void)sprintf(device, DEVICE, unit); - if (!(fd = refclock_open(device, SPEED232, LDISC_ACTS))) - return (0); - if (ioctl(fd, TIOCMBIC, (char *)&dtr) < 0) { - syslog(LOG_ERR, "clock %s ACTS no modem control", - ntoa(&peer->srcadr)); - return (0); - } - - /* - * Allocate and initialize unit structure - */ - if (!(up = (struct actsunit *) - emalloc(sizeof(struct actsunit)))) { - (void) close(fd); - return (0); - } - memset((char *)up, 0, sizeof(struct actsunit)); - pp = peer->procptr; - pp->io.clock_recv = acts_receive; - pp->io.srcclock = (caddr_t)peer; - pp->io.datalen = 0; - pp->io.fd = fd; - if (!io_addclock(&pp->io)) { - (void) close(fd); - free(up); - return (0); - } - pp->unitptr = (caddr_t)up; - - /* - * Initialize miscellaneous variables - */ - peer->precision = PRECISION; - pp->clockdesc = DESCRIPTION; - memcpy((char *)&pp->refid, REFID, 4); - peer->minpoll = ACTS_MINPOLL; - peer->maxpoll = ACTS_MAXPOLL; - - /* - * Initialize modem and kill DTR. We skedaddle if this comes - * bum. - */ - if (!acts_write(peer, MODEM_SETUP)) { - (void) close(fd); - free(up); - return (0); - } - - /* - * Set up the driver timeout - */ - up->timer.peer = (struct peer *)peer; - up->timer.event_handler = acts_timeout; - up->timer.event_time = current_time + WAIT; - TIMER_INSERT(timerqueue, &up->timer); - return (1); -} - - -/* - * acts_shutdown - shut down the clock - */ -static void -acts_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct actsunit *up; - struct refclockproc *pp; - - pp = peer->procptr; - up = (struct actsunit *)pp->unitptr; - TIMER_DEQUEUE(&up->timer); - io_closeclock(&pp->io); - free(up); -} - - -/* - * acts_receive - receive data from the serial interface - */ -static void -acts_receive(rbufp) - struct recvbuf *rbufp; -{ - register struct actsunit *up; - struct refclockproc *pp; - struct peer *peer; - char str[SMAX]; - int i; - l_fp tstmp; - u_fp disp; - char hangup = '%'; /* ACTS hangup */ - int day; /* day of the month */ - int month; /* month of the year */ - u_long mjd; /* Modified Julian Day */ - u_int dst; /* daylight/standard time indicator */ - u_int leap; /* leap-second indicator */ - double dut1; /* DUT adjustment */ - double msADV; /* ACTS transmit advance (ms) */ - char utc[10]; /* this is NIST and you're not */ - char flag; /* calibration flag */ - - /* - * Initialize pointers and read the timecode and timestamp. If - * the OK modem status code, leave it where folks can find it. - */ - peer = (struct peer *)rbufp->recv_srcclock; - pp = peer->procptr; - up = (struct actsunit *)pp->unitptr; - pp->lencode = refclock_gtlin(rbufp, pp->lastcode, BMAX, - &pp->lastrec); - if (pp->lencode == 0) { - if (strcmp(pp->lastcode, "OK") == 0) - pp->lencode = 2; - return; - } -#ifdef DEBUG - if (debug) - printf("acts: timecode %d %s\n", pp->lencode, - pp->lastcode); -#endif - - switch (up->state) { - - case 0: - - /* - * State 0. We are not expecting anything. Probably - * modem disconnect noise. Go back to sleep. - */ - return; - - case 1: - - /* - * State 1. We are waiting for the call to be answered. - * All we care about here is CONNECT as the first token - * in the string. If the modem signals BUSY, ERROR, NO - * ANSWER, NO CARRIER or NO DIALTONE, we immediately - * hang up the phone. If CONNECT doesn't happen after - * ANSWER seconds, hang up the phone. If everything is - * okay, start the connect timeout and slide into state - * 2. - */ - (void)strncpy(str, strtok(pp->lastcode, " "), SMAX); - if (strcmp(str, "BUSY") == 0 || strcmp(str, "ERROR") == - 0 || strcmp(str, "NO") == 0) { - TIMER_DEQUEUE(&up->timer); - syslog(LOG_NOTICE, - "clock %s ACTS modem status %s", - ntoa(&peer->srcadr), pp->lastcode); - acts_disc(peer); - } else if (strcmp(str, "CONNECT") == 0) { - TIMER_DEQUEUE(&up->timer); - up->timer.event_time = current_time + CONNECT; - TIMER_INSERT(timerqueue, &up->timer); - up->msgcnt = 0; - up->state++; - } - return; - - case 2: - - /* - * State 2. The call has been answered and we are - * waiting for the first ACTS message. If this doesn't - * happen within the timecode timeout, hang up the - * phone. We probably got a wrong number or ACTS is - * down. - */ - TIMER_DEQUEUE(&up->timer); - up->timer.event_time = current_time + TIMECODE; - TIMER_INSERT(timerqueue, &up->timer); - up->state++; - } - - /* - * Real yucky things here. Ignore everything except timecode - * messages, as determined by the message length. We told the - * terminal routines to end the line with '*' and the line - * discipline to strike a timestamp on that character. However, - * when the ACTS echo-delay scheme works, the '*' eventually - * becomes a '#'. In this case the message is ended by the <CR> - * that comes about 200 ms after the '#' and the '#' cannot be - * echoed at the proper time. But, this may not be a lose, since - * we already have good data from prior messages and only need - * the millisecond advance calculated by ACTS. So, if the - * message is long enough and has an on-time character at the - * right place, we consider the message (but not neccesarily the - * timestmap) to be valid. - */ - if (pp->lencode != LENCODE) - return; - - /* - * We apparently have a valid timecode message, so dismember it - * with sscan(). This routine does a good job in spotting syntax - * errors without becoming overly pedantic. - * - * D L D - * MJD YR MO DA H M S ST S UT1 msADV OTM - * 47222 88-03-02 21:39:15 83 0 +.3 045.0 UTC(NBS) * - */ - if (sscanf(pp->lastcode, - "%5ld %2d-%2d-%2d %2d:%2d:%2d %2d %1d %3lf %5lf %s %c", - &mjd, &pp->year, &month, &day, &pp->hour, &pp->minute, - &pp->second, &dst, &leap, &dut1, &msADV, utc, &flag) != 13) { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - - /* - * Some modems can't be trusted (the Practical Peripherals - * 9600SA comes to mind) and, even if they manage to unstick - * ACTS, the millisecond advance is wrong, so we use CLK_FLAG2 - * to disable echoes, if neccessary. - */ - if ((flag == '*' || flag == '#') && !(pp->sloppyclockflag & - CLK_FLAG2)) - (void)write(pp->io.fd, &flag, 1); - - /* - * Yes, I know this code incorrectly thinks that 2100 is a leap - * year. The ACTS timecode format croaks then anyway. Life is - * short. Would only the timecode mavens resist the urge to - * express months of the year and days of the month in favor of - * days of the year. - */ - if (month < 1 || month > 12 || day < 1) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - if (pp->year % 4) { - if (day > day1tab[month - 1]) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - for (i = 0; i < month - 1; i++) - day += day1tab[i]; - } else { - if (day > day2tab[month - 1]) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - for (i = 0; i < month - 1; i++) - day += day2tab[i]; - } - pp->day = day; - if (leap == 1) - pp->leap = LEAP_ADDSECOND; - else if (pp->leap == 2) - pp->leap = LEAP_DELSECOND; - else - pp->leap = 0; - pp->lasttime = current_time; - - /* - * Colossal hack here. We process each sample in a trimmed-mean - * filter and determine the reference clock offset and - * dispersion. The fudge time1 value is added to each sample as - * received. If we collect MSGCNT samples before the '#' on-time - * character, we use the results of the filter as is. If the '#' - * is found before that, the adjusted msADV is used to correct - * the propagation delay. - */ - up->msgcnt++; - if (flag == '#') { - L_CLR(&tstmp); - TVUTOTSF((long)((msADV - up->msADV) * 1000.), - tstmp.l_uf); - L_ADD(&pp->offset, &tstmp); - } else { - up->msADV = msADV; - if (!refclock_process(pp, up->msgcnt, up->msgcnt - - up->msgcnt / 3)) { - refclock_report(peer, CEVNT_BADTIME); - return; - } else if (up->msgcnt < MSGCNT) - return; - } - - /* - * We have a filtered sample offset ready for peer processing. - * We use lastrec as both the reference time and receive time in - * order to avoid being cute, like setting the reference time - * later than the receive time, which may cause a paranoid - * protocol module to chuck out the data. Finaly, we unhook the - * timeout, arm for the next call, fold the tent and go home. - * The little dance with the '%' character is an undocumented - * ACTS feature that hangs up the phone real quick without - * waiting for carrier loss or long-space disconnect, but we do - * these clumsy things anyway. - */ - disp = LFPTOFP(&pp->fudgetime2); - record_clock_stats(&peer->srcadr, pp->lastcode); - refclock_receive(peer, &pp->offset, 0, pp->dispersion + - (u_fp)disp, &pp->lastrec, &pp->lastrec, pp->leap); - pp->sloppyclockflag &= ~CLK_FLAG1; - up->pollcnt = 0; - TIMER_DEQUEUE(&up->timer); - (void)write(pp->io.fd, &hangup, 1); - up->state = 0; - acts_disc(peer); -} - - -/* - * acts_poll - called by the transmit routine - */ -static void -acts_poll(unit, peer) - int unit; - struct peer *peer; -{ - register struct actsunit *up; - struct refclockproc *pp; - - /* - * If the driver is running, we set the enable flag (fudge - * flag1), which causes the driver timeout routine to initiate a - * call to ACTS. If not, the enable flag can be set using - * xntpdc. If this is the sustem peer, then follow the system - * poll interval. - */ - pp = peer->procptr; - up = (struct actsunit *)pp->unitptr; - if (up->run) { - pp->sloppyclockflag |= CLK_FLAG1; - if (peer == sys_peer) - peer->hpoll = sys_poll; - else - peer->hpoll = peer->minpoll; - } -} - - -/* - * acts_timeout - called by the timer interrupt - */ -static void -acts_timeout(peer) - struct peer *peer; -{ - register struct actsunit *up; - struct refclockproc *pp; - int dtr = TIOCM_DTR; - - /* - * If a timeout occurs in other than state 0, the call has - * failed. If in state 0, we just see if there is other work to - * do. - */ - pp = peer->procptr; - up = (struct actsunit *)pp->unitptr; - if (up->state) { - acts_disc(peer); - return; - } - switch (peer->ttl) { - - /* - * In manual mode the ACTS calling program is activated - * by the xntpdc program using the enable flag (fudge - * flag1), either manually or by a cron job. - */ - case MODE_MANUAL: - up->run = 0; - break; - - /* - * In automatic mode the ACTS calling program runs - * continuously at intervals determined by the sys_poll - * variable. - */ - case MODE_AUTO: - if (!up->run) - pp->sloppyclockflag |= CLK_FLAG1; - up->run = 1; - break; - - /* - * In backup mode the ACTS calling program is disabled, - * unless no system peer has been selected for MAXOUTAGE - * (3600 s). Once enabled, it runs until some other NTP - * peer shows up. - */ - case MODE_BACKUP: - if (!up->run && sys_peer == 0) { - if (current_time - last_time > MAXOUTAGE) { - up->run = 1; - peer->hpoll = peer->minpoll; - syslog(LOG_NOTICE, - "clock %s ACTS backup started ", - ntoa(&peer->srcadr)); - } - } else if (up->run && sys_peer->refclktype != - REFCLK_NIST_ACTS) { - peer->hpoll = peer->minpoll; - up->run = 0; - syslog(LOG_NOTICE, - "clock %s ACTS backup stopped", - ntoa(&peer->srcadr)); - } - break; - - default: - syslog(LOG_NOTICE, - "clock %s ACTS invalid mode", ntoa(&peer->srcadr)); - - } - - /* - * The fudge flag1 is used as an enable/disable; if set either - * by the code or via xntpdc, the ACTS calling program is - * started; if reset, the phones stop ringing. - */ - if (!(pp->sloppyclockflag & CLK_FLAG1)) { - up->pollcnt = 0; - up->timer.event_time = current_time + IDLE; - TIMER_INSERT(timerqueue, &up->timer); - return; - } - - /* - * Initiate a call to the ACTS service. If we wind up here in - * other than state 0, a successful call could not be completed - * within minpoll seconds. We advance to the next modem dial - * string. If none are left, we log a notice and clear the - * enable flag. For future enhancement: call the site RP and - * leave an obscene message in his voicemail. - */ - if (sys_phone[up->pollcnt][0] == '\0') { - refclock_report(peer, CEVNT_TIMEOUT); - syslog(LOG_NOTICE, - "clock %s ACTS calling program terminated", - ntoa(&peer->srcadr)); - pp->sloppyclockflag &= ~CLK_FLAG1; -#ifdef DEBUG - if (debug) - printf("acts: calling program terminated\n"); -#endif - up->pollcnt = 0; - up->timer.event_time = current_time + IDLE; - TIMER_INSERT(timerqueue, &up->timer); - return; - } - - /* - * Raise DTR, call ACTS and start the answer timeout. We think - * it strange if the OK status has not been received from the - * modem, but plow ahead anyway. - */ - if (strcmp(pp->lastcode, "OK") != 0) - syslog(LOG_NOTICE, "clock %s ACTS no modem status", - ntoa(&peer->srcadr)); - (void)ioctl(pp->io.fd, TIOCMBIS, (char *)&dtr); - (void)acts_write(peer, sys_phone[up->pollcnt]); - syslog(LOG_NOTICE, "clock %s ACTS calling %s\n", - ntoa(&peer->srcadr), sys_phone[up->pollcnt]); - up->state = 1; - up->pollcnt++; - pp->polls++; - up->timer.event_time = current_time + ANSWER; - TIMER_INSERT(timerqueue, &up->timer); -} - - -/* - * acts_disc - disconnect the call and wait for the ruckus to cool - */ -static void -acts_disc(peer) - struct peer *peer; -{ - register struct actsunit *up; - struct refclockproc *pp; - int dtr = TIOCM_DTR; - - /* - * We should never get here other than in state 0, unless a call - * has timed out. We drop DTR, which will reliably get the modem - * off the air, even while ACTS is hammering away full tilt. - */ - pp = peer->procptr; - up = (struct actsunit *)pp->unitptr; - (void)ioctl(pp->io.fd, TIOCMBIC, (char *)&dtr); - if (up->state > 0) { - up->state = 0; - syslog(LOG_NOTICE, "clock %s ACTS call failed %d", - ntoa(&peer->srcadr), up->state); -#ifdef DEBUG - if (debug) - printf("acts: call failed %d\n", up->state); -#endif - } - up->timer.event_time = current_time + WAIT; - TIMER_INSERT(timerqueue, &up->timer); -} - - -/* - * acts_write - write a message to the serial port - */ -static int -acts_write(peer, str) - struct peer *peer; - char *str; -{ - register struct actsunit *up; - struct refclockproc *pp; - int len; - int code; - char cr = '\r'; - - /* - * Not much to do here, other than send the message, handle - * debug and report faults. - */ - pp = peer->procptr; - up = (struct actsunit *)pp->unitptr; - len = strlen(str); -#ifdef DEBUG - if (debug) - printf("acts: state %d send %d %s\n", up->state, len, - str); -#endif - code = write(pp->io.fd, str, len) == len; - code |= write(pp->io.fd, &cr, 1) == 1; - if (!code) - refclock_report(peer, CEVNT_FAULT); - return (code); -} - -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_as2201.c b/usr.sbin/xntpd/xntpd/refclock_as2201.c deleted file mode 100644 index afacb6faefa7..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_as2201.c +++ /dev/null @@ -1,453 +0,0 @@ -/* - * refclock_as2201 - clock driver for the Austron 2201A GPS - * Timing Receiver - */ -#if defined(REFCLOCK) && defined(AS2201) - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_unixtime.h" -#include "ntp_stdlib.h" - -#ifdef PPS -#include <sys/ppsclock.h> -#endif /* PPS */ - -/* - * This driver supports the Austron 2200A/2201A GPS Receiver with - * Buffered RS-232-C Interface Module. Note that the original 2200/2201 - * receivers will not work reliably with this driver, since the older - * design cannot accept input commands at any reasonable data rate. - * - * The program sends a "*toc\r" to the radio and expects a response of - * the form "yy:ddd:hh:mm:ss.mmm\r" where yy = year of century, ddd = - * day of year, hh:mm:ss = second of day and mmm = millisecond of - * second. Then, it sends statistics commands to the radio and expects - * a multi-line reply showing the corresponding statistics or other - * selected data. Statistics commands are sent in order as determined by - * a vector of commands; these might have to be changed with different - * radio options. If flag4 of the fudge configuration command is set to - * 1, the statistics data are written to the clockstats file for later - * processing. - * - * In order for this code to work, the radio must be placed in non- - * interactive mode using the "off" command and with a single <cr> - * resonse using the "term cr" command. The setting of the "echo" - * and "df" commands does not matter. The radio should select UTC - * timescale using the "ts utc" command. - * - * There are two modes of operation for this driver. The first with - * default configuration is used with stock kernels and serial-line - * drivers and works with almost any machine. In this mode the driver - * assumes the radio captures a timestamp upon receipt of the "*" that - * begins the driver query. Accuracies in this mode are in the order of - * a millisecond or two and the receiver can be connected to only one - * host. - * - * The second mode of operation can be used for SunOS kernels that have - * been modified with the ppsclock streams module included in this - * distribution. The mode is enabled if flag3 of the fudge configuration - * command has been set to 1. In this mode a precise timestamp is - * available using a gadget box and 1-pps signal from the receiver. This - * improves the accuracy to the order of a few tens of microseconds. In - * addition, the serial output and 1-pps signal can be bussed to - * additional receivers. - */ - -/* - * GPS Definitions - */ -#define SMAX 200 /* statistics buffer length */ -#define DEVICE "/dev/gps%d" /* device name and unit */ -#define SPEED232 B9600 /* uart speed (9600 baud) */ -#define PRECISION (-10) /* precision assumed (about 1 ms) */ -#define REFID "GPS\0" /* reference ID */ -#define DESCRIPTION "Austron 2201A GPS Receiver" /* WRU */ - -#define NSAMPLES 3 /* stages of median filter */ -#define LENTOC 19 /* yy:ddd:hh:mm:ss.mmm timecode lngth */ - -/* - * Imported from ntp_timer module - */ -extern u_long current_time; /* current time (s) */ - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -#ifdef PPS -/* - * Imported from loop_filter module - */ -extern int fdpps; /* ppsclock file descriptor */ -#endif /* PPS */ - -/* - * AS2201 unit control structure. - */ -struct as2201unit { - int pollcnt; /* poll message counter */ - - char *lastptr; /* statistics buffer pointer */ - char stats[SMAX]; /* statistics buffer */ - -#ifdef PPS - u_long lastev; /* last ppsclock second */ -#endif /* PPS */ - - int linect; /* count of lines remaining */ - int index; /* current statistics command */ -}; - -/* - * Radio commands to extract statitistics - * - * A command consists of an ASCII string terminated by a <cr> (\r). The - * command list consist of a sequence of commands terminated by a null - * string ("\0"). One command from the list is sent immediately - * following each received timecode (*toc\r command) and the ASCII - * strings received from the radio are saved along with the timecode in - * the clockstats file. Subsequent commands are sent at each timecode, - * with the last one in the list followed by the first one. The data - * received from the radio consist of ASCII strings, each terminated by - * a <cr> (\r) character. The number of strings for each command is - * specified as the first line of output as an ASCII-encode number. Note - * that the ETF command requires the Input Buffer Module and the LORAN - * commands require the LORAN Assist Module. However, if these modules - * are not installed, the radio and this driver will continue to operate - * successfuly, but no data will be captured for these commands. - */ -static char stat_command[][30] = { - "ITF\r", /* internal time/frequency */ - "ETF\r", /* external time/frequency */ - "LORAN ENSEMBLE\r", /* GPS/LORAN ensemble statistics */ - "LORAN TDATA\r", /* LORAN signal data */ - "ID;OPT;VER\r", /* model; options; software version */ - - "ITF\r", /* internal time/frequency */ - "ETF\r", /* external time/frequency */ - "LORAN ENSEMBLE\r", /* GPS/LORAN ensemble statistics */ - "TRSTAT\r", /* satellite tracking status */ - "POS;PPS;PPSOFF\r", /* position, pps source, offsets */ - - "ITF\r", /* internal time/frequency */ - "ETF\r", /* external time/frequency */ - "LORAN ENSEMBLE\r", /* GPS/LORAN ensemble statistics */ - "LORAN TDATA\r", /* LORAN signal data */ - "UTC\r", /* UTC leap info */ - - "ITF\r", /* internal time/frequency */ - "ETF\r", /* external time/frequency */ - "LORAN ENSEMBLE\r", /* GPS/LORAN ensemble statistics */ - "TRSTAT\r", /* satellite tracking status */ - "OSC;ET;TEMP\r", /* osc type; tune volts; oven temp */ - "\0" /* end of table */ -}; - -/* - * Function prototypes - */ -static int as2201_start P((int, struct peer *)); -static void as2201_shutdown P((int, struct peer *)); -static void as2201_receive P((struct recvbuf *)); -static void as2201_poll P((int, struct peer *)); - -/* - * Transfer vector - */ -struct refclock refclock_as2201 = { - as2201_start, /* start up driver */ - as2201_shutdown, /* shut down driver */ - as2201_poll, /* transmit poll message */ - noentry, /* not used (old as2201_control) */ - noentry, /* initialize driver (not used) */ - noentry, /* not used (old as2201_buginfo) */ - NOFLAGS /* not used */ -}; - - -/* - * as2201_start - open the devices and initialize data for processing - */ -static int -as2201_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct as2201unit *up; - struct refclockproc *pp; - int fd; - char gpsdev[20]; - - /* - * Open serial port. Use CLK line discipline, if available. - */ - (void)sprintf(gpsdev, DEVICE, unit); - if (!(fd = refclock_open(gpsdev, SPEED232, LDISC_CLK))) - return (0); - - /* - * Allocate and initialize unit structure - */ - if (!(up = (struct as2201unit *) - emalloc(sizeof(struct as2201unit)))) { - (void) close(fd); - return (0); - } - memset((char *)up, 0, sizeof(struct as2201unit)); - pp = peer->procptr; - pp->io.clock_recv = as2201_receive; - pp->io.srcclock = (caddr_t)peer; - pp->io.datalen = 0; - pp->io.fd = fd; - if (!io_addclock(&pp->io)) { - (void) close(fd); - free(up); - return (0); - } - pp->unitptr = (caddr_t)up; - - /* - * Initialize miscellaneous variables - */ - peer->precision = PRECISION; - pp->clockdesc = DESCRIPTION; - memcpy((char *)&pp->refid, REFID, 4); - up->pollcnt = 2; - - up->lastptr = up->stats; - up->index = 0; - return (1); -} - - -/* - * as2201_shutdown - shut down the clock - */ -static void -as2201_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct as2201unit *up; - struct refclockproc *pp; - - pp = peer->procptr; - up = (struct as2201unit *)pp->unitptr; - io_closeclock(&pp->io); - free(up); -} - - -/* - * as2201__receive - receive data from the serial interface - */ -static void -as2201_receive(rbufp) - struct recvbuf *rbufp; -{ - register struct as2201unit *up; - struct refclockproc *pp; - struct peer *peer; - l_fp trtmp; -#ifdef PPS - long ltemp; - struct ppsclockev ev; -#endif /* PPS */ - - /* - * Initialize pointers and read the timecode and timestamp. - */ - peer = (struct peer *)rbufp->recv_srcclock; - pp = peer->procptr; - up = (struct as2201unit *)pp->unitptr; - pp->lencode = refclock_gtlin(rbufp, pp->lastcode, BMAX, &trtmp); -#ifdef DEBUG - if (debug) - printf("gps: timecode %d %d %s\n", - up->linect, pp->lencode, pp->lastcode); -#endif - if (pp->lencode == 0) - return; - - /* - * If linect is greater than zero, we must be in the middle of a - * statistics operation, so simply tack the received data at the - * end of the statistics string. If not, we could either have - * just received the timecode itself or a decimal number - * indicating the number of following lines of the statistics - * reply. In the former case, write the accumulated statistics - * data to the clockstats file and continue onward to process - * the timecode; in the later case, save the number of lines and - * quietly return. - */ - if (up->linect > 0) { - up->linect--; - if (up->lastptr - up->stats + pp->lencode > SMAX - 2) - return; - *up->lastptr++ = ' '; - (void)strcpy(up->lastptr, pp->lastcode); - up->lastptr += pp->lencode; - return; - } else { - if (pp->lencode == 1) { - up->linect = atoi(pp->lastcode); - return; - } else { - up->pollcnt = 2; - record_clock_stats(&peer->srcadr, up->stats); -#ifdef DEBUG - if (debug) - printf("gps: stat %s\n", up->stats); -#endif - } - } - up->lastptr = up->stats; - *up->lastptr = '\0'; - - /* - * We get down to business, check the timecode format and decode - * its contents. If the timecode has invalid length or is not in - * proper format, we declare bad format and exit. - */ - if (pp->lencode < LENTOC) { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - - /* - * Timecode format: "yy:ddd:hh:mm:ss.mmm" - */ - if (sscanf(pp->lastcode, "%2d:%3d:%2d:%2d:%2d.%3d", &pp->year, - &pp->day, &pp->hour, &pp->minute, &pp->second, &pp->msec) - != 6) { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - - /* - * Test for synchronization (this is a temporary crock). - */ - if (pp->lastcode[2] != ':') { - pp->leap = LEAP_NOTINSYNC; - } else { - pp->leap = 0; - pp->lasttime = current_time; - } -#ifdef PPS - - /* - * If CLK_FLAG3 is set and the local time is within +-0.5 second - * of the timecode, use the pps offset instead. Note that we - * believe the ppsclock timestamp only if the ioctl works and - * the new timestamp is greater than the previous one. - */ - if (pp->sloppyclockflag & CLK_FLAG3 && fdpps != -1) { - if (!clocktime(pp->day, pp->hour, pp->minute, - pp->second, GMT, pp->lastrec.l_ui, &pp->yearstart, - &pp->lastref.l_ui)) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - MSUTOTSF(pp->msec, pp->lastref.l_uf); - pp->lastrec = trtmp; - L_SUB(&trtmp, &pp->lastref); - if (L_ISNEG(&trtmp)) - L_NEG(&trtmp); - if (trtmp.l_i < CLOCK_MAX_I || (trtmp.l_i == CLOCK_MAX_I - && trtmp.l_uf < CLOCK_MAX_F)) { - if (ioctl(fdpps, CIOGETEV, (caddr_t)&ev) >= 0) { - if (up->lastev < ev.tv.tv_sec) { - TVUTOTSF(ev.tv.tv_usec, ltemp); - pp->lastrec = pp->lastref; - L_ADDF(&pp->lastrec, ltemp); - } - up->lastev = ev.tv.tv_sec; - } - } - } -#endif /* PPS */ -#ifdef DEBUG - if (debug) - printf("gps: times %s %s %s\n", - ulfptoa(&pp->lastref, 6), ulfptoa(&pp->lastrec, 6), - lfptoa(&trtmp, 6)); -#endif - - /* - * Process the new sample in the median filter and determine the - * reference clock offset and dispersion. We use lastrec as both - * the reference time and receive time in order to avoid being - * cute, like setting the reference time later than the receive - * time, which may cause a paranoid protocol module to chuck out - * the data. - */ - if (!refclock_process(pp, NSAMPLES, NSAMPLES)) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - refclock_receive(peer, &pp->offset, 0, pp->dispersion, - &pp->lastrec, &pp->lastrec, pp->leap); - - /* - * If CLK_FLAG4 is set, initialize the statistics buffer and - * send the next command. If not, simply write the timecode to - * the clockstats file. - */ - (void)strcpy(up->lastptr, pp->lastcode); - up->lastptr += pp->lencode; - if (pp->sloppyclockflag & CLK_FLAG4) { - *up->lastptr++ = ' '; - (void)strcpy(up->lastptr, stat_command[up->index]); - up->lastptr += strlen(stat_command[up->index]); - up->lastptr--; - *up->lastptr = '\0'; - (void)write(pp->io.fd, stat_command[up->index], - strlen(stat_command[up->index])); - up->index++; - if (*stat_command[up->index] == '\0') - up->index = 0; - } -} - - -/* - * as2201_poll - called by the transmit procedure - * - * We go to great pains to avoid changing state here, since there may be - * more than one eavesdropper receiving the same timecode. - */ -static void -as2201_poll(unit, peer) - int unit; - struct peer *peer; -{ - register struct as2201unit *up; - struct refclockproc *pp; - - /* - * Send a "\r*toc\r" to get things going. We go to great pains - * to avoid changing state, since there may be more than one - * eavesdropper watching the radio. - */ - pp = peer->procptr; - up = (struct as2201unit *)pp->unitptr; - if (up->pollcnt == 0) - refclock_report(peer, CEVNT_TIMEOUT); - else - up->pollcnt--; - gettstamp(&pp->lastrec); - if (write(pp->io.fd, "\r*toc\r", 6) != 6) { - refclock_report(peer, CEVNT_FAULT); - } else - pp->polls++; -} - -#endif /* REFCLOCK */ diff --git a/usr.sbin/xntpd/xntpd/refclock_atom.c b/usr.sbin/xntpd/xntpd/refclock_atom.c deleted file mode 100644 index 8df49d212200..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_atom.c +++ /dev/null @@ -1,499 +0,0 @@ -/* - * refclock_atom - clock driver for 1-pps signals - */ -#if defined(REFCLOCK) && defined(ATOM) - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_unixtime.h" -#include "ntp_refclock.h" -#include "ntp_stdlib.h" - -#ifdef PPS -#include <sys/ppsclock.h> -#endif /* PPS */ - -/* - * 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. - * - * 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 usec at 38400 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. - */ - -/* - * Interface definitions - */ -#define DEVICE "/dev/pps%d" /* device name and unit */ -#ifdef B38400 -#define SPEED232 B38400 /* uart speed (38400 baud) */ -#else -#define SPEED232 EXTB /* as above */ -#endif -#define PRECISION (-20) /* precision assumed (about 1 usec) */ -#define REFID "PPS\0" /* reference ID */ -#define DESCRIPTION "PPS Clock Discipline" /* WRU */ - -#define PPSMAXDISPERSE (FP_SECOND / 100) /* max sample dispersion */ -#define NSAMPLES 32 /* final stages of median filter */ -#ifdef PPS -#define PPS_POLL 2 /* ppsclock poll interval (s) */ -#endif /* PPS */ - -/* - * Imported from ntp_timer module - */ -extern u_long current_time; /* current time (s) */ -extern struct event timerqueue[]; /* inner space */ - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * Imported from ntp_loopfilter module - */ -extern int fdpps; /* pps file descriptor */ -extern int pps_update; /* prefer peer valid update */ - -/* - * Imported from ntp_proto module - */ -extern struct peer *sys_peer; /* somebody in charge */ - -/* - * Unit control structure - */ -struct atomunit { -#ifdef PPS - struct event timer; /* pps poll interval timer */ - struct ppsclockev ev; /* ppsclock control */ -#endif /* PPS */ - int pollcnt; /* poll message counter */ -}; - -/* - * Global variables - */ -struct peer *last_atom_peer; /* peer structure pointer */ - -/* - * Function prototypes - */ -static int atom_start P((int, struct peer *)); -static void atom_shutdown P((int, struct peer *)); -static void atom_receive P((struct recvbuf *)); -static void atom_poll P((int, struct peer *)); -#ifdef PPS -static void atom_pps P((struct peer *)); -#endif /* PPS */ - -/* - * Transfer vector - */ -struct refclock refclock_atom = { - atom_start, /* start up driver */ - atom_shutdown, /* shut down driver */ - atom_poll, /* transmit poll message */ - noentry, /* not used (old atom_control) */ - noentry, /* initialize driver */ - noentry, /* not used (old atom_buginfo) */ - NOFLAGS /* not used */ -}; - - -/* - * atom_start - initialize data for processing - */ -static int -atom_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct atomunit *up; - struct refclockproc *pp; - - /* - * Allocate and initialize unit structure - */ - if (!(up = (struct atomunit *) - emalloc(sizeof(struct atomunit)))) - return (0); - memset((char *)up, 0, sizeof(struct atomunit)); - pp = peer->procptr; - pp->unitptr = (caddr_t)up; - - /* - * Initialize miscellaneous variables - */ - peer->precision = PRECISION; - pp->clockdesc = DESCRIPTION; - memcpy((char *)&pp->refid, REFID, 4); - up->pollcnt = 2; - pp->nstages = MAXSTAGE; - -#ifdef PPS - /* - * Arm the timer for the first interrupt. Give it ten seconds to - * allow the ppsclock line to be configured, since it could be - * assigned to another driver. - */ - up->timer.peer = (struct peer *)peer; - up->timer.event_handler = atom_pps; - up->timer.event_time = current_time + 10; - TIMER_INSERT(timerqueue, &up->timer); -#endif /* PPS */ - last_atom_peer = peer; - return (1); -} - - -/* - * atom_shutdown - shut down the clock - */ -static void -atom_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct atomunit *up; - struct refclockproc *pp; - - pp = peer->procptr; - up = (struct atomunit *)pp->unitptr; - - if (last_atom_peer == peer) - last_atom_peer = 0; -#ifdef PPS - TIMER_DEQUEUE(&up->timer); -#endif /* PPS */ - if (pp->io.fd) - io_closeclock(&pp->io); - free(up); -} - -/* - * pps_sample - process pps sample offset -- backwards compatible - * interface - */ -int -pps_sample(tsr) - l_fp *tsr; -{ - struct peer *peer; - struct refclockproc *pp; - register struct atomunit *up; - int i; - l_fp lftemp; /* l_fp temps */ - - /* - * This routine is called once per second by an auxilliary - * routine in another driver. It saves the sign-extended - * fraction supplied in the argument in a circular buffer for - * processing at the next poll event. - */ - peer = last_atom_peer; - if (!peer) - return (-1); /* no ATOM configured ? Forget it ! */ - - pp = peer->procptr; - up = (struct atomunit *)pp->unitptr; - - L_CLR(&lftemp); - L_ADDF(&lftemp, tsr->l_f); - i = ((int)(pp->coderecv)) % pp->nstages; - pp->filter[i] = lftemp; - if (pp->coderecv == 0) - for (i = 1; i < pp->nstages; i++) - pp->filter[i] = pp->filter[0]; - pp->coderecv++; - up->pollcnt = 2; - - /* HACK -- use the local UN*X clock to get the time -- this is wrong */ - pp->lastrec.l_ui = time(0) - 2 + JAN_1970; - pp->lastrec.l_uf = 0; - - return (0); -} - -#ifdef PPS -/* - * atom_pps - receive data from the LDISC_PPS discipline - */ -static void -atom_pps(peer) - struct peer *peer; -{ - register struct atomunit *up; - struct refclockproc *pp; - l_fp lftmp; - int i; - - /* - * This routine is called once per second when the LDISC_PPS - * discipline is present. It snatches the pps timestamp from the - * kernel and saves the sign-extended fraction in a circular - * buffer for processing at the next poll event. - */ - pp = peer->procptr; - up = (struct atomunit *)pp->unitptr; - - /* - * Arm the timer for the next interrupt - */ - up->timer.event_time = current_time + PPS_POLL; - TIMER_INSERT(timerqueue, &up->timer); - - /* - * Convert the timeval to l_fp and save for billboards. Sign- - * extend the fraction and stash in the buffer. No harm is done - * if previous data are overwritten. If the discipline comes bum - * or the data grow stale, just forget it. - */ - i = up->ev.serial; - if (ioctl(fdpps, CIOGETEV, (caddr_t)&up->ev) < 0) - return; - if (i == up->ev.serial) - return; - pp->lastrec.l_ui = up->ev.tv.tv_sec + JAN_1970; - TVUTOTSF(up->ev.tv.tv_usec, pp->lastrec.l_uf); - L_CLR(&lftmp); - L_ADDF(&lftmp, pp->lastrec.l_f); - L_NEG(&lftmp); - i = ((int)(pp->coderecv)) % pp->nstages; - pp->filter[i] = lftmp; - if (pp->coderecv == 0) - for (i = 1; i < pp->nstages; i++) - pp->filter[i] = pp->filter[0]; - pp->coderecv++; - up->pollcnt = 2; -} -#endif /* PPS */ - -/* - * atom_receive - receive data from the serial line interface - */ -static void -atom_receive(rbufp) - struct recvbuf *rbufp; -{ - register struct atomunit *up; - struct refclockproc *pp; - struct peer *peer; - l_fp lftmp; - int i; - - /* - * This routine is called once per second when the serial - * interface is in use. It snatches the timestamp from the - * buffer and saves the sign-extended fraction in a circular - * buffer for processing at the next poll event. - */ - peer = (struct peer *)rbufp->recv_srcclock; - pp = peer->procptr; - up = (struct atomunit *)pp->unitptr; - pp->lencode = refclock_gtlin(rbufp, pp->lastcode, BMAX, - &pp->lastrec); - - /* - * Save the timestamp for billboards. Sign-extend the fraction - * and stash in the buffer. No harm is done if previous data are - * overwritten. - */ - L_CLR(&lftmp); - L_ADDF(&lftmp, pp->lastrec.l_f); - L_NEG(&lftmp); - i = ((int)(pp->coderecv)) % pp->nstages; - pp->filter[i] = lftmp; - if (pp->coderecv == 0) - for (i = 1; i < pp->nstages; i++) - pp->filter[i] = pp->filter[0]; - pp->coderecv++; - up->pollcnt = 2; -} - -/* - * Compare two l_fp's - used with qsort() - */ -static int -atom_cmpl_fp(p1, p2) - register void *p1, *p2; /* l_fp to compare */ -{ - - if (!L_ISGEQ((l_fp *)p1, (l_fp *)p2)) - return (-1); - if (L_ISEQU((l_fp *)p1, (l_fp *)p2)) - return (0); - return (1); -} - -/* - * atom_poll - called by the transmit procedure - */ -static void -atom_poll(unit, peer) - int unit; - struct peer *peer; -{ - register struct atomunit *up; - struct refclockproc *pp; - int i, n; - l_fp median, lftmp; - l_fp off[MAXSTAGE]; - u_fp disp; - - /* - * At each poll we check for timeout. At the first timeout we - * test to see if the LDISC_PPS discipline is present and, if - * so, use that. If not, we attempt to open a serial line with - * LDISC_CLKPPS discipline. If that fails, we bitch to the log - * and clam up. - */ - pp = peer->procptr; - up = (struct atomunit *)pp->unitptr; - pp->polls++; - if (up->pollcnt == 0) { - refclock_report(peer, CEVNT_FAULT); - return; - } - up->pollcnt--; - if (up->pollcnt == 0) { - if (!pp->io.fd && fdpps == -1) { - int fd; - char device[20]; - - /* - * Open serial port. Use CLKPPS line discipline, - * if available. If unavailable, the code works - * anyway, but at reduced accuracy. - */ - (void)sprintf(device, DEVICE, unit); - if (!(fd = refclock_open(device, SPEED232, - LDISC_CLKPPS))) { - refclock_report(peer, CEVNT_FAULT); - return; - } - pp->io.clock_recv = atom_receive; - pp->io.srcclock = (caddr_t)peer; - pp->io.datalen = 0; - pp->io.fd = fd; - if (!io_addclock(&pp->io)) { - (void) close(fd); - refclock_report(peer, CEVNT_FAULT); - return; - } - } - } - - /* - * Valid time (leap bits zero) is returned only if the prefer - * peer has survived the intersection algorithm and within - * CLOCK_MAX of local time and not too long ago. This insures - * the pps time is within +-0.5 s of the local time and the - * seconds numbering is unambiguous. - */ - if (pps_update) { - pp->leap = 0; - pp->lasttime = current_time; - } else - pp->leap = LEAP_NOTINSYNC; - - /* - * Copy the raw offsets and sort into ascending order - */ - for (i = 0; i < MAXSTAGE; i++) - off[i] = pp->filter[i]; - qsort((char *)off, pp->nstages, sizeof(l_fp), atom_cmpl_fp); - - /* - * Reject the furthest from the median of nstages samples until - * nskeep samples remain. - */ - i = 0; - n = pp->nstages; - while ((n - i) > NSAMPLES) { - lftmp = off[n - 1]; - median = off[(n + i) / 2]; - L_SUB(&lftmp, &median); - L_SUB(&median, &off[i]); - if (L_ISHIS(&median, &lftmp)) { - /* reject low end */ - i++; - } else { - /* reject high end */ - n--; - } - } - - /* - * Compute the dispersion based on the difference between the - * extremes of the remaining offsets. Add to this the time since - * the last clock update, which represents the dispersion - * increase with time. We know that NTP_MAXSKEW is 16. If the - * sum is greater than the allowed sample dispersion, bail out. - * Otherwise, return the median offset plus the configured - * fudgetime1 value. - */ - lftmp = off[n - 1]; - L_SUB(&lftmp, &off[i]); - disp = LFPTOFP(&lftmp) + current_time - pp->lasttime; - if (disp > PPSMAXDISPERSE) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - pp->offset = off[(n + 1) / 2]; - L_ADD(&pp->offset, &pp->fudgetime1); - pp->dispersion = disp; - refclock_receive(peer, &pp->offset, 0, pp->dispersion, - &pp->lastrec, &pp->lastrec, pp->leap); -} - -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_chu.c b/usr.sbin/xntpd/xntpd/refclock_chu.c deleted file mode 100644 index 7b710fce5102..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_chu.c +++ /dev/null @@ -1,800 +0,0 @@ -/* - * refclock_chu - clock driver for the CHU time code - */ -#if defined(REFCLOCK) && defined(CHU) - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_unixtime.h" -#include <sys/chudefs.h> -#include "ntp_stdlib.h" - -/* - * The CHU time signal includes a time code which is modulated at the - * standard Bell 103 frequencies (i.e. mark=2225Hz, space=2025Hz). - * and formatted into 8 bit characters with one start bit and two - * stop bits. The time code is composed of 10 8-bit characters. - * The second 5 bytes of the timecode are a redundancy check, and - * are a copy of the first 5 bytes. - * - * It is assumed that you have built or modified a Bell 103 standard - * modem, attached the input to the output of a radio and cabled the - * output to a serial port on your computer, i.e. what you are receiving - * is essentially the output of your radio. It is also assumed you have - * installed a special CHU line discipline to condition the output from - * the terminal driver and take accurate time stamps. - * - * There are two types of timecodes. One is sent in the 32nd - * through 39th second of the minute. - * - * 6dddhhmmss6dddhhmmss - * - * where ddd is the day of the year, hh is the hour (in UTC), mm is - * the minute and ss the second. The 6 is a constant. Note that - * the code is sent twice. - * - * The second sort of timecode is sent only during the 31st second - * past the minute. - * - * xdyyyyttabXDYYYYTTAB - * - * In this case, the second part of the code is the one's complement - * of the code. This differentiates it from the other timecode - * format. - * - * d is the absolute value of DUT (in tenths of a second). yyyy - * is the year. tt is the difference between UTC and TAI. a is - * a canadian daylight time flag and b is a serial number. - * x is a bitwise field. The least significant bit of x is - * one if DUT is negative. The 2nd bit is set if a leap second - * will be added at the next opportunity. The 3rd bit is set if - * a leap second will be deleted at the next opportunity. - * The 4th bit is an even parity bit for the other three bits - * in this nibble. - * - * The start bit in each character has a precise relationship to - * the on-time second. Most often UART's synchronize themselves to the - * start bit and will post an interrupt at the center of the first stop - * bit. Thus each character's interrupt should occur at a fixed offset - * from the on-time second. This means that a timestamp taken at the - * arrival of each character in the code will provide an independent - * estimate of the offset. Since there are 10 characters in the time - * code and the code is sent 9 times per minute, this means you - * potentially get 90 offset samples per minute. Much of the code in - * here is dedicated to producing a single offset estimate from these - * samples. - * - * A note about the line discipline. It is possible to receive the - * CHU time code in raw mode, but this has disadvantages. In particular, - * this puts a lot of code between the interrupt and the time you freeze - * a time stamp, decreasing precision. It is also expensive in terms of - * context switches, and made even more expensive by the way I do I/O. - * Worse, since you are listening directly to the output of your radio, - * CHU is noisy and will make you spend a lot of time receiving noise. - * - * The line discipline fixes a lot of this. It knows that the CHU time - * code consists of 10 bytes which arrive with an intercharacter - * spacing of about 37 ms, and that the data is BCD, and filters on this - * basis. It delivers block of ten characters plus their associated time - * stamps all at once. The time stamps are hence about as accurate as - * a Unix machine can get them, and much of the noise disappears in the - * kernel with no context switching cost. - * - * The kernel module also will insure that the packets that are - * delivered have the correct redundancy bytes, and will return - * a flag in chutype to differentiate one sort of packet from - * the other. - */ - -/* - * CHU definitions - */ -#define DEVICE "/dev/chu%d" /* device name and unit */ -#define SPEED232 B300 /* uart speed (300 baud) */ -#define PRECISION (-9) /* what the heck */ -#define REFID "CHU\0" /* reference ID */ -#define DESCRIPTION "Scratchbuilt CHU Receiver" /* WRU */ - -#define NCHUCODES 8 /* expect 8 CHU codes per minute */ -#ifndef CHULDISC -#define CHULDISC 10 /* XXX temp CHU line discipline */ -#endif - -/* - * To compute a quality for the estimate (a pseudo dispersion) we add a - * fixed 10 ms for each missing code in the minute and add to this - * the sum of the differences between the remaining offsets and the - * estimated sample offset. - */ -#define CHUDELAYPENALTY 0x0000028f - -/* - * Default fudge factors - */ -#define DEFPROPDELAY 0x00624dd3 /* 0.0015 seconds, 1.5 ms */ -#define DEFFILTFUDGE 0x000d1b71 /* 0.0002 seconds, 200 us */ - -/* - * Hacks to avoid excercising the multiplier. I have no pride. - */ -#define MULBY10(x) (((x)<<3) + ((x)<<1)) -#define MULBY60(x) (((x)<<6) - ((x)<<2)) /* watch overflow */ -#define MULBY24(x) (((x)<<4) + ((x)<<3)) - -/* - * Constants for use when multiplying by 0.1. ZEROPTONE is 0.1 - * as an l_fp fraction, NZPOBITS is the number of significant bits - * in ZEROPTONE. - */ -#define ZEROPTONE 0x1999999a -#define NZPOBITS 29 - -static char hexstring[]="0123456789abcdef"; - -/* - * Unit control structure. - */ -struct chuunit { - struct peer *peer; /* peer structure pointer */ - struct event chutimer; /* timeout timer structure */ - l_fp offsets[NCHUCODES]; /* offsets computed from each code */ - l_fp rectimes[NCHUCODES]; /* times we received this stuff */ - u_long reftimes[NCHUCODES]; /* time of last code received */ - u_char lastcode[NCHUCHARS * 4]; /* last code we received */ - u_char expect; /* the next offset expected */ - u_short haveoffset; /* flag word indicating valid offsets */ - u_short flags; /* operational flags */ - u_long responses; /* number of responses */ - int pollcnt; /* poll message counter */ -}; - -#define CHUTIMERSET 0x1 /* timer is set to fire */ - - -/* - * The CHU table. This gives the expected time of arrival of each - * character after the on-time second and is computed as follows: - * The CHU time code is sent at 300 bps. Your average UART will - * synchronize at the edge of the start bit and will consider the - * character complete at the middle of the first stop bit, i.e. - * 0.031667 ms later (some UARTS may complete the character at the - * end of the stop bit instead of the middle, but you can fudge this). - * Thus the expected time of each interrupt is the start bit time plus - * 0.031667 seconds. These times are in chutable[]. - */ -#define CHARDELAY 0x081b4e82 - -static u_long chutable[NCHUCHARS] = { - 0x22222222 + CHARDELAY, /* 0.1333333333 */ - 0x2b851eb8 + CHARDELAY, /* 0.170 (exactly) */ - 0x34e81b4e + CHARDELAY, /* 0.2066666667 */ - 0x3f92c5f9 + CHARDELAY, /* 0.2483333333 */ - 0x47ae147b + CHARDELAY, /* 0.280 (exactly) */ - 0x51111111 + CHARDELAY, /* 0.3166666667 */ - 0x5a740da7 + CHARDELAY, /* 0.3533333333 */ - 0x63d70a3d + CHARDELAY, /* 0.390 (exactly) */ - 0x6d3a06d4 + CHARDELAY, /* 0.4266666667 */ - 0x769d0370 + CHARDELAY, /* 0.4633333333 */ -}; - -/* - * Imported from the timer module - */ -extern u_long current_time; -extern struct event timerqueue[]; - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * Function prototypes - */ -static int chu_start P((int, struct peer *)); -static void chu_shutdown P((int, struct peer *)); -static void chu_receive P((struct recvbuf *)); -static void chu_process P((struct chuunit *)); -static void chu_poll P((int, struct peer *)); -static void chu_timeout P((struct peer *)); - -/* - * Transfer vector - */ -struct refclock refclock_chu = { - chu_start, /* start up driver */ - chu_shutdown, /* shut down driver */ - chu_poll, /* transmit poll message */ - noentry, /* not used (old chu_control) */ - noentry, /* initialize driver (not used) */ - noentry, /* not used (old chu_buginfo) */ - NOFLAGS /* not used */ -}; - - -/* - * chu_start - open the CHU device and initialize data for processing - */ -static int -chu_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct chuunit *up; - struct refclockproc *pp; - int fd; - char device[20]; - - /* - * Open serial port and set CHU line discipline - */ - (void) sprintf(device, DEVICE, unit); - if (!(fd = refclock_open(device, SPEED232, LDISC_CHU))) - return (0); - - /* - * Allocate and initialize unit structure - */ - if (!(up = (struct chuunit *) - emalloc(sizeof(struct chuunit)))) { - (void) close(fd); - return (0); - } - memset((char *)up, 0, sizeof(struct chuunit)); - up->chutimer.peer = (struct peer *)up; - up->chutimer.event_handler = chu_timeout; - up->peer = peer; - pp = peer->procptr; - pp->io.clock_recv = chu_receive; - pp->io.srcclock = (caddr_t)peer; - pp->io.datalen = 0; - pp->io.fd = fd; - if (!io_addclock(&pp->io)) { - (void) close(fd); - free(up); - return (0); - } - pp->unitptr = (caddr_t)up; - - /* - * Initialize miscellaneous variables - */ - peer->precision = PRECISION; - pp->clockdesc = DESCRIPTION; - memcpy((char *)&pp->refid, REFID, 4); - up->pollcnt = 2; - return (1); -} - - -/* - * chu_shutdown - shut down the clock - */ -static void -chu_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct chuunit *up; - struct refclockproc *pp; - - pp = peer->procptr; - up = (struct chuunit *)pp->unitptr; - io_closeclock(&pp->io); - free(up); -} - - -/* - * chu_receive - receive data from a CHU clock, do format checks and compute - * an estimate from the sample data - */ -static void -chu_receive(rbufp) - struct recvbuf *rbufp; -{ - register struct chuunit *up; - struct refclockproc *pp; - struct peer *peer; - int i; - u_long date_ui; - u_long tmp; - u_char *code; - struct chucode *chuc; - int isneg; - u_long reftime; - l_fp off[NCHUCHARS]; - int day, hour, minute, second; - - /* - * Do a length check on the data. Should be what we asked for. - */ - if (rbufp->recv_length != sizeof(struct chucode)) { - syslog(LOG_ERR, - "chu_receive: received %d bytes, expected %d", - rbufp->recv_length, sizeof(struct chucode)); - return; - } - - /* - * Get the clock this applies to and a pointer to the data - */ - peer = (struct peer *)rbufp->recv_srcclock; - pp = peer->procptr; - up = (struct chuunit *)pp->unitptr; - chuc = (struct chucode *)&rbufp->recv_space; - up->responses++; - - /* - * Just for fun, we can debug the whole frame if - * we want. - */ - for (i = 0; i < NCHUCHARS; i++) { - pp->lastcode[2 * i] = hexstring[chuc->codechars[i] & - 0xf]; - pp->lastcode[2 * i + 1] = hexstring[chuc->codechars[i] - >> 4]; - } - pp->lencode = 2 * i; - pp->lastcode[pp->lencode] = '\0'; -#ifdef DEBUG - if (debug > 3) { - printf("chu: %s packet\n", (chuc->chutype == CHU_YEAR)? - "year":"time"); - for (i = 0; i < NCHUCHARS; i++) { - char c[64]; - - sprintf(c,"%c%c %s", - hexstring[chuc->codechars[i] & 0xf], - hexstring[chuc->codechars[i] >> 4], - ctime(&(chuc->codetimes[i].tv_sec))); - c[strlen(c) - 1] = 0; /* ctime() adds \n */ - printf("chu: %s .%06d\n", c, - chuc->codetimes[i].tv_usec); - } - } -#endif - - /* - * At this point we're assured that both halves of the - * data match because of what the kernel has done. - * But there's more than one data format. We need to - * check chutype to see what to do now. If it's a - * year packet, then we fiddle with it specially. - */ - - if (chuc->chutype == CHU_YEAR) - { - u_char leapbits,parity; - - /* - * Break out the code into the BCD nibbles. - * Put it in the half of lastcode. - */ - code = up->lastcode; - code += 2*NCHUCHARS; - for (i = 0; i < NCHUCHARS; i++) { - *code++ = chuc->codechars[i] & 0xf; - *code++ = (chuc->codechars[i] >> 4) & 0xf; - } - - leapbits = chuc->codechars[0]&0xf; - - /* - * Now make sure that the leap nibble - * is even parity. - */ - - parity = (leapbits ^ (leapbits >> 2))&0x3; - parity = (parity ^ (parity>>1))&0x1; - if (parity) - { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - - /* - * This just happens to work. :-) - */ - - pp->leap = (leapbits >> 1) & 0x3; - - return; - } - - if (chuc->chutype != CHU_TIME) - { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - - /* - * Break out the code into the BCD nibbles. Only need to fiddle - * with the first half since both are identical. Note the first - * BCD character is the low order nibble, the second the high order. - */ - code = up->lastcode; - for (i = 0; i < NCHUCHARS; i++) { - *code++ = chuc->codechars[i] & 0xf; - *code++ = (chuc->codechars[i] >> 4) & 0xf; - } - - /* - * Format check. Make sure the two halves match. - * There's really no need for this, but it can't hurt. - */ - for (i = 0; i < NCHUCHARS/2; i++) - if (chuc->codechars[i] != - chuc->codechars[i+(NCHUCHARS/2)]) { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - - /* - * If the first nibble isn't a 6, we're up the creek - */ - code = up->lastcode; - if (*code++ != 6) { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - - /* - * Collect the day, the hour, the minute and the second. - */ - day = *code++; - day = MULBY10(day) + *code++; - day = MULBY10(day) + *code++; - hour = *code++; - hour = MULBY10(hour) + *code++; - minute = *code++; - minute = MULBY10(minute) + *code++; - second = *code++; - second = MULBY10(second) + *code++; - - /* - * Sanity check the day and time. Note that this - * only occurs on the 32st through the 39th second - * of the minute. - */ - if (day < 1 || day > 366 - || hour > 23 || minute > 59 - || second < 32 || second > 39) { - pp->baddata++; - if (day < 1 || day > 366) { - refclock_report(peer, CEVNT_BADDATE); - } else { - refclock_report(peer, CEVNT_BADTIME); - } - return; - } - - /* - * Compute the NTP date from the input data and the - * receive timestamp. If this doesn't work, mark the - * date as bad and forget it. - */ - if (!clocktime(day, hour, minute, second, 0, - rbufp->recv_time.l_ui, &pp->yearstart, (U_LONG *)&reftime)) { - refclock_report(peer, CEVNT_BADDATE); - return; - } - date_ui = reftime;; - - /* - * We've now got the integral seconds part of the time code (we hope). - * The fractional part comes from the table. We next compute - * the offsets for each character. - */ - for (i = 0; i < NCHUCHARS; i++) { - register u_long tmp2; - - off[i].l_ui = date_ui; - off[i].l_uf = chutable[i]; - tmp = chuc->codetimes[i].tv_sec + JAN_1970; - TVUTOTSF(chuc->codetimes[i].tv_usec, tmp2); - M_SUB(off[i].l_ui, off[i].l_uf, tmp, tmp2); - } - - if (!pp->sloppyclockflag) { - u_short ord[NCHUCHARS]; - /* - * In here we assume the clock has adequate bits - * to take timestamps with reasonable accuracy. - * Note that the time stamps may contain errors - * for a couple of reasons. Timing is actually - * referenced to the start bit in each character - * in the time code. If this is obscured by static - * you can still get a valid character but have the - * timestamp offset by +-1.5 ms. Also, we may suffer - * from interrupt delays if the interrupt is being - * held off when the character arrives. Note the - * latter error is always in the form of a delay. - * - * After fiddling I arrived at the following scheme. - * We sort the times into order by offset. We then - * drop the most positive 2 offset values (which may - * correspond to a character arriving early due to - * static) and the most negative 4 (which may correspond - * to delayed characters, either from static or from - * interrupt latency). We then take the mean of the - * remaining 4 offsets as our estimate. - */ - - /* - * Set up the order array. - */ - for (i = 0; i < NCHUCHARS; i++) - ord[i] = (u_short)i; - - /* - * Sort them into order. Reuse variables with abandon. - */ - for (tmp = 0; tmp < (NCHUCHARS-1); tmp++) { - for (i = (int)tmp+1; i < NCHUCHARS; i++) { - if (!L_ISGEQ(&off[ord[i]], &off[ord[tmp]])) { - date_ui = (u_long)ord[i]; - ord[i] = ord[tmp]; - ord[tmp] = (u_short)date_ui; - } - } - } - - /* - * Done the sort. We drop 0, 1, 2 and 3 at the negative - * end, and 8 and 9 at the positive. Take the sum of - * 4, 5, 6 and 7. - */ - date_ui = off[ord[4]].l_ui; - tmp = off[ord[4]].l_uf; - for (i = 5; i <= 7; i++) - M_ADD(date_ui, tmp, off[ord[i]].l_ui, off[ord[i]].l_uf); - - /* - * Round properly, then right shift two bits for the - * divide by four. - */ - if (tmp & 0x2) - M_ADDUF(date_ui, tmp, 0x4); - M_RSHIFT(date_ui, tmp); - M_RSHIFT(date_ui, tmp); - } else { - /* - * Here is a *big* problem. On a machine where the - * low order bit in the clock is on the order of half - * a millisecond or more we don't really have enough - * precision to make intelligent choices about which - * samples might be in error and which aren't. More - * than this, in the case of error free data we can - * pick up a few bits of precision by taking the mean - * of the whole bunch. This is what we do. The problem - * comes when it comes time to divide the 64 bit sum of - * the 10 samples by 10, a procedure which really sucks. - * Oh, well, grin and bear it. Compute the sum first. - */ - date_ui = 0; - tmp = 0; - for (i = 0; i < NCHUCHARS; i++) - M_ADD(date_ui, tmp, off[i].l_ui, off[i].l_uf); - if (M_ISNEG(date_ui, tmp)) - isneg = 1; - else - isneg = 0; - - /* - * Here is a multiply-by-0.1 optimization that should apply - * just about everywhere. If the magnitude of the sum - * is less than 9 we don't have to worry about overflow - * out of a 64 bit product, even after rounding. - */ - if (date_ui < 9 || date_ui > 0xfffffff7) { - register u_long prod_ui; - register u_long prod_uf; - - prod_ui = prod_uf = 0; - /* - * This code knows the low order bit in 0.1 is zero - */ - for (i = 1; i < NZPOBITS; i++) { - M_LSHIFT(date_ui, tmp); - if (ZEROPTONE & (1<<i)) - M_ADD(prod_ui, prod_uf, date_ui, tmp); - } - - /* - * Done, round it correctly. Prod_ui contains the - * fraction. - */ - if (prod_uf & 0x80000000) - prod_ui++; - if (isneg) - date_ui = 0xffffffff; - else - date_ui = 0; - tmp = prod_ui; - /* - * date_ui is integral part, tmp is fraction. - */ - } else { - register u_long prod_ovr; - register u_long prod_ui; - register u_long prod_uf; - register u_long highbits; - - prod_ovr = prod_ui = prod_uf = 0; - if (isneg) - highbits = 0xffffffff; /* sign extend */ - else - highbits = 0; - /* - * This code knows the low order bit in 0.1 is zero - */ - for (i = 1; i < NZPOBITS; i++) { - M_LSHIFT3(highbits, date_ui, tmp); - if (ZEROPTONE & (1<<i)) - M_ADD3(prod_ovr, prod_uf, prod_ui, - highbits, date_ui, tmp); - } - - if (prod_uf & 0x80000000) - M_ADDUF(prod_ovr, prod_ui, (u_long)1); - date_ui = prod_ovr; - tmp = prod_ui; - } - } - - /* - * At this point we have the mean offset, with the integral - * part in date_ui and the fractional part in tmp. Store - * it in the structure. - */ - i = second - 32; /* gives a value 0 through 8 */ - if (i < (int)up->expect) { - /* - * This shouldn't actually happen, but might if a single - * bit error occurred in the code which fooled us. - * Throw away all previous data. - */ - up->expect = 0; - up->haveoffset = 0; - if (up->flags & CHUTIMERSET) { - TIMER_DEQUEUE(&up->chutimer); - up->flags &= ~CHUTIMERSET; - } - } - - up->offsets[i].l_ui = date_ui; - up->offsets[i].l_uf = tmp; - up->rectimes[i] = rbufp->recv_time; - up->reftimes[i] = reftime; - - up->expect = i + 1; - up->haveoffset |= (1 << i); - - if (up->expect >= NCHUCODES) { - /* - * Got a full second's worth. Dequeue timer and - * process this. - */ - if (up->flags & CHUTIMERSET) { - TIMER_DEQUEUE(&up->chutimer); - up->flags &= ~CHUTIMERSET; - } - chu_process(up); - } else if (!(up->flags & CHUTIMERSET)) { - /* - * Try to take an interrupt sometime after the - * 42 second mark (leaves an extra 2 seconds for - * slop). Round it up to an even multiple of - * 4 seconds. - */ - up->chutimer.event_time = - current_time + (u_long)(10 - i) + (1<<EVENT_TIMEOUT); - up->chutimer.event_time &= ~((1<<EVENT_TIMEOUT) - 1); - TIMER_INSERT(timerqueue, &up->chutimer); - up->flags |= CHUTIMERSET; - } -} - - -/* - * chu_timeout - process a timeout event - */ -static void -chu_timeout(fakepeer) - struct peer *fakepeer; -{ - /* - * If we got here it means we received some time codes - * but didn't get the one which should have arrived on - * the 39th second. Process what we have. - */ - ((struct chuunit *)fakepeer)->flags &= ~CHUTIMERSET; - chu_process((struct chuunit *)fakepeer); -} - - -/* - * chu_process - process the raw offset estimates we have and pass - * the results on to the NTP clock filters. - */ -static void -chu_process(up) - register struct chuunit *up; -{ - struct peer *peer; - struct refclockproc *pp; - int i; - s_fp bestoff; - s_fp tmpoff; - u_fp dispersion; - int imax; - - /* - * The most positive offset. - */ - peer = up->peer; - pp = peer->procptr; - imax = NCHUCODES; - for (i = 0; i < NCHUCODES; i++) - if (up->haveoffset & (1<<i)) - if (i < imax || L_ISGEQ(&up->offsets[i], - &up->offsets[imax])) - imax = i; - - /* - * The most positive estimate is our best bet. Go through - * the list again computing the dispersion. - */ - bestoff = LFPTOFP(&up->offsets[imax]); - dispersion = 0; - for (i = 0; i < NCHUCODES; i++) { - if (up->haveoffset & (1<<i)) { - tmpoff = LFPTOFP(&up->offsets[i]); - dispersion += (bestoff - tmpoff); - } else { - dispersion += CHUDELAYPENALTY; - } - } - - pp->lasttime = current_time; - up->pollcnt = 2; - record_clock_stats(&peer->srcadr, pp->lastcode); - refclock_receive(peer, &up->offsets[imax], 0, - dispersion, &up->rectimes[imax], &up->rectimes[imax], - pp->leap); - - /* - * Zero out unit for next code series - */ - up->haveoffset = 0; - up->expect = 0; - refclock_report(peer, CEVNT_NOMINAL); -} - - -/* - * chu_poll - called by the transmit procedure - */ -static void -chu_poll(unit, peer) - int unit; - struct peer *peer; -{ - register struct chuunit *up; - struct refclockproc *pp; - - pp = peer->procptr; - up = (struct chuunit *)pp->unitptr; - if (up->pollcnt == 0) - refclock_report(peer, CEVNT_TIMEOUT); - else - up->pollcnt--; -} - -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_conf.c b/usr.sbin/xntpd/xntpd/refclock_conf.c deleted file mode 100644 index c0674d917311..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_conf.c +++ /dev/null @@ -1,185 +0,0 @@ -/* - * refclock_conf.c - reference clock configuration - */ -#include <stdio.h> -#include <sys/types.h> - -#include "ntpd.h" -#include "ntp_refclock.h" -#include "ntp_stdlib.h" - -#ifdef REFCLOCK - -static struct refclock refclock_none = { - noentry, noentry, noentry, noentry, noentry, noentry, NOFLAGS -}; - -#ifdef LOCAL_CLOCK -extern struct refclock refclock_local; -#else -#define refclock_local refclock_none -#endif - -#if defined(TRAK) || defined(TRAKCLK) || defined(TRAKPPS) -extern struct refclock refclock_trak; -#else -#define refclock_trak refclock_none -#endif - -#if defined(PST) -extern struct refclock refclock_pst; -#else -#define refclock_pst refclock_none -#endif - -#if defined(CHU) -extern struct refclock refclock_chu; -#else -#define refclock_chu refclock_none -#endif - -#if defined(GOES) || defined(GOESCLK) || defined(GOESPPS) -extern struct refclock refclock_goes; -#else -#define refclock_goes refclock_none -#endif - -#if defined(WWVB) -extern struct refclock refclock_wwvb; -#else -#define refclock_wwvb refclock_none -#endif - -#if defined(PARSE) || defined(PARSEPPS) -extern struct refclock refclock_parse; -#else -#define refclock_parse refclock_none -#endif - -#if defined(PPS) && (defined(MX4200) || defined(MX4200CLK) || defined(MX4200PPS)) -extern struct refclock refclock_mx4200; -#else -#define refclock_mx4200 refclock_none -#endif - -#if defined(AS2201) -extern struct refclock refclock_as2201; -#else -#define refclock_as2201 refclock_none -#endif - -#if defined(OMEGA) || defined(OMEGACLK) || defined(OMEGAPPS) -extern struct refclock refclock_omega; -#else -#define refclock_omega refclock_none -#endif - -#if defined(TPRO) && defined(sun) /* XXX sun only */ -extern struct refclock refclock_tpro; -#else -#define refclock_tpro refclock_none -#endif - -#if defined(LEITCH) || defined(LEITCHCLK) || defined(LEITCHPPS) -extern struct refclock refclock_leitch; -#else -#define refclock_leitch refclock_none -#endif - -#if defined(IRIG) && defined(sun) /* XXX sun only */ -extern struct refclock refclock_irig; -#else -#define refclock_irig refclock_none -#endif - -#if defined(MSFEESPPS) -extern struct refclock refclock_msfees; -#else -#define refclock_msfees refclock_none -#endif - -#if defined(GPSTM) || defined(GPSTMCLK) || defined(GPSTMPPS) -extern struct refclock refclock_gpstm; -#else -#define refclock_gpstm refclock_none -#endif - -#if defined(BANC) || defined(BANCCLK) || defined(BANCPPS) -extern struct refclock refclock_bancomm; -#else -#define refclock_bancomm refclock_none -#endif - -#ifdef DATUM -extern struct refclock refclock_datum; -#else -#define refclock_datum refclock_none -#endif - -#ifdef ACTS -extern struct refclock refclock_acts; -#else -#define refclock_acts refclock_none -#endif - -#ifdef HEATH -extern struct refclock refclock_heath; -#else -#define refclock_heath refclock_none -#endif - -#ifdef NMEA -extern struct refclock refclock_nmea; -#else -#define refclock_nmea refclock_none -#endif - -#ifdef MOTO -extern struct refclock refclock_moto; -#else -#define refclock_moto refclock_none -#endif - -#ifdef ATOM -extern struct refclock refclock_atom; -#else -#define refclock_atom refclock_none -#endif - -/* - * Order is clock_start(), clock_shutdown(), clock_poll(), - * clock_control(), clock_init(), clock_buginfo, clock_flags; - * - * Types are defined in ntp.h. The index must match this. - */ -struct refclock *refclock_conf[] = { - &refclock_none, /* 0 REFCLK_NONE */ - &refclock_local, /* 1 REFCLK_LOCAL */ - &refclock_trak, /* 2 REFCLK_GPS_TRAK */ - &refclock_pst, /* 3 REFCLK_WWV_PST */ - &refclock_wwvb, /* 4 REFCLK_WWVB_SPECTRACOM */ - &refclock_goes, /* 5 REFCLK_GOES_TRUETIME */ - &refclock_irig, /* 6 REFCLK_IRIG_AUDIO */ - &refclock_chu, /* 7 REFCLK_CHU */ - &refclock_parse, /* 8 REFCLK_PARSE */ - &refclock_mx4200, /* 9 REFCLK_GPS_MX4200 */ - &refclock_as2201, /* 10 REFCLK_GPS_AS2201 */ - &refclock_omega, /* 11 REFCLK_OMEGA_TRUETIME */ - &refclock_tpro, /* 12 REFCLK_IRIG_TPRO */ - &refclock_leitch, /* 13 REFCLK_ATOM_LEITCH */ - &refclock_msfees, /* 14 REFCLK_MSF_EES */ - &refclock_gpstm, /* 15 REFCLK_GPSTM_TRUETIME */ - &refclock_bancomm, /* 16 REFCLK_IRIG_BANCOMM */ - &refclock_datum, /* 17 REFCLK_GPS_DATUM */ - &refclock_acts, /* 18 REFCLK_NIST_ACTS */ - &refclock_heath, /* 19 REFCLK_WWV_HEATH */ - &refclock_nmea, /* 20 REFCLK_GPS_NMEA */ - &refclock_moto, /* 21 REFCLK_GPS_MOTO */ - &refclock_atom, /* 22 REFCLK_ATOM_PPS */ - &refclock_none, /* 23 reserved */ - &refclock_none, /* 24 reserved */ -}; - -u_char num_refclock_conf = sizeof(refclock_conf)/sizeof(struct refclock *); - -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_datum.c b/usr.sbin/xntpd/xntpd/refclock_datum.c deleted file mode 100644 index 00449c0e544b..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_datum.c +++ /dev/null @@ -1,871 +0,0 @@ -/* -** refclock_datum - clock driver for the Datum Programmable Time Server -** -** Important note: This driver assumes that you have termios. If you have -** a system that does not have termios, you will have to modify this driver. -** -** Sorry, I have only tested this driver on SUN and HP platforms. -*/ - -#if defined(REFCLOCK) && (defined(DATUM) || defined(DATUMCLK) || defined(DATUMPPS)) - -/* -** Include Files -*/ - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> -#include <sys/errno.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_unixtime.h" - -#if defined(HAVE_BSD_TTYS) -#include <sgtty.h> -#endif /* HAVE_BSD_TTYS */ - -#if defined(HAVE_SYSV_TTYS) -#include <termio.h> -#endif /* HAVE_SYSV_TTYS */ - -#if defined(HAVE_TERMIOS) -#include <termios.h> -#endif -#if defined(STREAM) -#include <stropts.h> -#if defined(WWVBCLK) -#include <sys/clkdefs.h> -#endif /* WWVBCLK */ -#endif /* STREAM */ - -#if defined (WWVBPPS) -#include <sys/ppsclock.h> -#endif /* WWVBPPS */ - -#include "ntp_stdlib.h" - -/* -** This driver supports the Datum Programmable Time System (PTS) clock. -** The clock works in very straight forward manner. When it receives a -** time code request (e.g., the ascii string "//k/mn"), it responds with -** a seven byte BCD time code. This clock only responds with a -** time code after it first receives the "//k/mn" message. It does not -** periodically send time codes back at some rate once it is started. -** the returned time code can be broken down into the following fields. -** -** _______________________________ -** Bit Index | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | -** =============================== -** byte 0: | - - - - | H D | -** =============================== -** byte 1: | T D | U D | -** =============================== -** byte 2: | - - | T H | U H | -** =============================== -** byte 3: | - | T M | U M | -** =============================== -** byte 4: | - | T S | U S | -** =============================== -** byte 5: | t S | h S | -** =============================== -** byte 6: | m S | - - - - | -** =============================== -** -** In the table above: -** -** "-" means don't care -** "H D", "T D", and "U D" means Hundreds, Tens, and Units of Days -** "T H", and "UH" means Tens and Units of Hours -** "T M", and "U M" means Tens and Units of Minutes -** "T S", and "U S" means Tens and Units of Seconds -** "t S", "h S", and "m S" means tenths, hundredths, and thousandths -** of seconds -** -** The Datum PTS communicates throught the RS232 port on your machine. -** Right now, it assumes that you have termios. This driver has been tested -** on SUN and HP workstations. The Datum PTS supports various IRIG and -** NASA input codes. This driver assumes that the name of the device is -** /dev/datum. You will need to make a soft link to your RS232 device or -** create a new driver to use this refclock. -*/ - -/* -** Datum PTS defines -*/ - -/* -** Note that if GMT is defined, then the Datum PTS must use Greenwich -** time. Otherwise, this driver allows the Datum PTS to use the current -** wall clock for its time. It determines the time zone offset by minimizing -** the error after trying several time zone offsets. If the Datum PTS -** time is Greenwich time and GMT is not defined, everything should still -** work since the time zone will be found to be 0. What this really means -** is that your system time (at least to start with) must be within the -** correct time by less than +- 30 minutes. The default is for GMT to not -** defined. If you really want to force GMT without the funny +- 30 minute -** stuff then you must define (uncomment) GMT below. -*/ - -/* -#define GMT -#define DEBUG_DATUM_PTC -#define LOG_TIME_ERRORS -*/ - - -#define PTSPRECISION (-10) /* precision assumed 1/1024 ms */ -#define DATMREFID "DATM" /* reference id */ -#define DATUM_DISPERSION 0 /* fixed dispersion = 0 ms */ -#define DATUM_MAX_ERROR 0.100 /* limits on sigma squared */ - -#define DATUM_MAX_ERROR2 (DATUM_MAX_ERROR*DATUM_MAX_ERROR) - -/* -** External Variables -*/ - -extern u_long current_time; /* current time (s) - not really used */ -extern int debug; /* global debug flag - not relly used */ - -/* -** The Datum PTS structure -*/ - -/* -** I don't use a fixed array of MAXUNITS like everyone else just because -** I don't like to program that way. Sorry if this bothers anyone. I assume -** that you can use any id for your unit and I will search for it in a -** dynamic array of units until I find it. I was worried that users might -** enter a bad id in their configuration file (larger than MAXUNITS) and -** besides, it is just cleaner not to have to assume that you have a fixed -** number of anything in a program. -*/ - -struct datum_pts_unit { - struct peer *peer; /* peer used by xntp */ - struct refclockio io; /* io structure used by xntp */ - int PTS_fd; /* file descriptor for PTS */ - u_int unit; /* id for unit */ - u_long timestarted; /* time started */ - l_fp lastrec; /* time tag for the receive time (system) */ - l_fp lastref; /* reference time (Datum time) */ - u_long yearstart; /* the year that this clock started */ - int coderecv; /* number of time codes received */ - int day; /* day */ - int hour; /* hour */ - int minute; /* minutes */ - int second; /* seconds */ - int msec; /* miliseconds */ - int usec; /* miliseconds */ - u_char leap; /* funny leap character code */ - char retbuf[8]; /* returned time from the datum pts */ - char nbytes; /* number of bytes received from datum pts */ - double sigma2; /* average squared error (roughly) */ - int tzoff; /* time zone offest from GMT */ -}; - -/* -** PTS static constant variables for internal use -*/ - -static char TIME_REQUEST[6]; /* request message sent to datum for time */ -static FILE *logfile; /* log file for logging information */ -static int nunits; /* number of active units */ -static struct datum_pts_unit - **datum_pts_unit; /* dynamic array of datum PTS structures */ - -/* -** Callback function prototypes that xntpd needs to know about. -*/ - -static int datum_pts_start P((int, struct peer *)); -static void datum_pts_shutdown P((int, struct peer *)); -static void datum_pts_poll P((int, struct peer *)); -static void datum_pts_control P((int, struct refclockstat *, - struct refclockstat *)); -static void datum_pts_init P((void)); -static void datum_pts_buginfo P((int, struct refclockbug *)); - -/* -** This is the call back function structure that xntpd actually uses for -** this refclock. -*/ - -struct refclock refclock_datum = { - datum_pts_start, /* start up a new Datum refclock */ - datum_pts_shutdown, /* shutdown a Datum refclock */ - datum_pts_poll, /* sends out the time request */ - datum_pts_control, /* not used */ - datum_pts_init, /* initialization (called first) */ - datum_pts_buginfo, /* not used */ - NOFLAGS /* we are not setting any special flags */ -}; - -/* -** The datum_pts_receive callback function is handled differently from the -** rest. It is passed to the xntpd io data structure. Basically, every -** 64 seconds, the datum_pts_poll() routine is called. It sends out the time -** request message to the Datum Programmable Time System. Then, xntpd -** waits on a select() call to receive data back. The datum_pts_receive() -** function is called as data comes back. We expect a seven byte time -** code to be returned but the datum_pts_receive() function may only get -** a few bytes passed to it at a time. In other words, this routine may -** get called by the io stuff in xntpd a few times before we get all seven -** bytes. Once the last byte is received, we process it and then pass the -** new time measurement to xntpd for updating the system time. For now, -** there is no 3 state filtering done on the time measurements. The -** jitter may be a little high but at least for its current use, it is not -** a problem. We have tried to keep things as simple as possible. This -** clock should not jitter more than 1 or 2 mseconds at the most once -** things settle down. It is important to get the right drift calibrated -** in the xntpd.drift file as well as getting the right tick set up right -** using tickadj for SUNs. Tickadj is not used for the HP but you need to -** remember to bring up the adjtime daemon because HP does not support -** the adjtime() call. -*/ - -static void datum_pts_receive P((struct recvbuf *)); - -/*......................................................................*/ -/* datum_pts_start - start up the datum PTS. This means open the */ -/* RS232 device and set up the data structure for my unit. */ -/*......................................................................*/ - -static int datum_pts_start(unit, peer) - int unit; - struct peer *peer; -{ - struct datum_pts_unit **temp_datum_pts_unit; - struct datum_pts_unit *datum_pts; - -#ifdef HAVE_TERMIOS - struct termios arg; -#endif - -#ifdef DEBUG_DATUM_PTC - fprintf(logfile, "Starting Datum PTS unit %d\n", unit); - fflush(logfile); -#endif - -/* -** Create the memory for the new unit -*/ - - temp_datum_pts_unit = (struct datum_pts_unit **) - malloc((nunits+1)*sizeof(struct datum_pts_unit *)); - if (nunits > 0) memcpy(temp_datum_pts_unit, datum_pts_unit, - nunits*sizeof(struct datum_pts_unit *)); - free(datum_pts_unit); - datum_pts_unit = temp_datum_pts_unit; - datum_pts_unit[nunits] = (struct datum_pts_unit *) - malloc(sizeof(struct datum_pts_unit)); - datum_pts = datum_pts_unit[nunits]; - - datum_pts->unit = unit; /* set my unit id */ - datum_pts->yearstart = 0; /* initialize the yearstart to 0 */ - datum_pts->sigma2 = 0.0; /* initialize the sigma2 to 0 */ - -/* -** Open the Datum PTS device -*/ - - datum_pts->PTS_fd = open("/dev/datum",O_RDWR); - - fcntl(datum_pts->PTS_fd, F_SETFL, 0); /* clear the descriptor flags */ - -#ifdef DEBUG_DATUM_PTC - fprintf(logfile,"Opening RS232 port with file descriptor %d\n", - datum_pts->PTS_fd); - fflush(logfile); -#endif - -/* -** Set up the RS232 terminal device information. Note that we assume that -** we have termios. This code has only been tested on SUNs and HPs. If your -** machine does not have termios then this program exits. You can change this -** if you want by editing this source. Please give the changes back to the -** xntp folks so that it can become part of their regular distribution. -*/ - -#ifdef HAVE_TERMIOS - - arg.c_iflag = IGNBRK; - arg.c_oflag = 0; - arg.c_cflag = B9600 | CS8 | CREAD | PARENB | CLOCAL; - arg.c_lflag = 0; - arg.c_cc[VMIN] = 0; /* start timeout timer right away (not used) */ - arg.c_cc[VTIME] = 30; /* 3 second timout on reads (not used) */ - - tcsetattr(datum_pts->PTS_fd, TCSANOW, &arg); - -#else - - syslog(LOG_ERR, "Datum_PTS: Exiting - Termios not supported in this driver"); - exit(1); - -#endif - -/* -** Initialize the xntpd IO structure -*/ - - datum_pts->peer = peer; - datum_pts->timestarted = current_time; - - datum_pts->io.clock_recv = datum_pts_receive; - datum_pts->io.srcclock = (caddr_t)datum_pts; - datum_pts->io.datalen = 0; - datum_pts->io.fd = datum_pts->PTS_fd; - - if (!io_addclock(&(datum_pts->io))) { - -#ifdef DEBUG_DATUM_PTC - fprintf(logfile,"Problem adding clock\n"); - fflush(logfile); -#endif - - syslog(LOG_ERR, "Datum_PTS: Problem adding clock"); - - } - - peer->precision = PTSPRECISION; - peer->rootdelay = 0; - peer->rootdispersion = 0; - peer->stratum = 0; - memcpy((char *)&peer->refid, DATMREFID, 4); - -/* -** Now add one to the number of units and return a successful code -*/ - - nunits++; - return 1; - -} - - -/*......................................................................*/ -/* datum_pts_shutdown - this routine shuts doen the device and */ -/* removes the memory for the unit. */ -/*......................................................................*/ - -static void datum_pts_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - int i,j; - struct datum_pts_unit **temp_datum_pts_unit; - -#ifdef DEBUG_DATUM_PTC - fprintf(logfile,"Shutdown Datum PTS\n"); - fflush(logfile); -#endif - - syslog(LOG_ERR, "Datum_PTS: Shutdown Datum PTS"); - -/* -** First we have to find the right unit (i.e., the one with the same id). -** We do this by looping through the dynamic array of units intil we find -** it. Note, that I don't simply use an array with a maximimum number of -** Datum PTS units. Everything is completely dynamic. -*/ - - for (i=0; i<nunits; i++) { - if (datum_pts_unit[i]->unit == unit) { - -/* -** We found the unit so close the file descriptor and free up the memory used -** by the structure. -*/ - - io_closeclock(&datum_pts_unit[i]->io); - close(datum_pts_unit[i]->PTS_fd); - free(datum_pts_unit[i]); - -/* -** Now clean up the datum_pts_unit dynamic array so that there are no holes. -** This may mean moving pointers around, etc., to keep things compact. -*/ - - if (nunits > 1) { - - temp_datum_pts_unit = (struct datum_pts_unit **) - malloc((nunits-1)*sizeof(struct datum_pts_unit *)); - if (i!= 0) memcpy(temp_datum_pts_unit, datum_pts_unit, - i*sizeof(struct datum_pts_unit *)); - - for (j=i+1; j<nunits; j++) { - temp_datum_pts_unit[j-1] = datum_pts_unit[j]; - } - - free(datum_pts_unit); - datum_pts_unit = temp_datum_pts_unit; - - }else{ - - free(datum_pts_unit); - datum_pts_unit = NULL; - - } - - return; - - } - } - -#ifdef DEBUG_DATUM_PTC - fprintf(logfile,"Error, could not shut down unit %d\n",unit); - fflush(logfile); -#endif - - syslog(LOG_ERR, "Datum_PTS: Could not shut down Datum PTS unit %d",unit); - -} - -/*......................................................................*/ -/* datum_pts_poll - this routine sends out the time request to the */ -/* Datum PTS device. The time will be passed back in the */ -/* datum_pts_receive() routine. */ -/*......................................................................*/ - -static void datum_pts_poll(unit, peer) - int unit; - struct peer *peer; -{ - int i; - int index; - int error_code; - struct datum_pts_unit *datum_pts; - -#ifdef DEBUG_DATUM_PTC - fprintf(logfile,"Poll Datum PTS\n"); - fflush(logfile); -#endif - -/* -** Find the right unit and send out a time request once it is found. -*/ - - index = -1; - for (i=0; i<nunits; i++) { - if (datum_pts_unit[i]->unit == unit) { - index = i; - datum_pts = datum_pts_unit[i]; - error_code = write(datum_pts->PTS_fd, TIME_REQUEST, 6); - if (error_code != 6) perror("TIME_REQUEST"); - datum_pts->nbytes = 0; - break; - } - } - -/* -** Print out an error message if we could not find the right unit. -*/ - - if (index == -1) { - -#ifdef DEBUG_DATUM_PTC - fprintf(logfile,"Error, could not poll unit %d\n",unit); - fflush(logfile); -#endif - - syslog(LOG_ERR, "Datum_PTS: Could not poll unit %d",unit); - return; - - } - -} - - -/*......................................................................*/ -/* datum_pts_control - not used */ -/*......................................................................*/ - -static void datum_pts_control(unit, in, out) - int unit; - struct refclockstat *in; - struct refclockstat *out; -{ - -#ifdef DEBUG_DATUM_PTC - fprintf(logfile,"Control Datum PTS\n"); - fflush(logfile); -#endif - -} - - -/*......................................................................*/ -/* datum_pts_init - initializes things for all possible Datum */ -/* time code generators that might be used. In practice, this is */ -/* only called once at the beginning before anything else is */ -/* called. */ -/*......................................................................*/ - -static void datum_pts_init() -{ - -/* */ -/*...... open up the log file if we are debugging ......................*/ -/* */ - -/* -** Open up the log file if we are debugging. For now, send data out to the -** screen (stdout). -*/ - -#if defined(DEBUG_DATUM_PTC) || defined(LOG_TIME_ERRORS) -/* - logfile = fopen("xntpd.log", "w"); -*/ -#endif - - logfile = stdout; - -#ifdef DEBUG_DATUM_PTC - fprintf(logfile,"Init Datum PTS\n"); - fflush(logfile); -#endif - -/* -** Initialize the time request command string. This is the only message -** that we ever have to send to the Datum PTS (although others are defined). -*/ - - memcpy(TIME_REQUEST, "//k/mn",6); - -/* -** Initialize the number of units to 0 and set the dynamic array of units to -** NULL since there are no units defined yet. -*/ - - datum_pts_unit = NULL; - nunits = 0; - -} - - -/*......................................................................*/ -/* datum_pts_buginfo - not used */ -/*......................................................................*/ - -static void datum_pts_buginfo(unit, bug) - int unit; - register struct refclockbug *bug; -{ - -#ifdef DEBUG_DATUM_PTC - fprintf(logfile,"Buginfo Datum PTS\n"); - fflush(logfile); -#endif - -} - - -/*......................................................................*/ -/* datum_pts_receive - receive the time buffer that was read in */ -/* by the xntpd io handling routines. When 7 bytes have been */ -/* received (it may take several tries before all 7 bytes are */ -/* received), then the time code must be unpacked and sent to */ -/* the xntpd clock_receive() routine which causes the systems */ -/* clock to be updated (several layers down). */ -/*......................................................................*/ - -static void datum_pts_receive(rbufp) - struct recvbuf *rbufp; -{ - int i; - l_fp tstmp; - struct datum_pts_unit *datum_pts; - char *dpt; - int dpend; - int tzoff; - int timerr; - double ftimerr, abserr; - u_fp dispersion; - int goodtime; - -/* -** Get the time code (maybe partial) message out of the rbufp buffer. -*/ - - datum_pts = (struct datum_pts_unit *)rbufp->recv_srcclock; - dpt = (char *)&rbufp->recv_space; - dpend = rbufp->recv_length; - -#ifdef DEBUG_DATUM_PTC - fprintf(logfile,"Receive Datum PTS: %d bytes\n", dpend); - fflush(logfile); -#endif - -/* */ -/*...... save the ntp system time when the first byte is received ......*/ -/* */ - -/* -** Save the ntp system time when the first byte is received. Note that -** because it may take several calls to this routine before all seven -** bytes of our return message are finally received by the io handlers in -** xntpd, we really do want to use the time tag when the first byte is -** received to reduce the jitter. -*/ - - if (datum_pts->nbytes == 0) { - datum_pts->lastrec = rbufp->recv_time; - } - -/* -** Increment our count to the number of bytes received so far. Return if we -** haven't gotten all seven bytes yet. -*/ - - for (i=0; i<dpend; i++) { - datum_pts->retbuf[datum_pts->nbytes+i] = dpt[i]; - } - - datum_pts->nbytes += dpend; - - if (datum_pts->nbytes != 7) { - return; - } - -/* -** Convert the seven bytes received in our time buffer to day, hour, minute, -** second, and msecond values. The usec value is not used for anything -** currently. It is just the fractional part of the time stored in units -** of microseconds. -*/ - - datum_pts->day = 100*(datum_pts->retbuf[0] & 0x0f) + - 10*((datum_pts->retbuf[1] & 0xf0)>>4) + - (datum_pts->retbuf[1] & 0x0f); - - datum_pts->hour = 10*((datum_pts->retbuf[2] & 0x30)>>4) + - (datum_pts->retbuf[2] & 0x0f); - - datum_pts->minute = 10*((datum_pts->retbuf[3] & 0x70)>>4) + - (datum_pts->retbuf[3] & 0x0f); - - datum_pts->second = 10*((datum_pts->retbuf[4] & 0x70)>>4) + - (datum_pts->retbuf[4] & 0x0f); - - datum_pts->msec = 100*((datum_pts->retbuf[5] & 0xf0) >> 4) + - 10*(datum_pts->retbuf[5] & 0x0f) + - ((datum_pts->retbuf[6] & 0xf0)>>4); - - datum_pts->usec = 1000*datum_pts->msec; - -#ifdef DEBUG_DATUM_PTC - fprintf(logfile,"day %d, hour %d, minute %d, second %d, msec %d\n", - datum_pts->day, - datum_pts->hour, - datum_pts->minute, - datum_pts->second, - datum_pts->msec); - fflush(logfile); -#endif - -/* -** Get the GMT time zone offset. Note that GMT should be zero if the Datum -** reference time is using GMT as its time base. Otherwise we have to -** determine the offset if the Datum PTS is using time of day as its time -** base. -*/ - - goodtime = 0; /* We are not sure about the time and offset yet */ - -#ifdef GMT - -/* -** This is the case where the Datum PTS is using GMT so there is no time -** zone offset. -*/ - - tzoff = 0; /* set time zone offset to 0 */ - -#else - -/* -** This is the case where the Datum PTS is using regular time of day for its -** time so we must compute the time zone offset. The way we do it is kind of -** funny but it works. We loop through different time zones (0 to 24) and -** pick the one that gives the smallest error (+- one half hour). The time -** zone offset is stored in the datum_pts structure for future use. Normally, -** the clocktime() routine is only called once (unless the time zone offset -** changes due to daylight savings) since the goodtime flag is set when a -** good time is found (with a good offset). Note that even if the Datum -** PTS is using GMT, this mechanism will still work since it should come up -** with a value for tzoff = 0 (assuming that your system clock is within -** a half hour of the Datum time (even with time zone differences). -*/ - - for (tzoff=0; tzoff<24; tzoff++) { - if (clocktime( datum_pts->day, - datum_pts->hour, - datum_pts->minute, - datum_pts->second, - (tzoff + datum_pts->tzoff) % 24, - datum_pts->lastrec.l_ui, - &datum_pts->yearstart, - &datum_pts->lastref.l_ui) ) { - - error = datum_pts->lastref.l_ui - datum_pts->lastrec.l_ui; - -#ifdef DEBUG_DATUM_PTC - printf("Time Zone (clocktime method) = %d, error = %d\n", tzoff, error); -#endif - - if ((error < 1799) && (error > -1799)) { - tzoff = (tzoff + datum_pts->tzoff) % 24; - datum_pts->tzoff = tzoff; - goodtime = 1; - -#ifdef DEBUG_DATUM_PTC - printf("Time Zone found (clocktime method) = %d\n",tzoff); -#endif - - break; - } - - } - } - -#endif - -/* -** Make sure that we have a good time from the Datum PTS. Clocktime() also -** sets yearstart and lastref.l_ui. We will have to set astref.l_uf (i.e., -** the fraction of a second) stuff later. -*/ - - if (!goodtime) { - - if (!clocktime( datum_pts->day, - datum_pts->hour, - datum_pts->minute, - datum_pts->second, - tzoff, - datum_pts->lastrec.l_ui, - &datum_pts->yearstart, - &datum_pts->lastref.l_ui) ) { - -#ifdef DEBUG_DATUM_PTC - fprintf(logfile,"Error: bad clocktime\n"); - fprintf(logfile,"GMT %d, lastrec %d, yearstart %d, lastref %d\n", - tzoff, - datum_pts->lastrec.l_ui, - datum_pts->yearstart, - datum_pts->lastref.l_ui); - fflush(logfile); -#endif - - syslog(LOG_ERR, "Datum_PTS: Bad clocktime"); - - return; - - }else{ - -#ifdef DEBUG_DATUM_PTC - fprintf(logfile,"Good clocktime\n"); - fflush(logfile); -#endif - - } - - } - -/* -** We have datum_pts->lastref.l_ui set (which is the integer part of the -** time. Now set the microseconds field. -*/ - - TVUTOTSF(datum_pts->usec, datum_pts->lastref.l_uf); - -/* -** Compute the time correction as the difference between the reference -** time (i.e., the Datum time) minus the receive time (system time). -*/ - - tstmp = datum_pts->lastref; /* tstmp is the datum ntp time */ - L_SUB(&tstmp, &datum_pts->lastrec); /* tstmp is now the correction */ - datum_pts->coderecv++; /* increment a counter */ - - dispersion = DATUM_DISPERSION; /* set the dispersion to 0 */ - -#ifdef DEBUG_DATUM_PTC - ftimerr = dispersion; - ftimerr /= (1024.0 * 64.0); - fprintf(logfile,"dispersion = %d, %f\n", dispersion, ftimerr); - fflush(logfile); -#endif - -/* -** Pass the new time to xntpd through the refclock_receive function. Note -** that we are not trying to make any corrections due to the time it takes -** for the Datum PTS to send the message back. I am (erroneously) assuming -** that the time for the Datum PTS to send the time back to us is negligable. -** I suspect that this time delay may be as much as 15 ms or so (but probably -** less). For our needs at JPL, this kind of error is ok so it is not -** necessary to use fudge factors in the ntp.conf file. Maybe later we will. -*/ - - refclock_receive( datum_pts->peer, - &tstmp, - tzoff, - dispersion, - &datum_pts->lastrec, - &datum_pts->lastrec, - datum_pts->leap ); - -/* -** Compute sigma squared (not used currently). Maybe later, this could be -** used for the dispersion estimate. The problem is that xntpd does not link -** in the math library so sqrt() is not available. Anyway, this is useful -** for debugging. Maybe later I will just use absolute values for the time -** error to come up with my dispersion estimate. Anyway, for now my dispersion -** is set to 0. -*/ - - timerr = tstmp.l_ui<<20; - timerr |= (tstmp.l_uf>>12) & 0x000fffff; - ftimerr = timerr; - ftimerr /= 1024*1024; - abserr = ftimerr; - if (ftimerr < 0.0) abserr = -ftimerr; - - if (datum_pts->sigma2 == 0.0) { - if (abserr < DATUM_MAX_ERROR) { - datum_pts->sigma2 = abserr*abserr; - }else{ - datum_pts->sigma2 = DATUM_MAX_ERROR2; - } - }else{ - if (abserr < DATUM_MAX_ERROR) { - datum_pts->sigma2 = 0.95*datum_pts->sigma2 + 0.05*abserr*abserr; - }else{ - datum_pts->sigma2 = 0.95*datum_pts->sigma2 + 0.05*DATUM_MAX_ERROR2; - } - } - -#ifdef DEBUG_DATUM_PTC - fprintf(logfile,"Time error = %f seconds\n", ftimerr); - fflush(logfile); -#endif - -#if defined(DEBUG_DATUM_PTC) || defined(LOG_TIME_ERRORS) - fprintf(logfile, - "PTS: day %d, hour %d, minute %d, second %d, msec %d, Time Error %f\n", - datum_pts->day, - datum_pts->hour, - datum_pts->minute, - datum_pts->second, - datum_pts->msec, - ftimerr); - fflush(logfile); -#endif - -} -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_goes.c b/usr.sbin/xntpd/xntpd/refclock_goes.c deleted file mode 100644 index 512131b8625d..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_goes.c +++ /dev/null @@ -1,533 +0,0 @@ -/* - * refclock_goes - clock driver for the Kinemetrics Truetime GOES - * Receiver Version 3.0C - tested plain, with CLKLDISC - * Developement work being done: - * - Properly handle varying satellite positions (more acurately) - * - Integrate GPSTM and/or OMEGA and/or TRAK and/or ??? drivers - */ - -#if defined(REFCLOCK) && defined(GOES) - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_unixtime.h" -#include "ntp_stdlib.h" - -/* - * Support for Kinemetrics Truetime 468-DC GOES Receiver - * OM-DC OMEGA and GPS-TM/TMD support in progress... - * - * Most of this code is originally from refclock_wwvb.c with thanks. - * It has been so mangled that wwvb is not a recognizable ancestor. - * - * Timcode format: ADDD:HH:MM:SSQCL - * A - control A - * Q Quality indication: indicates possible error of - * C - Carriage return - * L - Line feed - * - * Quality codes indicate possible error of - * 468-DC GOES Receiver: - * GPS-TM/TMD Receiver: - * ? +/- 500 milliseconds # +/- 50 milliseconds - * * +/- 5 milliseconds . +/- 1 millisecond - * space less than 1 millisecond - * OM-DC OMEGA Receiver: - * > >+- 5 seconds - * ? >+/- 500 milliseconds # >+/- 50 milliseconds - * * >+/- 5 milliseconds . >+/- 1 millisecond - * A-H less than 1 millisecond. Character indicates which station - * is being received as follows: - * A = Norway, B = Liberia, C = Hawaii, D = North Dakota, - * E = La Reunion, F = Argentina, G = Australia, H = Japan. - * - * The carriage return start bit begins on 0 seconds and extends to 1 - * bit time - * - * Notes on 468-DC and OMEGA receiver: - * - * Send the clock a 'R' or 'C' and once per second a timestamp will - * appear. Send a 'P' to get the satellite position once. - * - * Notes on the 468-DC receiver: - * - * Unless you live on 125 degrees west longitude, you can't - * set your clock propagation delay settings correctly and still use - * automatic mode. The manual says to use a compromise when setting the - * switches. This results in significant errors. The solution; use fudge - * time1 and time2 to incorporate corrections. If your clock is set for - * 50 and it should be 58 for using the west and 46 for using the east, - * use the line - * - * fudge 127.127.5.0 time1 +0.008 time2 -0.004 - * - * This corrects the 4 milliseconds advance and 8 milliseconds retard - * needed. The software will ask the clock which satellite it sees. - * - * Ntp.conf parameters: - * time1 - offset applied to samples when reading WEST satellite (default = 0) - * time2 - offset applied to samples when reading EAST satellite (default = 0) - * val1 - stratum to assign to this clock (default = 0) - * val2 - refid assigned to this clock (default = "GOES", see below) - * flag1 - will silence the clock side of xntpd, just reading the clock - * without trying to write to it. (default = 0) - * flag2 - not assigned - * flag3 - enable ppsclock streams module - * flag4 - not assigned - * - */ - -/* - * Definitions - */ -#define DEVICE "/dev/goes%d" -#define SPEED232 B9600 /* 9600 baud */ - -/* - * Radio interface parameters - */ -#define MAXDISPERSE (FP_SECOND>>1) /* max error for synchronized clock (0.5 s as an u_fp) */ -#define PRECISION (-10) /* precision assumed (about 1 ms) */ -#define REFID "GOES" /* reference id */ -#define DESCRIPTION "TrueTime GPS/GOES Receivers" /* WRU */ -#define NSAMPLES 3 /* stages of median filter */ - -/* - * Tags which station (satellite) we see - */ -#define GOES_WEST 0 /* Default to WEST satellite and apply time1 */ -#define GOES_EAST 1 /* until you discover otherwise */ - -/* - * used by the state machine - */ -enum goes_event {e_Init, e_F18, e_F50, e_F51, e_TS}; - -/* - * Imported from the timer module - */ -extern u_long current_time; - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * unit control structure - */ -struct goesunit { - int pollcnt; /* poll message counter */ - u_short station; /* which station we are on */ - u_short polled; /* Hand in a time sample? */ - enum {Base, Start, F18, F50, F51, F08} - State; /* State machine */ -}; - -/* - * Function prototypes - */ -static int goes_start P((int, struct peer *)); -static void goes_shutdown P((int, struct peer *)); -static void goes_receive P((struct recvbuf *)); -static void goes_poll P((int, struct peer *)); -static void goes_send P((struct peer *, char *)); -static void goes_initstate P((struct peer *)); -static void goes_doevent P((struct peer *, enum goes_event)); - -/* - * Transfer vector - */ -struct refclock refclock_goes = { - goes_start, /* start up driver */ - goes_shutdown, /* shut down driver */ - goes_poll, /* transmit poll message */ - noentry, /* not used (old goes_control) */ - noentry, /* initialize driver (not used) */ - noentry, /* not used (old goes_buginfo) */ - NOFLAGS /* not used */ -}; - - -/* - * goes_start - open the devices and initialize data for processing - */ -static int -goes_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct goesunit *up; - struct refclockproc *pp; - int fd; - char device[20]; - - /* - * Open serial port - */ - (void)sprintf(device, DEVICE, unit); - if (!(fd = refclock_open(device, SPEED232, LDISC_CLK))) - return (0); - - /* - * Allocate and initialize unit structure - */ - if (!(up = (struct goesunit *) - emalloc(sizeof(struct goesunit)))) { - (void) close(fd); - return (0); - } - memset((char *)up, 0, sizeof(struct goesunit)); - pp = peer->procptr; - pp->io.clock_recv = goes_receive; - pp->io.srcclock = (caddr_t)peer; - pp->io.datalen = 0; - pp->io.fd = fd; - if (!io_addclock(&pp->io)) { - (void) close(fd); - free(up); - return (0); - } - pp->unitptr = (caddr_t)up; - - /* - * Initialize miscellaneous variables - */ - peer->precision = PRECISION; - pp->clockdesc = DESCRIPTION; - memcpy((char *)&pp->refid, REFID, 4); - up->pollcnt = 2; -/* goes_initstate(peer);*/ - return (1); -} - - -/* - * goes_shutdown - shut down the clock - */ -static void -goes_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct goesunit *up; - struct refclockproc *pp; - - pp = peer->procptr; - up = (struct goesunit *)pp->unitptr; - io_closeclock(&pp->io); - free(up); -} - - -/* - * goes_receive - receive data from the serial interface on a - * Kinimetrics clock - */ -static void -goes_receive(rbufp) - struct recvbuf *rbufp; -{ - register struct goesunit *up; - struct refclockproc *pp; - struct peer *peer; - l_fp tmp_l_fp; - u_short new_station; - char sync, c1, c2; - int i; - int lat, lon, off; /* GOES Satellite position */ - - /* - * Get the clock this applies to and pointers to the data - */ - peer = (struct peer *)rbufp->recv_srcclock; - pp = peer->procptr; - up = (struct goesunit *)pp->unitptr; - - /* - * Read clock output. Automatically handles STREAMS, CLKLDISC - */ - pp->lencode = refclock_gtlin(rbufp, pp->lastcode, BMAX, - &pp->lastrec); - - /* - * There is a case where <cr><lf> generates 2 timestamps - */ - if (pp->lencode == 0) - return; - - up->pollcnt = 2; - record_clock_stats(&peer->srcadr, pp->lastcode); - - /* - * We get down to business, check the timecode format and decode - * its contents. This code decodes a multitude of different - * clock messages. Timecodes are processed if needed. All replies - * will be run through the state machine to tweak driver options - * and program the clock. - */ - - /* - * Timecode: "nnnnn+nnn-nnn" - */ - if (sscanf(pp->lastcode, "%5d%c%3d%c%3d", - &lon, &c1, &lat, &c2, &off) == 5 && - (c1 == '+' || c1 == '-') && - (c2 == '+' || c2 == '-')) { - - /* - * This is less than perfect. Call the (satellite) - * either EAST or WEST and adjust slop accodingly - * Perfectionists would recalcuted the exact delay - * and adjust accordingly... - */ - if (lon > 7000 && lon < 14000) { - if (lon < 10000) - new_station = GOES_EAST; - else - new_station = GOES_WEST; -#ifdef DEBUG - if (debug) { - if (new_station == GOES_EAST) - printf("goes: station EAST\n"); - if (new_station == GOES_WEST) - printf("goes: station WEST\n"); - } -#endif - if (new_station != up->station) { - tmp_l_fp = pp->fudgetime1; - pp->fudgetime1 = pp->fudgetime2; - pp->fudgetime2 = tmp_l_fp; - up->station = new_station; - } - } - else { - refclock_report(peer, CEVNT_BADREPLY); -#ifdef DEBUG - if (debug) - printf("goes: station UNKNONW\n"); -#endif - } - /* - * Switch back to on-second time codes and return. - */ - goes_send(peer, "C"); - - return; - } - - /* - * Timecode: "Fnn" - */ - if (sscanf(pp->lastcode, "F%2d", &i) == 1 && - i > 0 && i < 80) { - enum goes_event event = 0; - - if (i == 50) event = e_F50; - if (i == 51) event = e_F51; - if (i == 50 || i == 51) { - goes_doevent(peer, event); - return; - } - } - - /* - * Timecode:" TRUETIME Mk III" - */ - if (strcmp(pp->lastcode, " TRUETIME Mk III") == 0) { - enum goes_event event; - - event = e_F18; - goes_doevent(peer, event); - return; - } - - /* - * Timecode: "ddd:hh:mm:ssQ" - */ - if (sscanf(pp->lastcode, "%3d:%2d:%2d:%2d%c", - &pp->day, &pp->hour, &pp->minute, - &pp->second, &sync) == 5) { - - /* - * Adjust the synchronize indicator according to timecode - */ - if (sync !=' ' && sync !='.' && sync !='*') - pp->leap = LEAP_NOTINSYNC; - else { - pp->leap = 0; - pp->lasttime = current_time; - } - - /* goes_doevent(peer, e_TS); */ - - /* - * The clock will blurt a timecode every second but we only - * want one when polled. If we havn't been polled, bail out. - */ - if (!up->polled) - return; - - /* - * After each poll, check the station (satellite) - */ - goes_send(peer, "P"); - - /* - * Process the new sample in the median filter and determine the - * reference clock offset and dispersion. We use lastrec as both - * the reference time and receive time in order to avoid being - * cute, like setting the reference time later than the receive - * time, which may cause a paranoid protocol module to chuck out - * the data. - */ - if (!refclock_process(pp, NSAMPLES, NSAMPLES)) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - refclock_receive(peer, &pp->offset, 0, pp->dispersion, - &pp->lastrec, &pp->lastrec, pp->leap); - - /* - * We have succedded in answering the poll. - * Turn off the flag and return - */ - up->polled = 0; - - return; - } - - /* - * No match to known timecodes, report failure and return - */ - refclock_report(peer, CEVNT_BADREPLY); - return; -} - - -/* - * goes_send - time to send the clock a signal to cough up a time sample - */ -static void -goes_send(peer, cmd) - struct peer *peer; - char *cmd; -{ - struct refclockproc *pp; - register int len = strlen(cmd); - - pp = peer->procptr; - if (!pp->sloppyclockflag & CLK_FLAG1) { -#ifdef DEBUG - if (debug) - printf("goes: Send '%s'\n", cmd); -#endif - if (write(pp->io.fd, cmd, len) != len) { - refclock_report(peer, CEVNT_FAULT); - } else { - pp->polls++; - } - } -} - - -/* - * state machine for initializing the clock - */ -static void -goes_doevent(peer, event) - struct peer *peer; - enum goes_event event; -{ - struct goesunit *up; - struct refclockproc *pp; - - pp = peer->procptr; - up = (struct goesunit *)pp->unitptr; - -#ifdef DEBUG - if (debug) { - printf("goes_doevent: %d\n", (int)event); - } -#endif - if (event == e_TS && up->State != F51 && up->State != F08) { - goes_send(peer, "\03\r"); - } - - switch (event) { - case e_Init: - goes_send(peer, "F18\r"); - up->State = Start; - break; - case e_F18: - goes_send(peer, "F50\r"); - up->State = F18; - break; - case e_F50: - goes_send(peer, "F51\r"); - up->State = F50; - break; - case e_F51: - goes_send(peer, "F08\r"); - up->State = F51; - break; - case e_TS: - /* nothing to send - we like this mode */ - up->State = F08; - break; - } -} - -static void -goes_initstate(peer) - struct peer *peer; -{ - struct goesunit *up; - struct refclockproc *pp; - - pp = peer->procptr; - up = (struct goesunit *)pp->unitptr; - up->State = Base; /* just in case */ - goes_doevent(peer, e_Init); -} - - -/* - * goes_poll - called by the transmit procedure - */ -static void -goes_poll(unit, peer) - int unit; - struct peer *peer; -{ - struct goesunit *up; - struct refclockproc *pp; - - /* - * You don't need to poll this clock. It puts out timecodes - * once per second. If asked for a timestamp, take note. - * The next time a timecode comes in, it will be fed back. - */ - pp = peer->procptr; - up = (struct goesunit *)pp->unitptr; - if (up->pollcnt == 0) { - refclock_report(peer, CEVNT_TIMEOUT); - goes_send(peer, "C"); - } - else - up->pollcnt--; - - /* - * polled every 64 seconds. Ask goes_receive to hand in a - * timestamp. - */ - up->polled = 1; - pp->polls++; -} - -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_gpstm.c b/usr.sbin/xntpd/xntpd/refclock_gpstm.c deleted file mode 100644 index 9dfc87c030ca..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_gpstm.c +++ /dev/null @@ -1,999 +0,0 @@ -/* - * refclock_gpstm - clock driver for the Kinimetrics Truetime GPSTM/TMD rcvr - * Version 1.0 (from Version 2.0 of the GOES driver, as of 03Jan94) - */ - -#if defined(REFCLOCK) && (defined(GPSTM) || defined(GPSTMCLK) \ - || defined(GPSTMPPS)) - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_unixtime.h" - -#ifdef SYS_BSDI -#undef HAVE_BSD_TTYS -#include <sys/ioctl.h> -#endif - -#if defined(HAVE_BSD_TTYS) -#include <sgtty.h> -#endif /* HAVE_BSD_TTYS */ - -#if defined(HAVE_SYSV_TTYS) -#include <termio.h> -#endif /* HAVE_SYSV_TTYS */ - -#if defined(HAVE_TERMIOS) -#include <termios.h> -#endif - -#if defined(STREAM) -#include <stropts.h> -#if defined(GPSTMCLK) -#include <clkdefs.h> -#endif /* GPSTMCLK */ -#endif /* STREAM */ - -#if defined(GPSTMPPS) -#include <sys/ppsclock.h> -#endif /* GPSTMPPS */ - -#include "ntp_stdlib.h" - -/* - * Support for Kinemetrics Truetime GPS-TM/TMD Receiver - * - * Most of this code is copied from refclock_goes.c with thanks. - * - * the time code looks like follows: - * - * ADDD:HH:MM:SSQCL - * A - control A - * Q Quality indication: indicates possible error of - * ? +/- 500 milliseconds # +/- 50 milliseconds - * * +/- 5 milliseconds . +/- 1 millisecond - * space less than 1 millisecond - * C - Carriage return - * L - Line feed - * The carriage return start bit begins on 0 seconds and extends to 1 bit time. - * - * Flag1 set to 1 will silence the clock side of xntpd, just reading the - * clock without trying to write to it. This is usefull if several - * xntpds listen to the same clock. This has not been tested yet... - */ - -/* - * Definitions - */ -#define MAXUNITS 4 /* max number of GPSTM units */ -#define GPSTM232 "/dev/gpstm%d" -#define SPEED232 B9600 /* 9600 baud */ - -/* - * Radio interface parameters - */ -#define MAXDISPERSE (FP_SECOND>>1) /* max error for synchronized clock (0.5 s as an u_fp) */ -#define PRECISION (-10) /* precision assumed (about 1 ms) */ -#define REFID "GPS\0" /* reference id */ -#define DESCRIPTION "Kinemetrics GPS-TM/TMD Receiver" /* who we are */ -#define GMT 0 /* hour offset from Greenwich */ -#define NCODES 3 /* stages of median filter */ -#define CODEDIFF 0x20000000 /* 0.125 seconds as an l_fp fraction */ -#define TIMEOUT 180 /* ping the clock if it's silent this long */ - -/* - * used by the state machine - */ -enum gpstm_event {e_Init, e_F18, e_F50, e_F51, e_TS}; -static enum {Base, Start, F18, F50, F51, F08} State[MAXUNITS]; -static void gpstm_doevent P((int, enum gpstm_event)); -static void gpstm_initstate P((int)); - -/* - * Hack to avoid excercising the multiplier. I have no pride. - */ -#define MULBY10(x) (((x)<<3) + ((x)<<1)) - -/* - * Imported from the timer module - */ -extern U_LONG current_time; -extern struct event timerqueue[]; - -/* - * Imported from ntp_loopfilter module - */ -extern int fdpps; /* pps file descriptor */ - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * GPSTM unit control structure - */ -struct gpstm_unit { - struct peer *peer; /* associated peer structure */ - struct refclockio io; /* given to the I/O handler */ - l_fp lastrec; /* last receive time */ - l_fp lastref; /* last timecode time */ - l_fp offset[NCODES]; /* recent sample offsets */ - char lastcode[BMAX]; /* last timecode received */ - u_short polled; /* Hand in a time sample? */ - u_char lencode; /* length of last timecode */ - U_LONG lasttime; /* last time clock heard from */ - u_char unit; /* unit number for this guy */ - u_char status; /* clock status */ - u_char lastevent; /* last clock event */ - u_char reason; /* reason for last abort */ - u_char year; /* year of eternity */ - u_short day; /* day of year */ - u_char hour; /* hour of day */ - u_char minute; /* minute of hour */ - u_char second; /* seconds of minute */ - u_char leap; /* leap indicators */ - u_short msec; /* millisecond of second */ - u_char quality; /* quality character */ - u_long yearstart; /* start of current year */ - /* - * Status tallies - */ - U_LONG polls; /* polls sent */ - U_LONG noreply; /* no replies to polls */ - U_LONG coderecv; /* timecodes received */ - U_LONG badformat; /* bad format */ - U_LONG baddata; /* bad data */ - U_LONG timestarted; /* time we started this */ -}; - -/* - * Data space for the unit structures. Note that we allocate these on - * the fly, but never give them back. - */ -static struct gpstm_unit *gpstm_units[MAXUNITS]; -static u_char unitinuse[MAXUNITS]; - -/* - * Keep the fudge factors separately so they can be set even - * when no clock is configured. - */ -static l_fp fudgefactor1[MAXUNITS]; -static l_fp fudgefactor2[MAXUNITS]; -static u_char stratumtouse[MAXUNITS]; -static u_char readonlyclockflag[MAXUNITS]; -static U_LONG refid[MAXUNITS]; - -/* - * Function prototypes - */ -static void gpstm_init P((void)); -static int gpstm_start P((int, struct peer *)); -static void gpstm_shutdown P((int, struct peer *)); -static void gpstm_rep_event P((struct gpstm_unit *, int)); -static void gpstm_receive P((struct recvbuf *)); -static char gpstm_process P((struct gpstm_unit *, l_fp *, u_fp *)); -static void gpstm_poll P((int, struct peer *)); -static void gpstm_control P((int, struct refclockstat *, - struct refclockstat *)); -static void gpstm_buginfo P((int, struct refclockbug *)); -static void gpstm_send P((struct gpstm_unit *, char *)); - -struct refclock refclock_gpstm = { - gpstm_start, gpstm_shutdown, gpstm_poll, - gpstm_control, gpstm_init, gpstm_buginfo, NOFLAGS -}; - -/* - * gpstm_init - initialize internal driver data - */ -static void -gpstm_init() -{ - register int i; - /* - * Just zero the data arrays - */ - memset((char *)gpstm_units, 0, sizeof gpstm_units); - memset((char *)unitinuse, 0, sizeof unitinuse); - - /* - * Initialize fudge factors to default. - */ - for (i = 0; i < MAXUNITS; i++) { - fudgefactor1[i].l_ui = 0; - fudgefactor1[i].l_uf = 0; - fudgefactor2[i].l_ui = 0; - fudgefactor2[i].l_uf = 0; - stratumtouse[i] = 0; - readonlyclockflag[i] = 0; - memcpy((char *)&refid[i], REFID, 4); - } -} - - -/* - * gpstm_start - open the device and initialize data for processing - */ -static int -gpstm_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct gpstm_unit *gpstm; - register int i; - int fd232; - char dev[20]; - - /* - * Check configuration info - */ - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "gpstm_start: unit %d invalid", unit); - return 0; - } - if (unitinuse[unit]) { - syslog(LOG_ERR, "gpstm_start: unit %d in use", unit); - return 0; - } - - /* - * Open serial port - */ - (void) sprintf(dev, GPSTM232, unit); - fd232 = open(dev, O_RDWR, 0777); - if (fd232 == -1) { - syslog(LOG_ERR, "gpstm_start: open of %s: %m", dev); - return 0; - } - -#if defined(HAVE_SYSV_TTYS) - /* - * System V serial line parameters (termio interface) - * - */ - { struct termio ttyb; - if (ioctl(fd232, TCGETA, &ttyb) < 0) { - syslog(LOG_ERR, - "gpstm_start: ioctl(%s, TCGETA): %m", dev); - goto screwed; - } - ttyb.c_iflag = IGNBRK|IGNPAR|ICRNL; - ttyb.c_oflag = 0; - ttyb.c_cflag = SPEED232|CS8|CLOCAL|CREAD; - ttyb.c_lflag = ICANON; - ttyb.c_cc[VERASE] = ttyb.c_cc[VKILL] = '\0'; - if (ioctl(fd232, TCSETA, &ttyb) < 0) { - syslog(LOG_ERR, - "gpstm_start: ioctl(%s, TCSETA): %m", dev); - goto screwed; - } - } -#endif /* HAVE_SYSV_TTYS */ -#if defined(HAVE_TERMIOS) - /* - * POSIX serial line parameters (termios interface) - * - * The GPSTMCLK option provides timestamping at the driver level. - * It requires the tty_clk streams module. - * - * The GPSTMPPS option provides timestamping at the driver level. - * It uses a 1-pps signal and level converter (gadget box) and - * requires the ppsclock streams module and SunOS 4.1.1 or - * later. - */ - { struct termios ttyb, *ttyp; - ttyp = &ttyb; - - if (tcgetattr(fd232, ttyp) < 0) { - syslog(LOG_ERR, - "gpstm_start: tcgetattr(%s): %m", dev); - goto screwed; - } - ttyp->c_iflag = IGNBRK|IGNPAR|ICRNL; - ttyp->c_oflag = 0; - ttyp->c_cflag = SPEED232|CS8|CLOCAL|CREAD; - ttyp->c_lflag = ICANON; - ttyp->c_cc[VERASE] = ttyp->c_cc[VKILL] = '\0'; - if (tcsetattr(fd232, TCSANOW, ttyp) < 0) { - syslog(LOG_ERR, - "gpstm_start: tcsetattr(%s): %m", dev); - goto screwed; - } - if (tcflush(fd232, TCIOFLUSH) < 0) { - syslog(LOG_ERR, - "gpstm_start: tcflush(%s): %m", dev); - goto screwed; - } -#if defined(STREAM) -#if defined(GPSTMCLK) - if (ioctl(fd232, I_PUSH, "clk") < 0) - syslog(LOG_ERR, - "gpstm_start: ioctl(%s, I_PUSH, clk): %m", dev); - if (ioctl(fd232, CLK_SETSTR, "\n") < 0) - syslog(LOG_ERR, - "gpstm_start: ioctl(%s, CLK_SETSTR): %m", dev); -#endif /* GPSTMCLK */ -#if defined(GPSTMPPS) - if (ioctl(fd232, I_PUSH, "ppsclock") < 0) - syslog(LOG_ERR, - "gpstm_start: ioctl(%s, I_PUSH, ppsclock): %m", dev); - else - fdpps = fd232; -#endif /* GPSTMPPS */ -#endif /* STREAM */ - } -#endif /* HAVE_TERMIOS */ -#if defined(HAVE_BSD_TTYS) - /* - * 4.3bsd serial line parameters (sgttyb interface) - * - * The GPSTMCLK option provides timestamping at the driver level. - * It requires the tty_clk line discipline and 4.3bsd or later. - */ - { struct sgttyb ttyb; -#if defined(GPSTMCLK) - int ldisc = CLKLDISC; -#endif /* GPSTMCLK */ - - if (ioctl(fd232, TIOCGETP, &ttyb) < 0) { - syslog(LOG_ERR, - "gpstm_start: ioctl(%s, TIOCGETP): %m", dev); - goto screwed; - } - ttyb.sg_ispeed = ttyb.sg_ospeed = SPEED232; -#if defined(GPSTMCLK) - ttyb.sg_erase = ttyb.sg_kill = '\r'; - ttyb.sg_flags = RAW; -#else - ttyb.sg_erase = ttyb.sg_kill = '\0'; - ttyb.sg_flags = EVENP|ODDP|CRMOD; -#endif /* GPSTMCLK */ - if (ioctl(fd232, TIOCSETP, &ttyb) < 0) { - syslog(LOG_ERR, - "gpstm_start: ioctl(%s, TIOCSETP): %m", dev); - goto screwed; - } -#if defined(GPSTMCLK) - if (ioctl(fd232, TIOCSETD, &ldisc) < 0) { - syslog(LOG_ERR, - "gpstm_start: ioctl(%s, TIOCSETD): %m", dev); - goto screwed; - } -#endif /* GPSTMCLK */ - } -#endif /* HAVE_BSD_TTYS */ - - /* - * Allocate unit structure - */ - if (gpstm_units[unit] != 0) { - gpstm = gpstm_units[unit]; /* The one we want is okay */ - } else { - for (i = 0; i < MAXUNITS; i++) { - if (!unitinuse[i] && gpstm_units[i] != 0) - break; - } - if (i < MAXUNITS) { - /* - * Reclaim this one - */ - gpstm = gpstm_units[i]; - gpstm_units[i] = 0; - } else { - gpstm = (struct gpstm_unit *) - emalloc(sizeof(struct gpstm_unit)); - } - } - memset((char *)gpstm, 0, sizeof(struct gpstm_unit)); - gpstm_units[unit] = gpstm; - - /* - * Set up the structures - */ - gpstm->peer = peer; - gpstm->unit = (u_char)unit; - gpstm->timestarted = current_time; - - gpstm->io.clock_recv = gpstm_receive; - gpstm->io.srcclock = (caddr_t)gpstm; - gpstm->io.datalen = 0; - gpstm->io.fd = fd232; - if (!io_addclock(&gpstm->io)) { - goto screwed; - } - - /* - * All done. Initialize a few random peer variables, then - * return success. - */ - peer->precision = PRECISION; - peer->rootdelay = 0; - peer->rootdispersion = 0; - peer->stratum = stratumtouse[unit]; - peer->refid = refid[unit]; - unitinuse[unit] = 1; - gpstm_initstate(unit); - return 1; - - /* - * Something broke; abandon ship - */ -screwed: - (void) close(fd232); - return 0; -} - -/* - * gpstm_shutdown - shut down a clock - */ -static void -gpstm_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct gpstm_unit *gpstm; - - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "gpstm_shutdown: unit %d invalid", unit); - return; - } - if (!unitinuse[unit]) { - syslog(LOG_ERR, "gpstm_shutdown: unit %d not in use", unit); - return; - } - - /* - * Tell the I/O module to turn us off. We're history. - */ - gpstm = gpstm_units[unit]; - io_closeclock(&gpstm->io); - unitinuse[unit] = 0; -} - - -/* - * gpstm_rep_event - note the occurance of an event - */ -static void -gpstm_rep_event(gpstm, code) - struct gpstm_unit *gpstm; - int code; -{ - struct peer *peer; - - peer = gpstm->peer; - if (gpstm->status != (u_char)code) { - gpstm->status = (u_char)code; - if (code != CEVNT_NOMINAL) - gpstm->lastevent = (u_char)code; - syslog(LOG_INFO, - "clock %s event %x\n", ntoa(&peer->srcadr), code); -#ifdef DEBUG - if (debug) { - printf("gpstm_rep_event(gpstm%d, code %d)\n", - gpstm->unit, code); - } -#endif - } - if (code == CEVNT_BADREPLY) - gpstm_initstate(gpstm->unit); -} - - -/* - * gpstm_receive - receive data from the serial interface on a clock - */ -static void -gpstm_receive(rbufp) - struct recvbuf *rbufp; -{ - register int i; - register struct gpstm_unit *gpstm; - register u_char *dpt; - register char *cp; - register u_char *dpend; - l_fp tstmp; - u_fp dispersion; - - /* - * Get the clock this applies to and a pointers to the data - */ - gpstm = (struct gpstm_unit *)rbufp->recv_srcclock; - dpt = (u_char *)&rbufp->recv_space; - - /* - * Edit timecode to remove control chars - */ - dpend = dpt + rbufp->recv_length; - cp = gpstm->lastcode; - while (dpt < dpend) { - if ((*cp = 0x7f & *dpt++) >= ' ') cp++; -#ifdef GPSTMCLK - else if (*cp == '\r') { - if (dpend - dpt < 8) { - /* short timestamp */ - return; - } - if (!buftvtots(dpt,&gpstm->lastrec)) { - /* screwy timestamp */ - return; - } - dpt += 8; - } -#endif - } - *cp = '\0'; - gpstm->lencode = cp - gpstm->lastcode; - if (gpstm->lencode == 0) - return; -#ifndef GPSTMCLK - gpstm->lastrec = rbufp->recv_time; -#endif /* GPSTMCLK */ -#if !defined(GPSTMCLK) && !defined(GPSTMPPS) && defined(TIOCMODT) - do { - auto struct timeval cur, now; - register long usec; - - if (ioctl(gpstm->io.fd, TIOCMODT, &cur) < 0) { - syslog(LOG_ERR, "TIOCMODT: %m"); -#ifdef DEBUG - if (debug) perror("TIOCMODT"); - break; -#endif - } - if (cur.tv_sec == 0) { - /* no timestamps yet */ - if (debug) printf("MODT tv_sec == 0\n"); - break; - } - - gettimeofday(&now, NULL); - usec = 1000000 * (now.tv_sec - cur.tv_sec) - + (now.tv_usec - cur.tv_usec); -#ifdef DEBUG - if (debug) printf("lastmodem: delay=%d us\n", usec); -#endif - if (usec < 0 || usec > 10000) { - /* time warp or stale timestamp */ - break; - } - if (!buftvtots((char *)&cur, &gpstm->lastrec)) { - /* screwy timestamp */ - break; - } - } while (0); -#endif /*TIOCMODT*/ - -#ifdef DEBUG - if (debug) - printf("gpstm: timecode %d %s\n", - gpstm->lencode, gpstm->lastcode); -#endif - - cp = gpstm->lastcode; - gpstm->leap = 0; - if ((cp[0] == 'F' && isdigit(cp[1]) && isdigit(cp[2])) - || (cp[0] == ' ' && cp[1] == 'T' && cp[2] == 'R')) { - enum gpstm_event event; - - syslog(LOG_NOTICE, "gpstm%d: \"%s\"", gpstm->unit, cp); - if (cp[1] == '5' && cp[2] == '0') - event = e_F50; - else if (cp[1] == '5' && cp[2] == '1') - event = e_F51; - else if (!strncmp(" TRUETIME Mk III", cp, 16)) - event = e_F18; - else { - gpstm_rep_event(gpstm, CEVNT_BADREPLY); - return; - } - gpstm_doevent(gpstm->unit, event); - return; - } else if (gpstm->lencode == 13) { - /* - * Check timecode format 0 - */ - if (!isdigit(cp[0]) /* day of year */ - || !isdigit(cp[1]) - || !isdigit(cp[2]) - || cp[3] != ':' /* : separator */ - || !isdigit(cp[4]) /* hours */ - || !isdigit(cp[5]) - || cp[6] != ':' /* : separator */ - || !isdigit(cp[7]) /* minutes */ - || !isdigit(cp[8]) - || cp[9] != ':' /* : separator */ - || !isdigit(cp[10]) /* seconds */ - || !isdigit(cp[11])) - { - gpstm->badformat++; - gpstm_rep_event(gpstm, CEVNT_BADREPLY); - return; - } - - /* - * Convert format 0 and check values - */ - gpstm->year = 0; /* fake */ - gpstm->day = cp[0] - '0'; - gpstm->day = MULBY10(gpstm->day) + cp[1] - '0'; - gpstm->day = MULBY10(gpstm->day) + cp[2] - '0'; - gpstm->hour = MULBY10(cp[4] - '0') + cp[5] - '0'; - gpstm->minute = MULBY10(cp[7] - '0') + cp[8] - '0'; - gpstm->second = MULBY10(cp[10] - '0') + cp[11] - '0'; - gpstm->msec = 0; - - if (cp[12] != ' ' && cp[12] != '.' && cp[12] != '*') - gpstm->leap = LEAP_NOTINSYNC; - else - gpstm->lasttime = current_time; - - if (gpstm->day < 1 || gpstm->day > 366) { - gpstm->baddata++; - gpstm_rep_event(gpstm, CEVNT_BADDATE); - return; - } - if (gpstm->hour > 23 || gpstm->minute > 59 - || gpstm->second > 59) { - gpstm->baddata++; - gpstm_rep_event(gpstm, CEVNT_BADTIME); - return; - } - gpstm_doevent(gpstm->unit, e_TS); - } else { - gpstm_rep_event(gpstm, CEVNT_BADREPLY); - return; - } - - /* - * The clock will blurt a timecode every second but we only - * want one when polled. If we havn't been polled, bail out. - */ - if (!gpstm->polled) - return; - - /* - * Now, compute the reference time value. Use the heavy - * machinery for the seconds and the millisecond field for the - * fraction when present. - * - * this code does not yet know how to do the years - */ - tstmp = gpstm->lastrec; - if (!clocktime(gpstm->day, gpstm->hour, gpstm->minute, - gpstm->second, GMT, tstmp.l_ui, - &gpstm->yearstart, &gpstm->lastref.l_ui)) - { - gpstm->baddata++; - gpstm_rep_event(gpstm, CEVNT_BADTIME); - return; - } - MSUTOTSF(gpstm->msec, gpstm->lastref.l_uf); - - i = ((int)(gpstm->coderecv)) % NCODES; - gpstm->offset[i] = gpstm->lastref; - L_SUB(&gpstm->offset[i], &tstmp); - if (gpstm->coderecv == 0) - for (i = 1; i < NCODES; i++) - gpstm->offset[i] = gpstm->offset[0]; - - gpstm->coderecv++; - - /* - * Process the median filter, and pass the - * offset and dispersion along. We use lastrec as both the - * reference time and receive time in order to avoid being cute, - * like setting the reference time later than the receive time, - * which may cause a paranoid protocol module to chuck out the - * data. - */ - if (!gpstm_process(gpstm, &tstmp, &dispersion)) { - gpstm->baddata++; - gpstm_rep_event(gpstm, CEVNT_BADTIME); - return; - } - refclock_receive(gpstm->peer, &tstmp, GMT, dispersion, - &gpstm->lastrec, &gpstm->lastrec, gpstm->leap); - - /* - * We have succedded in answering the poll. Turn off the flag - */ - gpstm->polled = 0; -} - -/* - * gpstm_send - time to send the clock a signal to cough up a time sample - */ -static void -gpstm_send(gpstm, cmd) - struct gpstm_unit *gpstm; - char *cmd; -{ -#ifdef DEBUG - if (debug) { - printf("gpstm_send(gpstm%d): %s\n", gpstm->unit, cmd); - } -#endif - if (!readonlyclockflag[gpstm->unit]) { - register int len = strlen(cmd); - - if (write(gpstm->io.fd, cmd, len) != len) { - syslog(LOG_ERR, "gpstm_send: unit %d: %m", - gpstm->unit); - gpstm_rep_event(gpstm, CEVNT_FAULT); - } - } -} - -/* - * state machine for initializing the clock - */ - -static void -gpstm_doevent(unit, event) - int unit; - enum gpstm_event event; -{ - struct gpstm_unit *gpstm = gpstm_units[unit]; - -#ifdef DEBUG - if (debug) { - printf("gpstm_doevent(gpstm%d, %d)\n", unit, (int)event); - } -#endif - if (event == e_TS && State[unit] != F51 && State[unit] != F08) { - gpstm_send(gpstm, "\03\r"); - } - - switch (event) { - case e_Init: - gpstm_send(gpstm, "F18\r"); - State[unit] = Start; - break; - case e_F18: - gpstm_send(gpstm, "F50\r"); - State[unit] = F18; - break; - case e_F50: - gpstm_send(gpstm, "F51\r"); - State[unit] = F50; - break; - case e_F51: - gpstm_send(gpstm, "F08\r"); - State[unit] = F51; - break; - case e_TS: - /* nothing to send - we like this mode */ - State[unit] = F08; - break; - } -} - -static void -gpstm_initstate(unit) - int unit; - { - State[unit] = Base; /* just in case */ - gpstm_doevent(unit, e_Init); -} - -/* - * gpstm_process - process a pile of samples from the clock - */ -static char -gpstm_process(gpstm, offset, dispersion) - struct gpstm_unit *gpstm; - l_fp *offset; - u_fp *dispersion; -{ - register int i, j; - register U_LONG tmp_ui, tmp_uf; - int not_median1 = -1; /* XXX correct? */ - int not_median2 = -1; /* XXX correct? */ - int median; - u_fp disp_tmp, disp_tmp2; - - /* - * This code implements a three-stage median filter. First, we - * check if the samples are within 125 ms of each other. If not, - * dump the sample set. We take the median of the three offsets - * and use that as the sample offset. We take the maximum - * difference and use that as the sample dispersion. There - * probably is not much to be gained by a longer filter, since - * the clock filter in ntp_proto should do its thing. - */ - disp_tmp2 = 0; - for (i = 0; i < NCODES-1; i++) { - for (j = i+1; j < NCODES; j++) { - tmp_ui = gpstm->offset[i].l_ui; - tmp_uf = gpstm->offset[i].l_uf; - M_SUB(tmp_ui, tmp_uf, gpstm->offset[j].l_ui, - gpstm->offset[j].l_uf); - if (M_ISNEG(tmp_ui, tmp_uf)) { - M_NEG(tmp_ui, tmp_uf); - } - if (tmp_ui != 0 || tmp_uf > CODEDIFF) { - return 0; - } - disp_tmp = MFPTOFP(0, tmp_uf); - if (disp_tmp > disp_tmp2) { - disp_tmp2 = disp_tmp; - not_median1 = i; - not_median2 = j; - } - } - } - - /* - * It seems as if all are within 125 ms of each other. - * Now to determine the median of the three. Whlie the - * 125 ms check was going on, we also subtly catch the - * dispersion and set-up for a very easy median calculation. - * The largest difference between any two samples constitutes - * the dispersion. The sample not involve in the dispersion is - * the median sample. EASY! - */ - if (gpstm->lasttime == 0 || disp_tmp2 > MAXDISPERSE) - disp_tmp2 = MAXDISPERSE; - if (not_median1 == 0) { - if (not_median2 == 1) - median = 2; - else - median = 1; - } else { - median = 0; - } - *offset = gpstm->offset[median]; - *dispersion = disp_tmp2; - return 1; -} - -/* - * gpstm_poll - called by the transmit procedure - */ -static void -gpstm_poll(unit, peer) - int unit; - struct peer *peer; -{ - struct gpstm_unit *gpstm; - - /* - * You don't need to poll this clock. It puts out timecodes - * once per second. If asked for a timestamp, take note. - * The next time a timecode comes in, it will be fed back. - */ - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "gpstm_poll: unit %d invalid", unit); - return; - } - if (!unitinuse[unit]) { - syslog(LOG_ERR, "gpstm_poll: unit %d not in use", unit); - return; - } - gpstm = gpstm_units[unit]; - if ((current_time - gpstm->lasttime) > 150) { - gpstm->noreply++; - gpstm_rep_event(gpstm_units[unit], CEVNT_TIMEOUT); - gpstm_initstate(gpstm->unit); - } - - /* - * polled every 64 seconds. Ask our receiver to hand in a timestamp. - */ - gpstm->polled = 1; - gpstm->polls++; -} - -/* - * gpstm_control - set fudge factors, return statistics - */ -static void -gpstm_control(unit, in, out) - int unit; - struct refclockstat *in; - struct refclockstat *out; -{ - register struct gpstm_unit *gpstm; - - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "gpstm_control: unit %d invalid", unit); - return; - } - - if (in != 0) { - if (in->haveflags & CLK_HAVETIME1) - fudgefactor1[unit] = in->fudgetime1; - if (in->haveflags & CLK_HAVETIME2) - fudgefactor2[unit] = in->fudgetime2; - if (in->haveflags & CLK_HAVEVAL1) - stratumtouse[unit] = (u_char)(in->fudgeval1); - if (in->haveflags & CLK_HAVEVAL2) - refid[unit] = in->fudgeval2; - if (in->haveflags & CLK_HAVEFLAG1) - readonlyclockflag[unit] = in->flags & CLK_FLAG1; - if (unitinuse[unit]) { - struct peer *peer; - - peer = gpstm_units[unit]->peer; - peer->stratum = stratumtouse[unit]; - peer->refid = refid[unit]; - } - } - - if (out != 0) { - memset((char *)out, 0, sizeof (struct refclockstat)); - out->type = REFCLK_GPSTM_TRUETIME; - out->haveflags = CLK_HAVETIME1 | CLK_HAVETIME2 | CLK_HAVEVAL1 | - CLK_HAVEVAL2 | CLK_HAVEFLAG1; - out->clockdesc = DESCRIPTION; - out->fudgetime1 = fudgefactor1[unit]; - out->fudgetime2 = fudgefactor2[unit]; - out->fudgeval1 = (LONG)stratumtouse[unit]; - out->fudgeval2 = refid[unit]; - out->flags = readonlyclockflag[unit]; - if (unitinuse[unit]) { - gpstm = gpstm_units[unit]; - out->lencode = gpstm->lencode; - out->lastcode = gpstm->lastcode; - out->timereset = current_time - gpstm->timestarted; - out->polls = gpstm->polls; - out->noresponse = gpstm->noreply; - out->badformat = gpstm->badformat; - out->baddata = gpstm->baddata; - out->lastevent = gpstm->lastevent; - out->currentstatus = gpstm->status; - } - } -} - -/* - * gpstm_buginfo - return clock dependent debugging info - */ -static void -gpstm_buginfo(unit, bug) - int unit; - register struct refclockbug *bug; -{ - register struct gpstm_unit *gpstm; - - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "gpstm_buginfo: unit %d invalid", unit); - return; - } - - if (!unitinuse[unit]) - return; - gpstm = gpstm_units[unit]; - - bug->nvalues = 11; - bug->ntimes = 5; - if (gpstm->lasttime != 0) - bug->values[0] = current_time - gpstm->lasttime; - else - bug->values[0] = 0; - bug->values[1] = (U_LONG)gpstm->reason; - bug->values[2] = (U_LONG)gpstm->year; - bug->values[3] = (U_LONG)gpstm->day; - bug->values[4] = (U_LONG)gpstm->hour; - bug->values[5] = (U_LONG)gpstm->minute; - bug->values[6] = (U_LONG)gpstm->second; - bug->values[7] = (U_LONG)gpstm->msec; - bug->values[8] = gpstm->noreply; - bug->values[9] = gpstm->yearstart; - bug->values[10] = gpstm->quality; - bug->stimes = 0x1c; - bug->times[0] = gpstm->lastref; - bug->times[1] = gpstm->lastrec; - bug->times[2] = gpstm->offset[0]; - bug->times[3] = gpstm->offset[1]; - bug->times[4] = gpstm->offset[2]; -} - -#endif /*GPSTM et al*/ diff --git a/usr.sbin/xntpd/xntpd/refclock_heath.c b/usr.sbin/xntpd/xntpd/refclock_heath.c deleted file mode 100644 index 6f2899d153c0..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_heath.c +++ /dev/null @@ -1,393 +0,0 @@ -/* - * refclock_heath - clock driver for Heath GC-1000 Most Accurate Clock - */ -#if defined(REFCLOCK) && defined(HEATH) - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> -#include <time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_stdlib.h" - -/* - * 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, or to the host local time zone (with - * DST) and 12-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 12-hour mode - * with DST selected the clock will be incorrect by an hour for an - * indeterminate amount of time between 0000Z and 0200 on the day DST - * changes. - * - * 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. - * - * A simple hardware modification to the clock can be made which - * prevents the clock hearing the request to send (RTS) if the HI SPEC - * lamp is out. Route the HISPEC signal to the tone decoder board pin - * 19, from the display, pin 19. Isolate pin 19 of the decoder board - * first, but maintain connection with pin 10. Also isolate pin 38 of - * the CPU on the tone board, and use half an added 7400 to gate the - * original signal to pin 38 with that from pin 19. - * - * The clock message consists of 23 ASCII printing characters in the - * following format: - * - * hh:mm:ss.f AM dd/mm/yr<cr> - * - * hh:mm:ss.f = hours, minutes, seconds - * f = deciseconds ('?' when out of spec) - * AM/PM/bb = blank in 24-hour mode - * dd/mm/yr = day, month, year - * - * The alarm condition is indicated by '?', rather than a digit, at f. - * 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 - * - * A fudge time1 value of .04 s appears to center the clock offset - * residuals. The fudge time2 parameter is the local time offset east of - * Greenwich, which depends on DST. Sorry about that, but the clock - * gives no hint on what the DIPswitches say. - */ - -/* - * Interface definitions - */ -#define DEVICE "/dev/heath%d" /* device name and unit */ -#define SPEED232 B1200 /* uart speed (1200 baud) */ -#define PRECISION (-4) /* precision assumed (about 100 ms) */ -#define REFID "WWV\0" /* reference ID */ -#define DESCRIPTION "Heath GC-1000 Most Accurate Clock" /* WRU */ - -#define NSAMPLES 3 /* stages of median filter */ -#define LENHEATH 23 /* min timecode length */ - -/* - * Imported from ntp_timer module - */ -extern u_long current_time; /* current time (s) */ - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * Tables to compute the ddd of year form icky dd/mm timecode. Viva la - * leap. - */ -static day1tab[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; -static day2tab[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; - -/* - * Unit control structure - */ -struct heathunit { - int pollcnt; /* poll message counter */ - l_fp tstamp; /* timestamp of last poll */ -}; - -/* - * Function prototypes - */ -static int heath_start P((int, struct peer *)); -static void heath_shutdown P((int, struct peer *)); -static void heath_receive P((struct recvbuf *)); -static void heath_poll P((int, struct peer *)); - -/* - * Transfer vector - */ -struct refclock refclock_heath = { - heath_start, /* start up driver */ - heath_shutdown, /* shut down driver */ - heath_poll, /* transmit poll message */ - noentry, /* not used (old heath_control) */ - noentry, /* initialize driver */ - noentry, /* not used (old heath_buginfo) */ - NOFLAGS /* not used */ -}; - - -/* - * heath_start - open the devices and initialize data for processing - */ -static int -heath_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct heathunit *up; - struct refclockproc *pp; - int fd; - char device[20]; - - /* - * Open serial port - */ - (void)sprintf(device, DEVICE, unit); - if (!(fd = refclock_open(device, SPEED232, 0))) - return (0); - - /* - * Allocate and initialize unit structure - */ - if (!(up = (struct heathunit *) - emalloc(sizeof(struct heathunit)))) { - (void) close(fd); - return (0); - } - memset((char *)up, 0, sizeof(struct heathunit)); - pp = peer->procptr; - pp->io.clock_recv = heath_receive; - pp->io.srcclock = (caddr_t)peer; - pp->io.datalen = 0; - pp->io.fd = fd; - if (!io_addclock(&pp->io)) { - (void) close(fd); - free(up); - return (0); - } - pp->unitptr = (caddr_t)up; - - /* - * Initialize miscellaneous variables - */ - peer->precision = PRECISION; - pp->clockdesc = DESCRIPTION; - memcpy((char *)&pp->refid, REFID, 4); - up->pollcnt = 2; - return (1); -} - - -/* - * heath_shutdown - shut down the clock - */ -static void -heath_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct heathunit *up; - struct refclockproc *pp; - - pp = peer->procptr; - up = (struct heathunit *)pp->unitptr; - io_closeclock(&pp->io); - free(up); -} - - -/* - * heath_receive - receive data from the serial interface - */ -static void -heath_receive(rbufp) - struct recvbuf *rbufp; -{ - register struct heathunit *up; - struct refclockproc *pp; - struct peer *peer; - l_fp trtmp; - int month, day; - int i; - char dsec, a[5]; - - /* - * Initialize pointers and read the timecode and timestamp - */ - peer = (struct peer *)rbufp->recv_srcclock; - pp = peer->procptr; - up = (struct heathunit *)pp->unitptr; - pp->lencode = refclock_gtlin(rbufp, pp->lastcode, BMAX, &trtmp); - - /* - * We get a buffer and timestamp for each <cr>; however, we use - * the timestamp captured at the RTS modem control line toggle - * on the assumption that's what the radio bases the timecode - * on. Apparently, the radio takes about a second to make up its - * mind to send a timecode, so the receive timestamp is - * worthless. - */ - pp->lastrec = up->tstamp; - up->pollcnt = 2; - record_clock_stats(&peer->srcadr, pp->lastcode); -#ifdef DEBUG - if (debug) - printf("heath: timecode %d %s\n", pp->lencode, - pp->lastcode); -#endif - - /* - * We get down to business, check the timecode format and decode - * its contents. If the timecode has invalid length or is not in - * proper format, we declare bad format and exit. - */ - if (pp->lencode < LENHEATH) { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - - /* - * Timecode format: "hh:mm:ss.f AM mm/dd/yy" - */ - if (sscanf(pp->lastcode, "%2d:%2d:%2d.%c%5c%2d/%2d/%2d", - &pp->hour, &pp->minute, &pp->second, &dsec, a, &month, &day, - &pp->year) != 8) { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - - /* - * If AM or PM is received, assume the clock is displaying local - * time. First, convert to 24-hour format, then add the local - * time correction (in hours east of Greenwich) from - * fudgetime2. - */ - switch (a[1]) { - case 'P': - if (pp->hour < 12) - pp->hour += 12; - break; - - case 'A': - if (pp->hour == 12) - pp->hour -= 12; - break; - } - i = (int)pp->hour - (int)pp->fudgetime2.l_ui; - if (i < 0) - i += 24; - pp->hour = i % 24; - - /* - * We determine the day of the year from the DIPswitches. This - * should be fixed, since somebody might forget to set them. - * Someday this hazard will be fixed by a fiendish scheme that - * looks at the timecode and year the radio shows, then computes - * the residue of the seconds mod the seconds in a leap cycle. - * If in the third year of that cycle and the third and later - * months of that year, add one to the day. Then, correct the - * timecode accordingly. Icky pooh. This bit of nonsense could - * be avoided if the engineers had been required to write a - * device driver before finalizing the timecode format. - * - * Yes, I know this code incorrectly thinks that 2100 is a leap - * year; but, the latest year that can be set by the DIPswitches - * is 1997 anyay. Life is short. - */ - if (month < 1 || month > 12 || day < 1) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - if (pp->year % 4) { - if (day > day1tab[month - 1]) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - for (i = 0; i < month - 1; i++) - day += day1tab[i]; - } else { - if (day > day2tab[month - 1]) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - for (i = 0; i < month - 1; i++) - day += day2tab[i]; - } - pp->day = day; - - /* - * Determine synchronization and last update - */ - if (!isdigit(dsec)) { - pp->leap = LEAP_NOTINSYNC; - } else { - pp->leap = 0; - pp->lasttime = current_time; - pp->msec = (dsec - '0') * 100; - } - - /* - * Process the new sample in the median filter and determine the - * reference clock offset and dispersion. We use lastrec as both - * the reference time and receive time, in order to avoid being - * cute, like setting the reference time later than the receive - * time, which may cause a paranoid protocol module to chuck out - * the data. - */ - if (!refclock_process(pp, NSAMPLES, NSAMPLES)) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - refclock_receive(peer, &pp->offset, 0, pp->dispersion, - &pp->lastrec, &pp->lastrec, pp->leap); -} - - -/* - * heath_poll - called by the transmit procedure - */ -static void -heath_poll(unit, peer) - int unit; - struct peer *peer; -{ - register struct heathunit *up; - struct refclockproc *pp; - int bits = TIOCM_RTS; - - /* - * At each poll we check for timeout and toggle the RTS modem - * control line, then take a timestamp. Presumably, this is the - * event the radio captures to generate the timecode. - */ - pp = peer->procptr; - up = (struct heathunit *)pp->unitptr; - if (up->pollcnt == 0) - refclock_report(peer, CEVNT_TIMEOUT); - else - up->pollcnt--; - pp->polls++; - - /* - * We toggle the RTS modem control lead to kick a timecode loose - * from the radio. This code works only for POSIX and SYSV - * interfaces. With bsd you are on your own. We take a timestamp - * between the up and down edges to lengthen the pulse, which - * should be about 50 usec on a Sun IPC. With hotshot CPUs, the - * pulse might get too short. Later. - */ - if (ioctl(pp->io.fd, TIOCMBIC, (char *)&bits) < 0) - refclock_report(peer, CEVNT_FAULT); - gettstamp(&up->tstamp); - ioctl(pp->io.fd, TIOCMBIS, (char *)&bits); - -} - -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_irig.c b/usr.sbin/xntpd/xntpd/refclock_irig.c deleted file mode 100644 index bc93fd74a918..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_irig.c +++ /dev/null @@ -1,259 +0,0 @@ -/* - * refclock_irig - clock driver for the IRIG audio decoder - */ -#if defined(REFCLOCK) && defined(IRIG) && defined(sun) - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> -#include <sys/ioccom.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_unixtime.h" -#include <sys/bsd_audioirig.h> -#include "ntp_stdlib.h" - -/* - * This driver supports the IRIG audio decoder. This clever gadget uses - * a modified BSD audio driver for the Sun SPARCstation which provides - * a timestamp, raw binary timecode, status byte and decoded ASCII - * timecode. The data are represented in the structure in the - * sys/bsd_audioirig.h header file: - * - * struct irig_time { - * struct timeval stamp; timestamp - * u_char bits[13]; 100 IRIG data bits - * u_char status; status byte - * char time[14]; time string (null terminated) - * - * where stamp represents a timestamp at the zero crossing of the index - * marker at the second's epoch, bits is a 13-octet, zero-padded binary- - * coded string representing code elements 1 through 100 in the IRIG-B - * code format, and status is a status bute, The decoded timestamp is a - * 13-octet, null-terminated ASCII string "ddd hh:mm:ss*", where ddd is - * the day of year, hh:mm:ss the time of day and * is a status - * indicator, with " " indicating valid time and "?" indicating - * something wrong. - * - * The timestamp is in Unix timeval format, consisting of two 32-bit - * words, the first of which is the seconds since 1970 and the second is - * the fraction of the second in microseconds. The status byte is zero - * if (a) the input signal is within amplitude tolerances, (b) the raw - * binary timecode contains only valid code elements, (c) 11 position - * identifiers have been found at the expected element positions, (d) - * the clock status byte contained in the timecode is valid, and (e) a - * time determination has been made since the last read() system call. - * - * The 100 elements of the IRIG-B timecode are numbered from 0 through - * 99. Position identifiers occur at elements 0, 9, 19 and every ten - * thereafter to 99. The control function (CF) elements begin at element - * 50 (CF 1) and extend to element 78 (CF 27). The straight-binary- - * seconds (SBS) field, which encodes the seconds of the UTC day, begins - * at element 80 (CF 28) and extends to element 97 (CF 44). The encoding - * of elements 50 (CF 1) through 78 (CF 27) is device dependent. This - * driver presently does not use the CF elements. - * - * Where feasible, the interface should be operated with signature - * control, so that, if the IRIG signal is lost or malformed, the - * interface produces an unmodulated signal, rather than possibly random - * digits. The driver will declare "unsynchronized" in this case. - * - * Spectracom Netclock/2 WWVB Synchronized Clock - * - * Element CF Function - * ------------------------------------- - * 55 6 time sync status - * 60-63 10-13 bcd year units - * 65-68 15-18 bcd year tens - * - */ - -/* - * IRIG interface definitions - */ -#define DEVICE "/dev/irig%d" /* device name and unit */ -#define PRECISION (-13) /* precision assumed (100 us) */ -#define REFID "IRIG" /* reference ID */ -#define DESCRIPTION "IRIG Audio Decoder" /* WRU */ - -#define NSAMPLES 3 /* stages of median filter */ -#define IRIG_FORMAT 1 /* IRIG timestamp format */ - -/* - * Imported from ntp_timer module - */ -extern u_long current_time; /* current time (s) */ - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * Function prototypes - */ -static int irig_start P((int, struct peer *)); -static void irig_shutdown P((int, struct peer *)); -static void irig_poll P((int, struct peer *)); - -/* - * Transfer vector - */ -struct refclock refclock_irig = { - irig_start, /* start up driver */ - irig_shutdown, /* shut down driver */ - irig_poll, /* transmit poll message */ - noentry, /* not used (old irig_control) */ - noentry, /* initialize driver (not used) */ - noentry, /* not used (old irig_buginfo) */ - NOFLAGS /* not used */ -}; - - -/* - * irig_start - open the device and initialize data for processing - */ -static int -irig_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct refclockproc *pp; - char device[20]; - int fd; - int format = IRIG_FORMAT; - - /* - * Open audio device and set format - */ - (void)sprintf(device, DEVICE, unit); - fd = open(device, O_RDONLY | O_NDELAY, 0777); - if (fd == -1) { - syslog(LOG_ERR, "irig_start: open of %s: %m", device); - return (0); - } - if (ioctl(fd, AUDIO_IRIG_OPEN, 0) < 0) { - syslog(LOG_ERR, "irig_start: AUDIO_IRIG_OPEN %m"); - close(fd); - return (0); - } - if (ioctl(fd, AUDIO_IRIG_SETFORMAT, (char *)&format) < 0) { - syslog(LOG_ERR, "irig_start: AUDIO_IRIG_SETFORMAT %m", - DEVICE); - close(fd); - return (0); - } - pp = peer->procptr; - pp->io.clock_recv = noentry; - pp->io.srcclock = (caddr_t)peer; - pp->io.datalen = 0; - pp->io.fd = fd; - - /* - * Initialize miscellaneous variables - */ - peer->precision = PRECISION; - pp->clockdesc = DESCRIPTION; - memcpy((char *)&pp->refid, REFID, 4); - return (1); -} - - -/* - * irig_shutdown - shut down the clock - */ -static void -irig_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - struct refclockproc *pp; - - pp = peer->procptr; - io_closeclock(&pp->io); -} - - -/* - * irig_poll - called by the transmit procedure - */ -static void -irig_poll(unit, peer) - int unit; - struct peer *peer; -{ - - struct refclockproc *pp; - struct irig_time buf; - char *cp, *dp; - u_char *dpt; - int i; - - pp = peer->procptr; - if (read(pp->io.fd, (char *) &buf, sizeof(buf)) != sizeof(buf)) { - refclock_report(peer, CEVNT_FAULT); - return; - } - pp->polls++; - -#ifdef DEBUG - if (debug) { - dpt = (u_char *)&buf; - printf("irig: "); - for (i = 0; i < sizeof(buf); i++) - printf("%02x", *dpt++); - printf("\n"); - } -#endif - - buf.stamp.tv_sec += JAN_1970; - TVTOTS(&buf.stamp, &pp->lastrec); - cp = buf.time; - dp = pp->lastcode; - for (i = 0; i < sizeof(buf.time); i++) - *dp++ = *cp++; - *--dp = '\0'; - pp->lencode = dp - pp->lastcode; - -#ifdef DEBUG - if (debug) - printf("irig: time %s timecode %d %s\n", - ulfptoa(&pp->lastrec, 6), pp->lencode, - pp->lastcode); -#endif - record_clock_stats(&peer->srcadr, pp->lastcode); - - /* - * Get IRIG time and convert to timestamp format - */ - if (sscanf(pp->lastcode, "%3d %2d:%2d:%2d", - &pp->day, &pp->hour, &pp->minute, &pp->second) != 4) { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - if (pp->lastcode[12] != ' ') { - pp->leap = LEAP_NOTINSYNC; - } else { - pp->leap = 0; - pp->lasttime = current_time; - } - - /* - * Process the new sample in the median filter and determine the - * reference clock offset and dispersion. We use lastrec as both - * the reference time and receive time in order to avoid being - * cute, like setting the reference time later than the receive - * time, which may cause a paranoid protocol module to chuck out - * the data. - */ - if (!refclock_process(pp, NSAMPLES, NSAMPLES)) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - refclock_receive(peer, &pp->offset, 0, pp->dispersion, - &pp->lastrec, &pp->lastrec, pp->leap); -} - -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_leitch.c b/usr.sbin/xntpd/xntpd/refclock_leitch.c deleted file mode 100644 index b6b002f5faba..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_leitch.c +++ /dev/null @@ -1,710 +0,0 @@ -/* - * refclock_leitch - clock driver for the Leitch CSD-5300 Master Clock - */ -#if defined(REFCLOCK) && (defined(LEITCH) || defined(LEITCHCLK) || defined(LEITCHPPS)) - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_unixtime.h" - -#if defined(HAVE_BSD_TTYS) -#include <sgtty.h> -#endif /* HAVE_BSD_TTYS */ - -#if defined(HAVE_SYSV_TTYS) -#include <termio.h> -#endif /* HAVE_SYSV_TTYS */ - -#if defined(HAVE_TERMIOS) -#include <termios.h> -#endif -#ifdef STREAM -#include <stropts.h> -#if defined(LEITCHCLK) -#include <sys/clkdefs.h> -#endif /* LEITCHCLK */ -#endif /* STREAM */ - -#if defined (LEITCHPPS) -#include <sys/ppsclock.h> -#endif /* LEITCHPPS */ - -#include "ntp_stdlib.h" - -/* - * Driver for Leitch CSD-5300 Master Clock System - * - * COMMANDS: - * DATE: D <CR> - * TIME: T <CR> - * STATUS: S <CR> - * LOOP: L <CR> - * - * FORMAT: - * DATE: YYMMDD<CR> - * TIME: <CR>/HHMMSS <CR>/HHMMSS <CR>/HHMMSS <CR>/ - * second bondaried on the stop bit of the <CR> - * second boundaries at '/' above. - * STATUS: G (good), D (diag fail), T (time not provided) or - * P (last phone update failed) - */ -#define MAXUNITS 1 /* max number of LEITCH units */ -#define LEITCHREFID "ATOM" /* reference id */ -#define LEITCH_DESCRIPTION "Leitch: CSD 5300 Master Clock System Driver" -#define LEITCH232 "/dev/leitch%d" /* name of radio device */ -#define SPEED232 B300 /* uart speed (300 baud) */ -#define leitch_send(A,M) \ - if (debug) fprintf(stderr,"write leitch %s\n",M); \ - if ((write(A->leitchio.fd,M,sizeof(M)) < 0)) {\ - if (debug) \ - fprintf(stderr, "leitch_send: unit %d send failed\n", A->unit); \ - else \ - syslog(LOG_ERR, "leitch_send: unit %d send failed %m",A->unit);} - -#define STATE_IDLE 0 -#define STATE_DATE 1 -#define STATE_TIME1 2 -#define STATE_TIME2 3 -#define STATE_TIME3 4 - -extern struct event timerqueue[]; - -/* - * Imported from ntp_loopfilter module - */ -extern int fdpps; /* pps file descriptor */ - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * LEITCH unit control structure - */ -struct leitchunit { - struct peer *peer; - struct event leitchtimer; - struct refclockio leitchio; - u_char unit; - short year; - short yearday; - short month; - short day; - short hour; - short second; - short minute; - short state; - u_short fudge1; - l_fp reftime1; - l_fp reftime2; - l_fp reftime3; - l_fp codetime1; - l_fp codetime2; - l_fp codetime3; - u_long yearstart; -}; - -/* - * Function prototypes - */ -static void leitch_init P((void)); -static int leitch_start P((int, struct peer *)); -static void leitch_shutdown P((int, struct peer *)); -static void leitch_poll P((int, struct peer *)); -static void leitch_control P((int, struct refclockstat *, struct refclockstat *)); -#define leitch_buginfo noentry -static void leitch_receive P((struct recvbuf *)); -static void leitch_process P((struct leitchunit *)); -static void leitch_timeout P((struct peer *)); -static int leitch_get_date P((struct recvbuf *, struct leitchunit *)); -static int leitch_get_time P((struct recvbuf *, struct leitchunit *, int)); -static int dysize P((int)); - -static struct leitchunit leitchunits[MAXUNITS]; -static u_char unitinuse[MAXUNITS]; -static u_char stratumtouse[MAXUNITS]; -static U_LONG refid[MAXUNITS]; - -static char days_in_month [] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - -/* - * Transfer vector - */ -struct refclock refclock_leitch = { - leitch_start, leitch_shutdown, leitch_poll, - leitch_control, leitch_init, leitch_buginfo, NOFLAGS -}; - -/* - * leitch_init - initialize internal leitch driver data - */ -static void -leitch_init() -{ - int i; - - memset((char*)leitchunits, 0, sizeof(leitchunits)); - memset((char*)unitinuse, 0, sizeof(unitinuse)); - for (i = 0; i < MAXUNITS; i++) - memcpy((char *)&refid[i], LEITCHREFID, 4); -} - -/* - * leitch_shutdown - shut down a LEITCH clock - */ -static void -leitch_shutdown(unit, peer) - int unit; - struct peer *peer; -{ -#ifdef DEBUG - if (debug) - fprintf(stderr, "leitch_shutdown()\n"); -#endif -} - -/* - * leitch_poll - called by the transmit procedure - */ -static void -leitch_poll(unit, peer) - int unit; - struct peer *peer; -{ - struct leitchunit *leitch; - - /* start the state machine rolling */ - -#ifdef DEBUG - if (debug) - fprintf(stderr, "leitch_poll()\n"); -#endif - if (unit > MAXUNITS) { - /* XXXX syslog it */ - return; - } - - leitch = &leitchunits[unit]; - - if (leitch->state != STATE_IDLE) { - /* reset and wait for next poll */ - /* XXXX syslog it */ - leitch->state = STATE_IDLE; - } else { - leitch_send(leitch,"D\r"); - leitch->state = STATE_DATE; - } -} - -static void -leitch_control(unit, in, out) - int unit; - struct refclockstat *in; - struct refclockstat *out; -{ - if (unit >= MAXUNITS) { - syslog(LOG_ERR, - "leitch_control: unit %d invalid", unit); - return; - } - - if (in) { - if (in->haveflags & CLK_HAVEVAL1) - stratumtouse[unit] = (u_char)(in->fudgeval1); - if (in->haveflags & CLK_HAVEVAL2) - refid[unit] = in->fudgeval2; - if (unitinuse[unit]) { - struct peer *peer; - - peer = (&leitchunits[unit])->peer; - peer->stratum = stratumtouse[unit]; - peer->refid = refid[unit]; - } - } - - if (out) { - memset((char *)out, 0, sizeof (struct refclockstat)); - out->type = REFCLK_ATOM_LEITCH; - out->haveflags = CLK_HAVEVAL1 | CLK_HAVEVAL2; - out->fudgeval1 = (LONG)stratumtouse[unit]; - out->fudgeval2 = refid[unit]; - out->lastcode = ""; - out->clockdesc = LEITCH_DESCRIPTION; - } -} - -/* - * leitch_start - open the LEITCH devices and initialize data for processing - */ -static int -leitch_start(unit, peer) - int unit; - struct peer *peer; -{ - struct leitchunit *leitch; - int fd232; - char leitchdev[20]; - - /* - * Check configuration info. - */ - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "leitch_start: unit %d invalid", unit); - return (0); - } - - if (unitinuse[unit]) { - syslog(LOG_ERR, "leitch_start: unit %d in use", unit); - return (0); - } - - /* - * Open serial port. - */ - (void) sprintf(leitchdev, LEITCH232, unit); - fd232 = open(leitchdev, O_RDWR, 0777); - if (fd232 == -1) { - syslog(LOG_ERR, - "leitch_start: open of %s: %m", leitchdev); - return (0); - } - - leitch = &leitchunits[unit]; - memset((char*)leitch, 0, sizeof(*leitch)); - -#if defined(HAVE_SYSV_TTYS) - /* - * System V serial line parameters (termio interface) - * - */ - { struct termio ttyb; - if (ioctl(fd232, TCGETA, &ttyb) < 0) { - syslog(LOG_ERR, - "leitch_start: ioctl(%s, TCGETA): %m", leitchdev); - goto screwed; - } - ttyb.c_iflag = IGNBRK|IGNPAR|ICRNL; - ttyb.c_oflag = 0; - ttyb.c_cflag = SPEED232|CS8|CLOCAL|CREAD; - ttyb.c_lflag = ICANON; - ttyb.c_cc[VERASE] = ttyb.c_cc[VKILL] = '\0'; - if (ioctl(fd232, TCSETA, &ttyb) < 0) { - syslog(LOG_ERR, - "leitch_start: ioctl(%s, TCSETA): %m", leitchdev); - goto screwed; - } - } -#endif /* HAVE_SYSV_TTYS */ -#if defined(HAVE_TERMIOS) - /* - * POSIX serial line parameters (termios interface) - * - * The LEITCHCLK option provides timestamping at the driver level. - * It requires the tty_clk streams module. - * - * The LEITCHPPS option provides timestamping at the driver level. - * It uses a 1-pps signal and level converter (gadget box) and - * requires the ppsclock streams module and SunOS 4.1.1 or - * later. - */ - { struct termios ttyb, *ttyp; - - ttyp = &ttyb; - if (tcgetattr(fd232, ttyp) < 0) { - syslog(LOG_ERR, - "leitch_start: tcgetattr(%s): %m", leitchdev); - goto screwed; - } - ttyp->c_iflag = IGNBRK|IGNPAR|ICRNL; - ttyp->c_oflag = 0; - ttyp->c_cflag = SPEED232|CS8|CLOCAL|CREAD; - ttyp->c_lflag = ICANON; - ttyp->c_cc[VERASE] = ttyp->c_cc[VKILL] = '\0'; - if (tcsetattr(fd232, TCSANOW, ttyp) < 0) { - syslog(LOG_ERR, - "leitch_start: tcsetattr(%s): %m", leitchdev); - goto screwed; - } - if (tcflush(fd232, TCIOFLUSH) < 0) { - syslog(LOG_ERR, - "leitch_start: tcflush(%s): %m", leitchdev); - goto screwed; - } - } -#endif /* HAVE_TERMIOS */ -#ifdef STREAM -#if defined(LEITCHCLK) - if (ioctl(fd232, I_PUSH, "clk") < 0) - syslog(LOG_ERR, - "leitch_start: ioctl(%s, I_PUSH, clk): %m", leitchdev); - if (ioctl(fd232, CLK_SETSTR, "\n") < 0) - syslog(LOG_ERR, - "leitch_start: ioctl(%s, CLK_SETSTR): %m", leitchdev); -#endif /* LEITCHCLK */ -#if defined(LEITCHPPS) - if (ioctl(fd232, I_PUSH, "ppsclock") < 0) - syslog(LOG_ERR, - "leitch_start: ioctl(%s, I_PUSH, ppsclock): %m", leitchdev); - else - fdpps = fd232; -#endif /* LEITCHPPS */ -#endif /* STREAM */ -#if defined(HAVE_BSD_TTYS) - /* - * 4.3bsd serial line parameters (sgttyb interface) - * - * The LEITCHCLK option provides timestamping at the driver level. - * It requires the tty_clk line discipline and 4.3bsd or later. - */ - { struct sgttyb ttyb; -#if defined(LEITCHCLK) - int ldisc = CLKLDISC; -#endif /* LEITCHCLK */ - - if (ioctl(fd232, TIOCGETP, &ttyb) < 0) { - syslog(LOG_ERR, - "leitch_start: ioctl(%s, TIOCGETP): %m", leitchdev); - goto screwed; - } - ttyb.sg_ispeed = ttyb.sg_ospeed = SPEED232; -#if defined(LEITCHCLK) - ttyb.sg_erase = ttyb.sg_kill = '\r'; - ttyb.sg_flags = RAW; -#else - ttyb.sg_erase = ttyb.sg_kill = '\0'; - ttyb.sg_flags = EVENP|ODDP|CRMOD; -#endif /* LEITCHCLK */ - if (ioctl(fd232, TIOCSETP, &ttyb) < 0) { - syslog(LOG_ERR, - "leitch_start: ioctl(%s, TIOCSETP): %m", leitchdev); - goto screwed; - } -#if defined(LEITCHCLK) - if (ioctl(fd232, TIOCSETD, &ldisc) < 0) { - syslog(LOG_ERR, - "leitch_start: ioctl(%s, TIOCSETD): %m",leitchdev); - goto screwed; - } -#endif /* LEITCHCLK */ - } -#endif /* HAVE_BSD_TTYS */ - - /* - * Set up the structures - */ - leitch->peer = peer; - leitch->unit = unit; - leitch->state = STATE_IDLE; - leitch->fudge1 = 15; /* 15ms */ - - leitch->leitchio.clock_recv = leitch_receive; - leitch->leitchio.srcclock = (caddr_t) leitch; - leitch->leitchio.datalen = 0; - leitch->leitchio.fd = fd232; - if (!io_addclock(&leitch->leitchio)) { - goto screwed; - } - - /* - * All done. Initialize a few random peer variables, then - * return success. Note that root delay and root dispersion are - * always zero for this clock. - */ - peer->precision = 0; - peer->rootdelay = 0; - peer->rootdispersion = 0; - peer->stratum = stratumtouse[unit]; - peer->refid = refid[unit]; - unitinuse[unit] = 1; - return(1); - - /* - * Something broke; abandon ship. - */ -screwed: - close(fd232); - return(0); -} - -/* - * leitch_receive - receive data from the serial interface on a leitch - * clock - */ -static void -leitch_receive(rbufp) - struct recvbuf *rbufp; -{ - struct leitchunit *leitch = (struct leitchunit *)rbufp->recv_srcclock; - -#ifdef DEBUG - if (debug) - fprintf(stderr, "leitch_recieve(%*.*s)\n", - rbufp->recv_length, rbufp->recv_length, - rbufp->recv_buffer); -#endif - if (rbufp->recv_length != 7) - return; /* The date is return with a trailing newline, - discard it. */ - - switch (leitch->state) { - case STATE_IDLE: /* unexpected, discard and resync */ - return; - case STATE_DATE: - if (!leitch_get_date(rbufp,leitch)) { - leitch->state = STATE_IDLE; - break; - } - leitch_send(leitch,"T\r"); -#ifdef DEBUG - if (debug) - fprintf(stderr, "%u\n",leitch->yearday); -#endif - leitch->state = STATE_TIME1; - break; - case STATE_TIME1: - if (!leitch_get_time(rbufp,leitch,1)) { - } - if (!clocktime(leitch->yearday,leitch->hour,leitch->minute, - leitch->second, 0, rbufp->recv_time.l_ui, - &leitch->yearstart, &leitch->reftime1.l_ui)) { - leitch->state = STATE_IDLE; - break; - } -#ifdef DEBUG - if (debug) - fprintf(stderr, "%u\n", leitch->reftime1.l_ui); -#endif - MSUTOTSF(leitch->fudge1, leitch->reftime1.l_uf); - leitch->codetime1 = rbufp->recv_time; - leitch->state = STATE_TIME2; - break; - case STATE_TIME2: - if (!leitch_get_time(rbufp,leitch,2)) { - } - if (!clocktime(leitch->yearday,leitch->hour,leitch->minute, - leitch->second, 0, rbufp->recv_time.l_ui, - &leitch->yearstart, &leitch->reftime2.l_ui)) { - leitch->state = STATE_IDLE; - break; - } -#ifdef DEBUG - if (debug) - fprintf(stderr, "%u\n", leitch->reftime2.l_ui); -#endif - MSUTOTSF(leitch->fudge1, leitch->reftime2.l_uf); - leitch->codetime2 = rbufp->recv_time; - leitch->state = STATE_TIME3; - break; - case STATE_TIME3: - if (!leitch_get_time(rbufp,leitch,3)) { - } - if (!clocktime(leitch->yearday,leitch->hour,leitch->minute, - leitch->second, 0, rbufp->recv_time.l_ui, - &leitch->yearstart, &leitch->reftime3.l_ui)) { - leitch->state = STATE_IDLE; - break; - } -#ifdef DEBUG - if (debug) - fprintf(stderr, "%u\n", leitch->reftime3.l_ui); -#endif - MSUTOTSF(leitch->fudge1, leitch->reftime3.l_uf); - leitch->codetime3 = rbufp->recv_time; - leitch_process(leitch); - leitch->state = STATE_IDLE; - break; - default: - syslog(LOG_ERR, - "leitech_receive: invalid state %d unit %d", - leitch->state, leitch->unit); - } -} - -/* - * leitch_process - process a pile of samples from the clock - * - * This routine uses a three-stage median filter to calculate offset and - * dispersion. reduce jitter. The dispersion is calculated as the span - * of the filter (max - min), unless the quality character (format 2) is - * non-blank, in which case the dispersion is calculated on the basis of - * the inherent tolerance of the internal radio oscillator, which is - * +-2e-5 according to the radio specifications. - */ -static void -leitch_process(leitch) - struct leitchunit *leitch; -{ - l_fp off; - s_fp delay; - l_fp codetime; - l_fp tmp_fp; - int isinsync = 1; - u_fp dispersion = 10; - - delay = 20; - - codetime = leitch->codetime3; - - off = leitch->reftime1; - L_SUB(&off,&leitch->codetime1); - -#ifdef DEBUG - if (debug) - fprintf(stderr,"%u %u %u %u %d %d\n", - leitch->codetime1.l_ui, leitch->codetime1.l_uf, - leitch->reftime1.l_ui, leitch->reftime1.l_uf, - off.l_ui, off.l_uf); -#endif - tmp_fp = leitch->reftime2; - L_SUB(&tmp_fp,&leitch->codetime2); - if (L_ISGEQ(&off,&tmp_fp)) - off = tmp_fp; -#ifdef DEBUG - if (debug) - fprintf(stderr,"%u %u %u %u %d %d\n", - leitch->codetime2.l_ui, leitch->codetime2.l_uf, - leitch->reftime2.l_ui, leitch->reftime2.l_uf, - off.l_ui, off.l_uf); -#endif - tmp_fp = leitch->reftime3; - L_SUB(&tmp_fp,&leitch->codetime3); - - if (L_ISGEQ(&off,&tmp_fp)) - off = tmp_fp; - -#ifdef DEBUG - if (debug) - fprintf(stderr,"%u %u %u %u %d %d\n", - leitch->codetime3.l_ui, leitch->codetime3.l_uf, - leitch->reftime3.l_ui, leitch->reftime3.l_uf, - off.l_ui, off.l_uf); -#endif - refclock_receive(leitch->peer, &off, 0, dispersion, &codetime, - &codetime, isinsync); -} - -/* - * leitch_timeout - */ -static void -leitch_timeout(fp) - struct peer *fp; -{ - -#ifdef DEBUG - if (debug) - fprintf(stderr, "leitch_timeout()\n"); -#endif - -#ifdef NOTYET - { struct leitchunit *leitch = (struct leitchunit *)fp; - - switch(leitch->state) { - case STATE_IDLE: - leitch_send(leitch,"D\r"); - leitch->state = STATE_DATE; - break; - case STATE_DATE: - leitch_send(leitch,"T\r"); - leitch->state = STATE_TIME1; - break; - case STATE_TIME1: - case STATE_TIME2: - case STATE_TIME3: - default: - break; - } - - leitch->leitchtimer.event_time += 30; - TIMER_ENQUEUE(timerqueue, &leitch->leitchtimer); - } -#endif /* NOTYET */ -} - -/* - * dysize - */ -static int -dysize(year) -int year; -{ - if (year%4) { /* not a potential leap year */ - return (365); - } else { - if (year % 100) { /* is a leap year */ - return (366); - } else { - if (year % 400) { - return (365); - } else { - return (366); - } - } - } -} - -static int -leitch_get_date(rbufp,leitch) - struct recvbuf *rbufp; - struct leitchunit *leitch; -{ - int i; - - if (rbufp->recv_length < 6) - return(0); -#define BAD(A) (rbufp->recv_buffer[A] < '0') || (rbufp->recv_buffer[A] > '9') - if (BAD(0)||BAD(1)||BAD(2)||BAD(3)||BAD(4)||BAD(5)) - return(0); -#define ATOB(A) ((rbufp->recv_buffer[A])-'0') - leitch->year = ATOB(0)*10 + ATOB(1); - leitch->month = ATOB(2)*10 + ATOB(3); - leitch->day = ATOB(4)*10 + ATOB(5); - - /* sanity checks */ - if (leitch->month > 12) - return(0); - if (leitch->day > days_in_month[leitch->month-1]) - return(0); - - /* calculate yearday */ - i = 0; - leitch->yearday = leitch->day; - - while ( i < (leitch->month-1) ) - leitch->yearday += days_in_month[i++]; - - if ((dysize((leitch->year>90?1900:2000)+leitch->year)==365) && - leitch->month > 2) - leitch->yearday--; - - return(1); -} - -/* - * leitch_get_time - */ -static int -leitch_get_time(rbufp,leitch,which) - struct recvbuf *rbufp; - struct leitchunit *leitch; - int which; -{ - if (BAD(0)||BAD(1)||BAD(2)||BAD(3)||BAD(4)||BAD(5)) - return(0); - leitch->hour = ATOB(0)*10 +ATOB(1); - leitch->minute = ATOB(2)*10 +ATOB(3); - leitch->second = ATOB(4)*10 +ATOB(5); - - if ((leitch->hour > 23) || (leitch->minute > 60) || - (leitch->second > 60)) - return(0); - return(1); -} - -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_local.c b/usr.sbin/xntpd/xntpd/refclock_local.c deleted file mode 100644 index 552e71272ab3..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_local.c +++ /dev/null @@ -1,170 +0,0 @@ -/* - * refclock_local - local pseudo-clock driver - */ -#if defined(REFCLOCK) && defined(LOCAL_CLOCK) - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_refclock.h" -#include "ntp_stdlib.h" - -/* - * 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 overriden with the prefer keyword of - * the server configuration command, in which case only this driver will - * be selected for synchronization and all other discipline sources will - * be ignored. This behavior is intended for use when an external - * discipline source controls the system clock. - * - * Fudge Factors - * - * The stratum for this driver 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 athe 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. 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. - */ - -/* - * Local interface definitions - */ -#define PRECISION (-7) /* about 10 ms precision */ -#define REFID "LCL\0" /* reference ID */ -#define DESCRIPTION "Undisciplined local clock" /* WRU */ - -#define STRATUM 3 /* default stratum */ -#define DISPERSION (FP_SECOND / 100) /* default dispersion (10 ms) */ - -/* - * Imported from the timer module - */ -extern u_long current_time; - -/* - * Imported from ntp_proto - */ -extern s_char sys_precision; - -/* - * Function prototypes - */ -static int local_start P((int, struct peer *)); -static void local_poll P((int, struct peer *)); - -/* - * Transfer vector - */ -struct refclock refclock_local = { - local_start, /* start up driver */ - noentry, /* shut down driver (not used) */ - local_poll, /* transmit poll message */ - noentry, /* not used (old lcl_control) */ - noentry, /* initialize driver (not used) */ - noentry, /* not used (old lcl_buginfo) */ - NOFLAGS /* not used */ -}; - - -/* - * local_start - start up the clock - */ -static int -local_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct refclockproc *pp; - - pp = peer->procptr; - - /* - * Initialize miscellaneous variables - */ - peer->precision = sys_precision; - pp->clockdesc = DESCRIPTION; - peer->stratum = STRATUM; - memcpy((char *)&pp->refid, REFID, 4); - return (1); -} - - -/* - * local_poll - called by the transmit procedure - */ -static void -local_poll(unit, peer) - int unit; - struct peer *peer; -{ - struct refclockproc *pp; - - pp = peer->procptr; - pp->polls++; - pp->lasttime = current_time; - - /* - * Ramble through the usual filtering and grooming code, which - * is essentially a no-op and included mostly for pretty - * billboards. We fudge flags as the leap indicators and allow a - * one-time adjustment in time using fudge time1 (s) and - * frequency using fudge time 2 (ppm). - */ - pp->dispersion = DISPERSION; - gettstamp(&pp->lastrec); - refclock_receive(peer, &pp->fudgetime1, 0, pp->dispersion, - &pp->lastrec, &pp->lastrec, pp->sloppyclockflag); - adj_frequency(LFPTOFP(&pp->fudgetime2)); - L_CLR(&pp->fudgetime1); - L_CLR(&pp->fudgetime2); -} - -#endif /* REFCLOCK */ diff --git a/usr.sbin/xntpd/xntpd/refclock_moto.c b/usr.sbin/xntpd/xntpd/refclock_moto.c deleted file mode 100644 index 2e888bc40913..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_moto.c +++ /dev/null @@ -1,2 +0,0 @@ -#if defined(REFCLOCK) && defined(NMEA) -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_msfees.c b/usr.sbin/xntpd/xntpd/refclock_msfees.c deleted file mode 100644 index 17e42351d472..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_msfees.c +++ /dev/null @@ -1,1557 +0,0 @@ -/* refclock_ees - clock driver for the EES M201 receiver */ - -#if defined(REFCLOCK) && defined(MSFEESPPS) && defined(STREAM) - -/* Currently REQUIRES STREAM and PPSCD. CLK and CBREAK modes - * were removed as the code was overly hairy, they weren't in use - * (hence probably didn't work). Still in RCS file at cl.cam.ac.uk - */ - -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_unixtime.h" -#include "ntp_calendar.h" -#if defined(HAVE_BSD_TTYS) -#include <sgtty.h> -#endif /* HAVE_BSD_TTYS */ -#if defined(HAVE_SYSV_TTYS) -#include <termio.h> -#endif /* HAVE_SYSV_TTYS */ -#include <termios.h> -#include <stropts.h> -#include <sys/ppsclock.h> -#include "ntp_stdlib.h" - - /* - fudgefactor = fudgetime1; - os_delay = fudgetime2; - offset_fudge = os_delay + fudgefactor + inherent_delay; - stratumtouse = fudgeval1 & 0xf - debug = fudgeval2; - sloppyclockflag = flags & CLK_FLAG1; - 1 log smoothing summary when processing sample - 4 dump the buffer from the clock - 8 EIOGETKD the last n uS time stamps - if (flags & CLK_FLAG2 && unitinuse) ees->leaphold = 0; - ees->dump_vals = flags & CLK_FLAG3; - ees->usealldata = flags & CLK_FLAG4; - - - bug->values[0] = (ees->lasttime) ? current_time - ees->lasttime : 0; - bug->values[1] = (ees->clocklastgood)?current_time-ees->clocklastgood:0; - bug->values[2] = (u_long)ees->status; - bug->values[3] = (u_long)ees->lastevent; - bug->values[4] = (u_long)ees->reason; - bug->values[5] = (u_long)ees->nsamples; - bug->values[6] = (u_long)ees->codestate; - bug->values[7] = (u_long)ees->day; - bug->values[8] = (u_long)ees->hour; - bug->values[9] = (u_long)ees->minute; - bug->values[10] = (u_long)ees->second; - bug->values[11] = (u_long)ees->tz; - bug->values[12] = ees->yearstart; - bug->values[13] = (ees->leaphold > current_time) ? - ees->leaphold - current_time : 0; - bug->values[14] = inherent_delay[unit].l_uf; - bug->values[15] = offset_fudge[unit].l_uf; - - bug->times[0] = ees->reftime; - bug->times[1] = ees->arrvtime; - bug->times[2] = ees->lastsampletime; - bug->times[3] = ees->offset; - bug->times[4] = ees->lowoffset; - bug->times[5] = ees->highoffset; - bug->times[6] = inherent_delay[unit]; - bug->times[8] = os_delay[unit]; - bug->times[7] = fudgefactor[unit]; - bug->times[9] = offset_fudge[unit]; - bug->times[10]= ees->yearstart, 0; - */ - -/* This should support the use of an EES M201 receiver with RS232 - * output (modified to transmit time once per second). - * - * For the format of the message sent by the clock, see the EESM_ - * definitions below. - * - * It appears to run free for an integral number of minutes, until the error - * reaches 4mS, at which point it steps at second = 01. - * It appears that sometimes it steps 4mS (say at 7 min interval), - * then the next minute it decides that it was an error, so steps back. - * On the next minute it steps forward again :-( - * This is typically 16.5uS/S then 3975uS at the 4min re-sync, - * or 9.5uS/S then 3990.5uS at a 7min re-sync, - * at which point it may loose the "00" second time stamp. - * I assume that the most accurate time is just AFTER the re-sync. - * Hence remember the last cycle interval, - * - * Can run in any one of: - * - * PPSCD PPS signal sets CD which interupts, and grabs the current TOD - * (sun) *in the interupt code*, so as to avoid problems with - * the STREAMS scheduling. - * - * It appears that it goes 16.5 uS slow each second, then every 4 mins it - * generates no "00" second tick, and gains 3975 uS. Ho Hum ! (93/2/7) - */ - -/* Definitions */ -#ifndef MAXUNITS -#define MAXUNITS 4 /* maximum number of EES units permitted */ -#endif - -#ifndef EES232 -#define EES232 "/dev/ees%d" /* Device to open to read the data */ -#endif - -/* Other constant stuff */ -#ifndef EESPRECISION -#define EESPRECISION (-10) /* what the heck - 2**-10 = 1ms */ -#endif -#ifndef EESREFID -#define EESREFID "MSF\0" /* String to identify the clock */ -#endif -#ifndef EESHSREFID -#define EESHSREFID (0x7f7f0000 | ((REFCLK_MSF_EES) << 8)) /* Numeric refid */ -#endif - -/* Description of clock */ -#define EESDESCRIPTION "EES M201 MSF Receiver" - -/* Speed we run the clock port at. If this is changed the UARTDELAY - * value should be recomputed to suit. - */ -#ifndef SPEED232 -#define SPEED232 B9600 /* 9600 baud */ -#endif - -/* What is the inherent delay for this mode of working, i.e. when is the - * data time stamped. - */ -#define SAFETY_SHIFT 10 /* Split the shift to avoid overflow */ -#define BITS_TO_L_FP(bits, baud) \ - (((((bits)*2 +1) << (FRACTION_PREC-SAFETY_SHIFT)) / (2*baud)) << SAFETY_SHIFT) -#define INH_DELAY_CBREAK BITS_TO_L_FP(119, 9600) -#define INH_DELAY_PPS BITS_TO_L_FP( 0, 9600) - -#ifndef STREAM_PP1 -#define STREAM_PP1 "ppsclocd\0<-- patch space for module name1 -->" -#endif -#ifndef STREAM_PP2 -#define STREAM_PP2 "ppsclock\0<-- patch space for module name2 -->" -#endif - -/* Offsets of the bytes of the serial line code. The clock gives - * local time with a GMT/BST indication. The EESM_ definitions - * give offsets into ees->lastcode. - */ -#define EESM_CSEC 0 /* centiseconds - always zero in our clock */ -#define EESM_SEC 1 /* seconds in BCD */ -#define EESM_MIN 2 /* minutes in BCD */ -#define EESM_HOUR 3 /* hours in BCD */ -#define EESM_DAYWK 4 /* day of week (Sun = 0 etc) */ -#define EESM_DAY 5 /* day of month in BCD */ -#define EESM_MON 6 /* month in BCD */ -#define EESM_YEAR 7 /* year MOD 100 in BCD */ -#define EESM_LEAP 8 /* 0x0f if leap year, otherwise zero */ -#define EESM_BST 9 /* 0x03 if BST, 0x00 if GMT */ -#define EESM_MSFOK 10 /* 0x3f if radio good, otherwise zero */ - /* followed by a frame alignment byte (0xff) / - / which is not put into the lastcode buffer*/ - -/* Length of the serial time code, in characters. The first length - * is less the frame alignment byte. - */ -#define LENEESPRT (EESM_MSFOK+1) -#define LENEESCODE (LENEESPRT+1) - -/* Code state. */ -#define EESCS_WAIT 0 /* waiting for start of timecode */ -#define EESCS_GOTSOME 1 /* have an incomplete time code buffered */ - -/* Default fudge factor and character to receive */ -#define DEFFUDGETIME 0 /* Default user supplied fudge factor */ -#ifndef DEFOSTIME -#define DEFOSTIME 0 /* Default OS delay -- passed by Make ? */ -#endif -#define DEFINHTIME INH_DELAY_PPS /* inherent delay due to sample point*/ - -/* Limits on things. Reduce the number of samples to SAMPLEREDUCE by median - * elimination. If we're running with an accurate clock, chose the BESTSAMPLE - * as the estimated offset, otherwise average the remainder. - */ -#define FULLSHIFT 6 /* NCODES root 2 */ -#define NCODES (1<< FULLSHIFT) /* 64 */ -#define REDUCESHIFT (FULLSHIFT -1) /* SAMPLEREDUCE root 2 */ - -/* Towards the high ( Why ?) end of half */ -#define BESTSAMPLE ((samplereduce * 3) /4) /* 24 */ - -/* Leap hold time. After a leap second the clock will no longer be - * reliable until it resynchronizes. Hope 40 minutes is enough. */ -#define EESLEAPHOLD (40 * 60) - -#define EES_STEP_F (1 << 24) /* the receiver steps in units of about 4ms */ -#define EES_STEP_F_GRACE (EES_STEP_F/8) /*Allow for slop of 1/8 which is .5ms*/ -#define EES_STEP_NOTE (1 << 21)/* Log any unexpected jumps, say .5 ms .... */ -#define EES_STEP_NOTES 50 /* Only do a limited number */ -#define MAX_STEP 16 /* Max number of steps to remember */ - -/* debug is a bit mask of debugging that is wanted */ -#define DB_SYSLOG_SMPLI 0x0001 -#define DB_SYSLOG_SMPLE 0x0002 -#define DB_SYSLOG_SMTHI 0x0004 -#define DB_SYSLOG_NSMTHE 0x0008 -#define DB_SYSLOG_NSMTHI 0x0010 -#define DB_SYSLOG_SMTHE 0x0020 -#define DB_PRINT_EV 0x0040 -#define DB_PRINT_CDT 0x0080 -#define DB_PRINT_CDTC 0x0100 -#define DB_SYSLOG_KEEPD 0x0800 -#define DB_SYSLOG_KEEPE 0x1000 -#define DB_LOG_DELTAS 0x2000 -#define DB_PRINT_DELTAS 0x4000 -#define DB_LOG_AWAITMORE 0x8000 -#define DB_LOG_SAMPLES 0x10000 -#define DB_NO_PPS 0x20000 -#define DB_INC_PPS 0x40000 -#define DB_DUMP_DELTAS 0x80000 - -struct eesunit { /* EES unit control structure. */ - struct peer *peer; /* associated peer structure */ - struct refclockio io; /* given to the I/O handler */ - l_fp reftime; /* reference time */ - l_fp lastsampletime; /* time as in txt from last EES msg */ - l_fp arrvtime; /* Time at which pkt arrived */ - l_fp codeoffsets[NCODES]; /* the time of arrival of 232 codes */ - l_fp offset; /* chosen offset (for clkbug) */ - l_fp lowoffset; /* lowest sample offset (for clkbug) */ - l_fp highoffset; /* highest " " (for clkbug) */ - char lastcode[LENEESCODE+6]; /* last time code we received */ - u_long lasttime; /* last time clock heard from */ - u_long clocklastgood; /* last time good radio seen */ - u_char lencode; /* length of code in buffer */ - u_char nsamples; /* number of samples we've collected */ - u_char codestate; /* state of 232 code reception */ - u_char unit; /* unit number for this guy */ - u_char status; /* clock status */ - u_char lastevent; /* last clock event */ - u_char reason; /* reason for last abort */ - u_char hour; /* hour of day */ - u_char minute; /* minute of hour */ - u_char second; /* seconds of minute */ - char tz; /* timezone from clock */ - u_char ttytype; /* method used */ - u_char dump_vals; /* Should clock values be dumped */ - u_char usealldata; /* Use ALL samples */ - u_short day; /* day of year from last code */ - u_long yearstart; /* start of current year */ - u_long leaphold; /* time of leap hold expiry */ - u_long badformat; /* number of bad format codes */ - u_long baddata; /* number of invalid time codes */ - u_long timestarted; /* time we started this */ - long last_pps_no; /* The serial # of the last PPS */ - char fix_pending; /* Is a "sync to time" pending ? */ - /* Fine tuning - compensate for 4 mS ramping .... */ - l_fp last_l; /* last time stamp */ - u_char last_steps[MAX_STEP]; /* Most recent n steps */ - int best_av_step; /* Best guess at average step */ - char best_av_step_count; /* # of steps over used above */ - char this_step; /* Current pos in buffer */ - int last_step_late; /* How late the last step was (0-59) */ - long jump_fsecs; /* # of fractions of a sec last jump */ - u_long last_step; /* time of last step */ - int last_step_secs; /* Number of seconds in last step */ - int using_ramp; /* 1 -> noemal, -1 -> over stepped */ -}; -#define last_sec last_l.l_ui -#define last_sfsec last_l.l_f -#define this_uisec ((ees->arrvtime).l_ui) -#define this_sfsec ((ees->arrvtime).l_f) -#define msec(x) ((x) / (1<<22)) -#define LAST_STEPS (sizeof ees->last_steps / sizeof ees->last_steps[0]) -#define subms(x) ((((((x < 0) ? (-(x)) : (x)) % (1<<22))/2) * 625) / (1<<(22 -5))) - -/* Bitmask for what methods to try to use -- currently only PPS enabled */ -#define T_CBREAK 1 -#define T_PPS 8 -/* macros to test above */ -#define is_cbreak(x) ((x)->ttytype & T_CBREAK) -#define is_pps(x) ((x)->ttytype & T_PPS) -#define is_any(x) ((x)->ttytype) - -#define CODEREASON 20 /* reason codes */ - -/* Data space for the unit structures. Note that we allocate these on - * the fly, but never give them back. */ -static struct eesunit *eesunits[MAXUNITS]; -static u_char unitinuse[MAXUNITS]; - -/* Keep the fudge factors separately so they can be set even - * when no clock is configured. */ -static l_fp inherent_delay[MAXUNITS]; /* when time stamp is taken */ -static l_fp fudgefactor[MAXUNITS]; /* fudgetime1 */ -static l_fp os_delay[MAXUNITS]; /* fudgetime2 */ -static l_fp offset_fudge[MAXUNITS]; /* Sum of above */ -static u_char stratumtouse[MAXUNITS]; -static u_char sloppyclockflag[MAXUNITS]; - -static int deltas[60]; - -static l_fp acceptable_slop; /* = { 0, 1 << (FRACTION_PREC -2) }; */ -static l_fp onesec; /* = { 1, 0 }; */ - -/* Imported from the timer module */ -extern u_long current_time; - -extern s_char sys_precision; - -#ifdef DEBUG -static int debug; -#endif - -#ifndef DUMP_BUF_SIZE /* Size of buffer to be used by dump_buf */ -#define DUMP_BUF_SIZE 10112 -#endif - -/* ees_reset - reset the count back to zero */ -#define ees_reset(ees) (ees)->nsamples = 0; \ - (ees)->codestate = EESCS_WAIT - -/* ees_event - record and report an event */ -#define ees_event(ees, evcode) if ((ees)->status != (u_char)(evcode)) \ - ees_report_event((ees), (evcode)) - -/* Find the precision of the system clock by reading it */ -#define USECS 1000000 -#define MINSTEP 5 /* some systems increment uS on each call */ -#define MAXLOOPS (USECS/9) - -static void dump_buf(coffs, from, to, text) -l_fp *coffs; -int from; -int to; -char *text; -{ - char buff[DUMP_BUF_SIZE + 80]; - int i; - register char *ptr = buff; - sprintf(ptr, text); - for (i=from; i<to; i++) - { while (*ptr) ptr++; - if ((ptr-buff) > DUMP_BUF_SIZE) syslog(LOG_DEBUG, "D: %s", ptr=buff); - sprintf(ptr, " %06d", ((int)coffs[i].l_f) / 4295); - } - syslog(LOG_DEBUG, "D: %s", buff); -} - -/* msfees_init - initialize internal ees driver data */ -static void msfees_init() -{ - register int i; - /* Just zero the data arrays */ - memset((char *)eesunits, 0, sizeof eesunits); - memset((char *)unitinuse, 0, sizeof unitinuse); - - acceptable_slop.l_ui = 0; - acceptable_slop.l_uf = 1 << (FRACTION_PREC -2); - - onesec.l_ui = 1; - onesec.l_uf = 0; - - /* Initialize fudge factors to default. */ - for (i = 0; i < MAXUNITS; i++) { - fudgefactor[i].l_ui = 0; - fudgefactor[i].l_uf = DEFFUDGETIME; - os_delay[i].l_ui = 0; - os_delay[i].l_uf = DEFOSTIME; - inherent_delay[i].l_ui = 0; - inherent_delay[i].l_uf = DEFINHTIME; - offset_fudge[i] = os_delay[i]; - L_ADD(&offset_fudge[i], &fudgefactor[i]); - L_ADD(&offset_fudge[i], &inherent_delay[i]); - stratumtouse[i] = 0; - sloppyclockflag[i] = 0; - } -} - - -/* msfees_start - open the EES devices and initialize data for processing */ -static int msfees_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct eesunit *ees; - register int i; - int fd232 = -1; - char eesdev[20]; - struct termios ttyb, *ttyp; - static void ees_receive(); - extern int io_addclock(); - extern void io_closeclock(); - extern char *emalloc(); - struct refclockproc *pp; - pp = peer->procptr; - - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "ees clock: unit number %d invalid (max %d)", - unit, MAXUNITS-1); - return 0; - } - if (unitinuse[unit]) { - syslog(LOG_ERR, "ees clock: unit number %d in use", unit); - return 0; - } - - /* Unit okay, attempt to open the devices. We do them both at - * once to make sure we can */ - (void) sprintf(eesdev, EES232, unit); - - fd232 = open(eesdev, O_RDWR, 0777); - if (fd232 == -1) { - syslog(LOG_ERR, "ees clock: open of %s failed: %m", eesdev); - return 0; - } - -#ifdef TIOCEXCL - /* Set for exclusive use */ - if (ioctl(fd232, TIOCEXCL, (char *)0) < 0) { - syslog(LOG_ERR, "ees clock: ioctl(%s, TIOCEXCL): %m", eesdev); - goto screwed; - } -#endif - - /* STRIPPED DOWN VERSION: Only PPS CD is supported at the moment */ - - /* Set port characteristics. If we don't have a STREAMS module or - * a clock line discipline, cooked mode is just usable, even though it - * strips the top bit. The only EES byte which uses the top - * bit is the year, and we don't use that anyway. If we do - * have the line discipline, we choose raw mode, and the - * line discipline code will block up the messages. - */ - - /* STIPPED DOWN VERSION: Only PPS CD is supported at the moment */ - - ttyp = &ttyb; - if (tcgetattr(fd232, ttyp) < 0) { - syslog(LOG_ERR, "msfees_start: tcgetattr(%s): %m", eesdev); - goto screwed; - } - - ttyp->c_iflag = IGNBRK|IGNPAR|ICRNL; - ttyp->c_cflag = SPEED232|CS8|CLOCAL|CREAD; - ttyp->c_oflag = 0; - ttyp->c_lflag = ICANON; - ttyp->c_cc[VERASE] = ttyp->c_cc[VKILL] = '\0'; - if (tcsetattr(fd232, TCSANOW, ttyp) < 0) { - syslog(LOG_ERR, "msfees_start: tcsetattr(%s): %m", eesdev); - goto screwed; - } - - if (tcflush(fd232, TCIOFLUSH) < 0) { - syslog(LOG_ERR, "msfees_start: tcflush(%s): %m", eesdev); - goto screwed; - } - - inherent_delay[unit].l_uf = INH_DELAY_PPS; - - /* offset fudge (how *late* the timestamp is) = fudge + os delays */ - offset_fudge[unit] = os_delay[unit]; - L_ADD(&offset_fudge[unit], &fudgefactor[unit]); - L_ADD(&offset_fudge[unit], &inherent_delay[unit]); - - /* Looks like this might succeed. Find memory for the structure. - * Look to see if there are any unused ones, if not we malloc() one. - */ - if (eesunits[unit] != 0) /* The one we want is okay */ - ees = eesunits[unit]; - else { - /* Look for an unused, but allocated struct */ - for (i = 0; i < MAXUNITS; i++) { - if (!unitinuse[i] && eesunits[i] != 0) - break; - } - - if (i < MAXUNITS) { /* Reclaim this one */ - ees = eesunits[i]; - eesunits[i] = 0; - } /* no spare -- make a new one */ - else ees = (struct eesunit *) emalloc(sizeof(struct eesunit)); - } - memset((char *)ees, 0, sizeof(struct eesunit)); - eesunits[unit] = ees; - - /* Set up the structures */ - ees->peer = peer; - ees->unit = (u_char)unit; - ees->timestarted= current_time; - ees->ttytype = 0; - ees->io.clock_recv= ees_receive; - ees->io.srcclock= (caddr_t)ees; - ees->io.datalen = 0; - ees->io.fd = fd232; - - /* Okay. Push one of the two (linked into the kernel, or dynamically - * loaded) STREAMS module, and give it to the I/O code to start - * receiving stuff. - */ - - { - int rc1; - /* Pop any existing onews first ... */ - while (ioctl(fd232, I_POP, 0 ) >= 0) ; - - /* Now try pushing either of the possible modules */ - if ((rc1=ioctl(fd232, I_PUSH, STREAM_PP1)) < 0 && - ioctl(fd232, I_PUSH, STREAM_PP2) < 0) { - syslog(LOG_ERR, - "ees clock: Push of `%s' and `%s' to %s failed %m", - STREAM_PP1, STREAM_PP2, eesdev); - goto screwed; - } - else { - syslog(LOG_INFO, "I: ees clock: PUSHed %s on %s", - (rc1 >= 0) ? STREAM_PP1 : STREAM_PP2, eesdev); - ees->ttytype |= T_PPS; - } - } - - /* Add the clock */ - if (!io_addclock(&ees->io)) { - /* Oh shit. Just close and return. */ - syslog(LOG_ERR, "ees clock: io_addclock(%s): %m", eesdev); - goto screwed; - } - - - /* All done. Initialize a few random peer variables, then - * return success. */ - peer->precision = sys_precision; - peer->stratum = stratumtouse[unit]; - peer->rootdelay = 0; /* ++++ */ - peer->rootdispersion = 0; /* ++++ */ - if (stratumtouse[unit] <= 1) { - memcpy((char *)&pp->refid, EESREFID, 4); - if (unit > 0 && unit < 10) - ((char *)&pp->refid)[3] = '0' + unit; - } else { - peer->refid = htonl(EESHSREFID); - } - unitinuse[unit] = 1; - pp->unitptr = (caddr_t) &eesunits[unit]; - pp->clockdesc = EESDESCRIPTION; - pp->nstages = MAXSTAGE; - syslog(LOG_ERR, "ees clock: %s OK on %d", eesdev, unit); - return (1); - -screwed: - if (fd232 != -1) - (void) close(fd232); - return (0); -} - - -/* msfees_shutdown - shut down a EES clock */ -static void msfees_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct eesunit *ees; - extern void io_closeclock(); - - if (unit >= MAXUNITS) { - syslog(LOG_ERR, - "ees clock: INTERNAL ERROR, unit number %d invalid (max %d)", - unit, MAXUNITS); - return; - } - if (!unitinuse[unit]) { - syslog(LOG_ERR, - "ees clock: INTERNAL ERROR, unit number %d not in use", unit); - return; - } - - /* Tell the I/O module to turn us off. We're history. */ - ees = eesunits[unit]; - io_closeclock(&ees->io); - unitinuse[unit] = 0; -} - - -/* ees_report_event - note the occurance of an event */ -static void ees_report_event(ees, code) - struct eesunit *ees; - int code; -{ - if (ees->status != (u_char)code) { - ees->status = (u_char)code; - if (code != CEVNT_NOMINAL) - ees->lastevent = (u_char)code; - /* Should report event to trap handler in here. - * Soon... - */ - } -} - - -/* ees_receive - receive data from the serial interface on an EES clock */ -static void ees_receive(rbufp) - struct recvbuf *rbufp; -{ - register int n_sample; - register int day; - register struct eesunit *ees; - register u_char *dpt; /* Data PoinTeR: move along ... */ - register u_char *dpend; /* Points just *after* last data char */ - register char *cp; - l_fp tmp; - static void ees_process(); - int call_pps_sample = 0; - l_fp pps_arrvstamp; - int sincelast; - int pps_step = 0; - int suspect_4ms_step = 0; - struct ppsclockev ppsclockev; - long *ptr = (long *) &ppsclockev; - extern errno; - int rc; - - /* Get the clock this applies to and a pointer to the data */ - ees = (struct eesunit *)rbufp->recv_srcclock; - dpt = (u_char *)&rbufp->recv_space; - dpend = dpt + rbufp->recv_length; - if ((debug & DB_LOG_AWAITMORE) && (rbufp->recv_length != LENEESCODE)) - printf("[%d] ", rbufp->recv_length); - - /* Check out our state and process appropriately */ - switch (ees->codestate) { - case EESCS_WAIT: - /* Set an initial guess at the timestamp as the recv time. - * If just running in CBREAK mode, we can't improve this. - * If we have the CLOCK Line Discipline, PPSCD, or sime such, - * then we will do better later .... - */ - ees->arrvtime = rbufp->recv_time; - ees->codestate = EESCS_GOTSOME; - ees->lencode = 0; - /*FALLSTHROUGH*/ - - case EESCS_GOTSOME: - cp = &(ees->lastcode[ees->lencode]); - - /* Gobble the bytes until the final (possibly stripped) 0xff */ - while (dpt < dpend && (*dpt & 0x7f) != 0x7f) { - *cp++ = (char)*dpt++; - ees->lencode++; - /* Oh dear -- too many bytes .. */ - if (ees->lencode > LENEESPRT) { - syslog(LOG_INFO, -"I: ees clock: %d + %d > %d [%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x]", - ees->lencode, dpend - dpt, LENEESPRT, -#define D(x) (ees->lastcode[x]) - D(0), D(1), D(2), D(3), D(4), D(5), D(6), - D(7), D(8), D(9), D(10), D(11), D(12)); -#undef D - ees->badformat++; - ees->reason = CODEREASON + 1; - ees_event(ees, CEVNT_BADREPLY); - ees_reset(ees); - return; - } - } - /* Gave up because it was end of the buffer, rather than ff */ - if (dpt == dpend) { - /* Incomplete. Wait for more. */ - if (debug & DB_LOG_AWAITMORE) syslog(LOG_INFO, - "I: ees clock %d: %d == %d: await more", - ees->unit, dpt, dpend); - return; - } - - /* This shouldn't happen ... ! */ - if ((*dpt & 0x7f) != 0x7f) { - syslog(LOG_INFO, "I: ees clock: %0x & 0x7f != 0x7f", *dpt); - ees->badformat++; - ees->reason = CODEREASON + 2; - ees_event(ees, CEVNT_BADREPLY); - ees_reset(ees); - return; - } - - /* Skip the 0xff */ - dpt++; - - /* Finally, got a complete buffer. Mainline code will - * continue on. */ - cp = ees->lastcode; - break; - - default: - syslog(LOG_ERR, "ees clock: INTERNAL ERROR: %d state %d", - ees->unit, ees->codestate); - ees->reason = CODEREASON + 5; - ees_event(ees, CEVNT_FAULT); - ees_reset(ees); - return; - } - - /* Boy! After all that crap, the lastcode buffer now contains - * something we hope will be a valid time code. Do length - * checks and sanity checks on constant data. - */ - ees->codestate = EESCS_WAIT; - ees->lasttime = current_time; - if (ees->lencode != LENEESPRT) { - ees->badformat++; - ees->reason = CODEREASON + 6; - ees_event(ees, CEVNT_BADREPLY); - ees_reset(ees); - return; - } - - cp = ees->lastcode; - - /* Check that centisecond is zero */ - if (cp[EESM_CSEC] != 0) { - ees->baddata++; - ees->reason = CODEREASON + 7; - ees_event(ees, CEVNT_BADREPLY); - ees_reset(ees); - return; - } - - /* Check flag formats */ - if (cp[EESM_LEAP] != 0 && cp[EESM_LEAP] != 0x0f) { - ees->badformat++; - ees->reason = CODEREASON + 8; - ees_event(ees, CEVNT_BADREPLY); - ees_reset(ees); - return; - } - - if (cp[EESM_BST] != 0 && cp[EESM_BST] != 0x03) { - ees->badformat++; - ees->reason = CODEREASON + 9; - ees_event(ees, CEVNT_BADREPLY); - ees_reset(ees); - return; - } - - if (cp[EESM_MSFOK] != 0 && cp[EESM_MSFOK] != 0x3f) { - ees->badformat++; - ees->reason = CODEREASON + 10; - ees_event(ees, CEVNT_BADREPLY); - ees_reset(ees); - return; - } - - /* So far, so good. Compute day, hours, minutes, seconds, - * time zone. Do range checks on these. - */ - -#define bcdunpack(val) ( (((val)>>4) & 0x0f) * 10 + ((val) & 0x0f) ) -#define istrue(x) ((x)?1:0) - - ees->second = bcdunpack(cp[EESM_SEC]); /* second */ - ees->minute = bcdunpack(cp[EESM_MIN]); /* minute */ - ees->hour = bcdunpack(cp[EESM_HOUR]); /* hour */ - - day = bcdunpack(cp[EESM_DAY]); /* day of month */ - - switch (bcdunpack(cp[EESM_MON])) { /* month */ - - /* Add in lengths of all previous months. Add one more - if it is a leap year and after February. - */ - case 12: day += NOV; /*FALLSTHROUGH*/ - case 11: day += OCT; /*FALLSTHROUGH*/ - case 10: day += SEP; /*FALLSTHROUGH*/ - case 9: day += AUG; /*FALLSTHROUGH*/ - case 8: day += JUL; /*FALLSTHROUGH*/ - case 7: day += JUN; /*FALLSTHROUGH*/ - case 6: day += MAY; /*FALLSTHROUGH*/ - case 5: day += APR; /*FALLSTHROUGH*/ - case 4: day += MAR; /*FALLSTHROUGH*/ - case 3: day += FEB; - if (istrue(cp[EESM_LEAP])) day++; /*FALLSTHROUGH*/ - case 2: day += JAN; /*FALLSTHROUGH*/ - case 1: break; - default: ees->baddata++; - ees->reason = CODEREASON + 11; - ees_event(ees, CEVNT_BADDATE); - ees_reset(ees); - return; - } - - ees->day = day; - - /* Get timezone. The clocktime routine wants the number - * of hours to add to the delivered time to get UT. - * Currently -1 if BST flag set, 0 otherwise. This - * is the place to tweak things if double summer time - * ever happens. - */ - ees->tz = istrue(cp[EESM_BST]) ? -1 : 0; - - if (ees->day > 366 || ees->day < 1 || - ees->hour > 23 || ees->minute > 59 || ees->second > 59) { - ees->baddata++; - ees->reason = CODEREASON + 12; - ees_event(ees, CEVNT_BADDATE); - ees_reset(ees); - return; - } - - n_sample = ees->nsamples; - - /* Now, compute the reference time value: text -> tmp.l_ui */ - if (!clocktime(ees->day, ees->hour, ees->minute, ees->second, - ees->tz, rbufp->recv_time.l_ui, &ees->yearstart, - &tmp.l_ui)) { - ees->baddata++; - ees->reason = CODEREASON + 13; - ees_event(ees, CEVNT_BADDATE); - ees_reset(ees); - return; - } - tmp.l_uf = 0; - - /* DON'T use ees->arrvtime -- it may be < reftime */ - ees->lastsampletime = tmp; - - /* If we are synchronised to the radio, update the reference time. - * Also keep a note of when clock was last good. - */ - if (istrue(cp[EESM_MSFOK])) { - ees->reftime = tmp; - ees->clocklastgood = current_time; - } - - - /* Compute the offset. For the fractional part of the - * offset we use the expected delay for the message. - */ - ees->codeoffsets[n_sample].l_ui = tmp.l_ui; - ees->codeoffsets[n_sample].l_uf = 0; - - /* Number of seconds since the last step */ - sincelast = this_uisec - ees->last_step; - - memset((char *) &ppsclockev, 0, sizeof ppsclockev); - - rc = ioctl(ees->io.fd, CIOGETEV, (char *) &ppsclockev); - if (debug & DB_PRINT_EV) fprintf(stderr, - "[%x] CIOGETEV u%d %d (%lx %d) gave %d (%d): %08lx %08lx %ld\n", - DB_PRINT_EV, ees->unit, ees->io.fd, CIOGETEV, is_pps(ees), - rc, errno, ptr[0], ptr[1], ptr[2]); - - /* If we managed to get the time of arrival, process the info */ - if (rc >= 0) { - int conv = -1; - pps_step = ppsclockev.serial - ees->last_pps_no; - - /* Possible that PPS triggered, but text message didn't */ - if (pps_step == 2) syslog(LOG_ERR, "pps step = 2 @ %02d", ees->second); - if (pps_step == 2 && ees->second == 1) suspect_4ms_step |= 1; - if (pps_step == 2 && ees->second == 2) suspect_4ms_step |= 4; - - /* allow for single loss of PPS only */ - if (pps_step != 1 && pps_step != 2) - fprintf(stderr, "PPS step: %d too far off %ld (%d)\n", - ppsclockev.serial, ees->last_pps_no, pps_step); - else if (!buftvtots((char *) &(ppsclockev.tv), &pps_arrvstamp)) - fprintf(stderr, "buftvtots failed\n"); - else { /* if ((ABS(time difference) - 0.25) < 0) - * then believe it ... - */ - l_fp diff; - diff = pps_arrvstamp; - conv = 0; - L_SUB(&diff, &ees->arrvtime); -if (debug & DB_PRINT_CDT) printf("[%x] Have %lx.%08lx and %lx.%08lx -> %lx.%08lx @ %s", - DB_PRINT_CDT, ees->arrvtime.l_ui, ees->arrvtime.l_uf, - pps_arrvstamp.l_ui, pps_arrvstamp.l_uf, - diff.l_ui, diff.l_uf, - ctime(&(ppsclockev.tv.tv_sec))); - if (L_ISNEG(&diff)) M_NEG(diff.l_ui, diff.l_uf); - L_SUB(&diff, &acceptable_slop); - if (L_ISNEG(&diff)) { /* AOK -- pps_sample */ - ees->arrvtime = pps_arrvstamp; - conv++; - call_pps_sample++; - } - /* Some loss of some signals around sec = 1 */ - else if (ees->second == 1) { - diff = pps_arrvstamp; - L_ADD(&diff, &onesec); - L_SUB(&diff, &ees->arrvtime); - if (L_ISNEG(&diff)) M_NEG(diff.l_ui, diff.l_uf); - L_SUB(&diff, &acceptable_slop); -syslog(LOG_ERR, "Have sec==1 slip %ds a=%08x-p=%08x -> %x.%08x (u=%d) %s", - pps_arrvstamp.l_ui - ees->arrvtime.l_ui, - pps_arrvstamp.l_uf, - ees->arrvtime.l_uf, - diff.l_ui, diff.l_uf, - ppsclockev.tv.tv_usec, - ctime(&(ppsclockev.tv.tv_sec))); - if (L_ISNEG(&diff)) { /* AOK -- pps_sample */ - suspect_4ms_step |= 2; - ees->arrvtime = pps_arrvstamp; - L_ADD(&ees->arrvtime, &onesec); - conv++; - call_pps_sample++; - } - } - } - ees->last_pps_no = ppsclockev.serial; - if (debug & DB_PRINT_CDTC) printf( - "[%x] %08lx %08lx %d u%d (%d %d)\n", - DB_PRINT_CDTC, pps_arrvstamp.l_ui, - pps_arrvstamp.l_uf, conv, ees->unit, - call_pps_sample, pps_step); - } - - /* See if there has been a 4ms jump at a minute boundry */ - { l_fp delta; -#define delta_isec delta.l_ui -#define delta_ssec delta.l_i -#define delta_sfsec delta.l_f - long delta_f_abs; - - delta.l_i = ees->arrvtime.l_i; - delta.l_f = ees->arrvtime.l_f; - - L_SUB(&delta, &ees->last_l); - delta_f_abs = delta_sfsec; - if (delta_f_abs < 0) delta_f_abs = -delta_f_abs; - - /* Dump the deltas each minute */ - if (debug & DB_DUMP_DELTAS) - { if (/*0 <= ees->second && */ - ees->second < ((sizeof deltas) / (sizeof deltas[0]))) deltas[ees->second] = delta_sfsec; - /* Dump on second 1, as second 0 sometimes missed */ - if (ees->second == 1) { - char text[16 * ((sizeof deltas) / (sizeof deltas[0]))]; - char *ptr=text; - int i; - for (i=0; i<((sizeof deltas) / (sizeof deltas[0])); i++) { - sprintf(ptr, " %d.%04d", - msec(deltas[i]), subms(deltas[i])); - while (*ptr) ptr++; - } - syslog(LOG_ERR, "Deltas: %d.%04d<->%d.%04d: %s", - msec(EES_STEP_F - EES_STEP_F_GRACE), subms(EES_STEP_F - EES_STEP_F_GRACE), - msec(EES_STEP_F + EES_STEP_F_GRACE), subms(EES_STEP_F + EES_STEP_F_GRACE), - text+1); - for (i=0; i<((sizeof deltas) / (sizeof deltas[0])); i++) deltas[i] = 0; - } - } - - /* Lets see if we have a 4 mS step at a minute boundaary */ - if ( ((EES_STEP_F - EES_STEP_F_GRACE) < delta_f_abs) && - (delta_f_abs < (EES_STEP_F + EES_STEP_F_GRACE)) && - (ees->second == 0 || ees->second == 1 || ees->second == 2) && - (sincelast < 0 || sincelast > 122) - ) { /* 4ms jump at min boundry */ - int old_sincelast; - int count=0; - int sum = 0; - /* Yes -- so compute the ramp time */ - if (ees->last_step == 0) sincelast = 0; - old_sincelast = sincelast; - - /* First time in, just set "ees->last_step" */ - if(ees->last_step) { - int other_step = 0; - int third_step = 0; - int this_step = (sincelast + (60 /2)) / 60; - int p_step = ees->this_step; - int p; - ees->last_steps[p_step] = this_step; - p= p_step; - p_step++; - if (p_step >= LAST_STEPS) p_step = 0; - ees->this_step = p_step; - /* Find the "average" interval */ - while (p != p_step) { - int this = ees->last_steps[p]; - if (this == 0) break; - if (this != this_step) { - if (other_step == 0 && ( - this== (this_step +2) || - this== (this_step -2) || - this== (this_step +1) || - this== (this_step -1))) - other_step = this; - if (other_step != this) { - int delta = (this_step - other_step); - if (delta < 0) delta = - delta; - if (third_step == 0 && ( - (delta == 1) ? ( - this == (other_step +1) || - this == (other_step -1) || - this == (this_step +1) || - this == (this_step -1)) - : - ( - this == (this_step + other_step)/2 - ) - )) third_step = this; - if (third_step != this) break; - } - } - sum += this; - p--; - if (p < 0) p += LAST_STEPS; - count++; - } -syslog(LOG_ERR, "MSF%d: %d: This=%d (%d), other=%d/%d, sum=%d, count=%d, pps_step=%d, suspect=%x", ees->unit, p, ees->last_steps[p], this_step, other_step, third_step, sum, count, pps_step, suspect_4ms_step); - if (count != 0) sum = ((sum * 60) + (count /2)) / count; -#define SV(x) (ees->last_steps[(x + p_step) % LAST_STEPS]) -syslog(LOG_ERR, "MSF%d: %x steps %d: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", - ees->unit, suspect_4ms_step, p_step, SV(0), SV(1), SV(2), SV(3), SV(4), SV(5), SV(6), - SV(7), SV(8), SV(9), SV(10), SV(11), SV(12), SV(13), SV(14), SV(15)); -printf("MSF%d: steps %d: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", - ees->unit, p_step, SV(0), SV(1), SV(2), SV(3), SV(4), SV(5), SV(6), - SV(7), SV(8), SV(9), SV(10), SV(11), SV(12), SV(13), SV(14), SV(15)); -#undef SV - ees->jump_fsecs = delta_sfsec; - ees->using_ramp = 1; - if (sincelast > 170) - ees->last_step_late += sincelast - ((sum) ? sum : ees->last_step_secs); - else ees->last_step_late = 30; - if (ees->last_step_late < -60 || ees->last_step_late > 120) ees->last_step_late = 30; - if (ees->last_step_late < 0) ees->last_step_late = 0; - if (ees->last_step_late >= 60) ees->last_step_late = 59; - sincelast = 0; - } - else { /* First time in -- just save info */ - ees->last_step_late = 30; - ees->jump_fsecs = delta_sfsec; - ees->using_ramp = 1; - sum = 4 * 60; - } - ees->last_step = this_uisec; -printf("MSF%d: d=%3ld.%04ld@%d :%d:%d:$%d:%d:%d\n", -ees->unit, msec(delta_sfsec), subms(delta_sfsec), ees->second, old_sincelast, ees->last_step_late, count, sum, ees->last_step_secs); -syslog(LOG_ERR, "MSF%d: d=%3d.%04d@%d :%d:%d:%d:%d:%d", -ees->unit, msec(delta_sfsec), subms(delta_sfsec), ees->second, old_sincelast, ees->last_step_late, count, sum, ees->last_step_secs); - if (sum) ees->last_step_secs = sum; - } - /* OK, so not a 4ms step at a minute boundry */ - else { - if (suspect_4ms_step) syslog(LOG_ERR, - "MSF%d: suspect = %x, but delta of %d.%04d [%d.%04d<%d.%04d<%d.%04d: %d %d]", - ees->unit, suspect_4ms_step, msec(delta_sfsec), subms(delta_sfsec), - msec(EES_STEP_F - EES_STEP_F_GRACE), - subms(EES_STEP_F - EES_STEP_F_GRACE), - msec(delta_f_abs), - subms(delta_f_abs), - msec(EES_STEP_F + EES_STEP_F_GRACE), - subms(EES_STEP_F + EES_STEP_F_GRACE), - ees->second, - sincelast); - if ((delta_f_abs > EES_STEP_NOTE) && ees->last_l.l_i) { - static ees_step_notes = EES_STEP_NOTES; - if (ees_step_notes > 0) { - ees_step_notes--; -printf("MSF%d: D=%3ld.%04ld@%02d :%d%s\n", -ees->unit, msec(delta_sfsec), subms(delta_sfsec), ees->second, sincelast, ees_step_notes ? "" : " -- NO MORE !"); -syslog(LOG_ERR, "MSF%d: D=%3d.%04d@%02d :%d%s", -ees->unit, msec(delta_sfsec), subms(delta_sfsec), ees->second, (ees->last_step) ? sincelast : -1, ees_step_notes ? "" : " -- NO MORE !"); - } - } - } - } - ees->last_l = ees->arrvtime; - - /* IF we have found that it's ramping - * && it's within twice the expected ramp period - * && there is a non zero step size (avoid /0 !) - * THEN we twiddle things - */ - if (ees->using_ramp && - sincelast < (ees->last_step_secs)*2 && - ees->last_step_secs) - { long sec_of_ramp = sincelast + ees->last_step_late; - long fsecs; - l_fp inc; - - /* Ramp time may vary, so may ramp for longer than last time */ - if (sec_of_ramp > (ees->last_step_secs + 120)) - sec_of_ramp = ees->last_step_secs; - - /* sec_of_ramp * ees->jump_fsecs may overflow 2**32 */ - fsecs = sec_of_ramp * (ees->jump_fsecs / ees->last_step_secs); - - if (debug & DB_LOG_DELTAS) syslog(LOG_ERR, - "[%x] MSF%d: %3d/%03d -> d=%11d (%d|%d)", - DB_LOG_DELTAS, - ees->unit, sec_of_ramp, ees->last_step_secs, fsecs, - pps_arrvstamp.l_f, pps_arrvstamp.l_f + fsecs); - if (debug & DB_PRINT_DELTAS) printf( - "MSF%d: %3ld/%03d -> d=%11ld (%ld|%ld)\n", - ees->unit, sec_of_ramp, ees->last_step_secs, fsecs, - pps_arrvstamp.l_f, pps_arrvstamp.l_f + fsecs); - - /* Must sign extend the result */ - inc.l_i = (fsecs < 0) ? -1 : 0; - inc.l_f = fsecs; - if (debug & DB_INC_PPS) - { L_SUB(&pps_arrvstamp, &inc); - L_SUB(&ees->arrvtime, &inc); - } - else - { L_ADD(&pps_arrvstamp, &inc); - L_ADD(&ees->arrvtime, &inc); - } - } - else { - if (debug & DB_LOG_DELTAS) syslog(LOG_ERR, - "[%x] MSF%d: ees->using_ramp=%d, sincelast=%x / %x, ees->last_step_secs=%x", - DB_LOG_DELTAS, - ees->unit, ees->using_ramp, - sincelast, - (ees->last_step_secs)*2, - ees->last_step_secs); - if (debug & DB_PRINT_DELTAS) printf( - "[%x] MSF%d: ees->using_ramp=%d, sincelast=%x / %x, ees->last_step_secs=%x\n", - DB_LOG_DELTAS, - ees->unit, ees->using_ramp, - sincelast, - (ees->last_step_secs)*2, - ees->last_step_secs); - } - - L_SUB(&ees->arrvtime, &offset_fudge[ees->unit]); - L_SUB(&pps_arrvstamp, &offset_fudge[ees->unit]); - - if (call_pps_sample && !(debug & DB_NO_PPS)) { - /* Sigh -- it expects its args negated */ - L_NEG(&pps_arrvstamp); - (void) pps_sample(&pps_arrvstamp); - } - - /* Subtract off the local clock time stamp */ - L_SUB(&ees->codeoffsets[n_sample], &ees->arrvtime); - if (debug & DB_LOG_SAMPLES) syslog(LOG_ERR, - "MSF%d: [%x] %d (ees: %d %d) (pps: %d %d)%s", - ees->unit, DB_LOG_DELTAS, n_sample, - ees->codeoffsets[n_sample].l_f, - ees->codeoffsets[n_sample].l_f / 4295, - pps_arrvstamp.l_f, - pps_arrvstamp.l_f /4295, - (debug & DB_NO_PPS) ? " [no PPS]" : ""); - - if (ees->nsamples++ == NCODES-1) ees_process(ees); - - /* Done! */ -} - - -static void set_x(fp_offset) -l_fp *fp_offset; -{ - step_systime_real(fp_offset); -} - - -/* offcompare - auxiliary comparison routine for offset sort */ - -static int -offcompare(a, b) -l_fp *a, *b; -{ - return(L_ISGEQ(a, b) ? (L_ISEQU(a, b) ? 0 : 1) : -1); -} - - -/* ees_process - process a pile of samples from the clock */ -static void ees_process(ees) - struct eesunit *ees; -{ - static last_samples = -1; - register int i, j; - register int noff; - register l_fp *coffs = ees->codeoffsets; - l_fp offset, tmp; - u_fp dispersion; /* ++++ */ - int lostsync, isinsync; - int samples = ees->nsamples; - int samplelog = 0; /* keep "gcc -Wall" happy ! */ - int samplereduce = (samples + 1) / 2; - - /* Reset things to zero so we don't have to worry later */ - ees_reset(ees); - - if (sloppyclockflag[ees->unit]) { - samplelog = (samples < 2) ? 0 : - (samples < 5) ? 1 : - (samples < 9) ? 2 : - (samples < 17) ? 3 : - (samples < 33) ? 4 : 5; - samplereduce = (1 << samplelog); - } - - if (samples != last_samples && - ((samples != (last_samples-1)) || samples < 3)) { - syslog(LOG_ERR, "Samples=%d (%d), samplereduce=%d ....", - samples, last_samples, samplereduce); - last_samples = samples; - } - if (samples < 1) return; - - /* If requested, dump the raw data we have in the buffer */ - if (ees->dump_vals) dump_buf(coffs, 0, samples, "Raw data is:"); - - /* Sort the offsets, trim off the extremes, then choose one. */ - qsort((char *) coffs, samples, sizeof(l_fp), offcompare); - - noff = samples; - i = 0; - while ((noff - i) > samplereduce) { - /* Trim off the sample which is further away - * from the median. We work this out by doubling - * the median, subtracting off the end samples, and - * looking at the sign of the answer, using the - * identity (c-b)-(b-a) == 2*b-a-c - */ - tmp = coffs[(noff + i)/2]; - L_ADD(&tmp, &tmp); - L_SUB(&tmp, &coffs[i]); - L_SUB(&tmp, &coffs[noff-1]); - if (L_ISNEG(&tmp)) noff--; else i++; - } - - /* If requested, dump the reduce data we have in the buffer */ - if (ees->dump_vals) dump_buf(coffs, i, noff, "Reduced to:"); - - /* What we do next depends on the setting of the sloppy clock flag. - * If it is on, average the remainder to derive our estimate. - * Otherwise, just pick a representative value from the remaining stuff - */ - if (sloppyclockflag[ees->unit]) { - offset.l_ui = offset.l_uf = 0; - for (j = i; j < noff; j++) - L_ADD(&offset, &coffs[j]); - for (j = samplelog; j > 0; j--) - L_RSHIFTU(&offset); - } - else offset = coffs[i+BESTSAMPLE]; - - /* Compute the dispersion as the difference between the - * lowest and highest offsets that remain in the - * consideration list. - * - * It looks like MOST clocks have MOD (max error), so halve it ! - */ - tmp = coffs[noff-1]; - L_SUB(&tmp, &coffs[i]); -#define FRACT_SEC(n) ((1 << 30) / (n/2)) - dispersion = LFPTOFP(&tmp) / 2; /* ++++ */ - if (debug & (DB_SYSLOG_SMPLI | DB_SYSLOG_SMPLE)) syslog( - (debug & DB_SYSLOG_SMPLE) ? LOG_ERR : LOG_INFO, - "I: [%x] Offset=%06d (%d), disp=%06d%s [%d], %d %d=%d %d:%d %d=%d %d", - debug & (DB_SYSLOG_SMPLI | DB_SYSLOG_SMPLE), - offset.l_f / 4295, offset.l_f, - (dispersion * 1526) / 100, - (sloppyclockflag[ees->unit]) ? " by averaging" : "", - FRACT_SEC(10) / 4295, - (coffs[0].l_f) / 4295, - i, - (coffs[i].l_f) / 4295, - (coffs[samples/2].l_f) / 4295, - (coffs[i+BESTSAMPLE].l_f) / 4295, - noff-1, - (coffs[noff-1].l_f) / 4295, - (coffs[samples-1].l_f) / 4295); - - /* Are we playing silly wotsits ? - * If we are using all data, see if there is a "small" delta, - * and if so, blurr this with 3/4 of the delta from the last value - */ - if (ees->usealldata && ees->offset.l_uf) { - long diff = (long) (ees->offset.l_uf - offset.l_uf); - - /* is the delta small enough ? */ - if ((- FRACT_SEC(100)) < diff && diff < FRACT_SEC(100)) { - int samd = (64 * 4) / samples; - long new; - if (samd < 2) samd = 2; - new = offset.l_uf + ((diff * (samd -1)) / samd); - - /* Sign change -> need to fix up int part */ - if ((new & (1 << 31)) != - (((long) offset.l_uf) & ( 1 << 31))) - { syslog(LOG_INFO, "I: %x != %x (%x %x), so add %d", - new & (1 << 31), - ((long) offset.l_uf) & ( 1 << 31), - new, (long) offset.l_uf, - (new < 0) ? -1 : 1); - offset.l_ui += (new < 0) ? -1 : 1; - } - dispersion /= 4; - if (debug & (DB_SYSLOG_SMTHI | DB_SYSLOG_SMTHE)) syslog( - (debug & DB_SYSLOG_SMTHE) ? LOG_ERR : LOG_INFO, - "I: [%x] Smooth data: %d -> %d, dispersion now %d", - debug & (DB_SYSLOG_SMTHI | DB_SYSLOG_SMTHE), - ((long) offset.l_uf) / 4295, new / 4295, - (dispersion * 1526) / 100); - offset.l_uf = (unsigned long) new; - } - else if (debug & (DB_SYSLOG_NSMTHI | DB_SYSLOG_NSMTHE)) syslog( - (debug & DB_SYSLOG_NSMTHE) ? LOG_ERR : LOG_INFO, - "[%x] No smooth as delta not %d < %d < %d", - debug & (DB_SYSLOG_NSMTHI | DB_SYSLOG_NSMTHE), - - FRACT_SEC(100), diff, FRACT_SEC(100)); - } - else if (debug & (DB_SYSLOG_NSMTHI | DB_SYSLOG_NSMTHE)) syslog( - (debug & DB_SYSLOG_NSMTHE) ? LOG_ERR : LOG_INFO, - "I: [%x] No smooth as flag=%x and old=%x=%d (%d:%d)", - debug & (DB_SYSLOG_NSMTHI | DB_SYSLOG_NSMTHE), - ees->usealldata, ees->offset.l_f, ees->offset.l_uf, - offset.l_f, ees->offset.l_f - offset.l_f); - - /* Collect offset info for debugging info */ - ees->offset = offset; - ees->lowoffset = coffs[i]; - ees->highoffset = coffs[noff-1]; - - /* Determine synchronization status. Can be unsync'd either - * by a report from the clock or by a leap hold. - * - * Loss of the radio signal for a short time does not cause - * us to go unsynchronised, since the receiver keeps quite - * good time on its own. The spec says 20ms in 4 hours; the - * observed drift in our clock (Cambridge) is about a second - * a day, but even that keeps us within the inherent tolerance - * of the clock for about 15 minutes. Observation shows that - * the typical "short" outage is 3 minutes, so to allow us - * to ride out those, we will give it 5 minutes. - */ - lostsync = current_time - ees->clocklastgood > 300 ? 1 : 0; - isinsync = (lostsync || ees->leaphold > current_time) ? 0 : 1; - - /* Done. Use time of last good, synchronised code as the - * reference time, and lastsampletime as the receive time. - */ - if (ees->fix_pending) { - syslog(LOG_ERR, "MSF%d: fix_pending=%d -> jump %x.%08x\n", - ees->fix_pending, ees->unit, offset.l_i, offset.l_f); - ees->fix_pending = 0; - set_x(&offset); - L_CLR(&offset); - } - refclock_receive(ees->peer, - &offset, - 0, /* delay */ - dispersion, - &ees->reftime, - &ees->lastsampletime, /* receive time */ - (isinsync) ? 0 : LEAP_NOTINSYNC); - ees_event(ees, lostsync ? CEVNT_PROP : CEVNT_NOMINAL); -} - -/* msfees_poll - called by the transmit procedure */ -static void msfees_poll(unit, peer) - int unit; - char *peer; -{ - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "ees clock poll: INTERNAL: unit %d invalid", - unit); - return; - } - if (!unitinuse[unit]) { - syslog(LOG_ERR, "ees clock poll: INTERNAL: unit %d unused", - unit); - return; - } - - ees_process(eesunits[unit]); - - if ((current_time - eesunits[unit]->lasttime) > 150) - ees_event(eesunits[unit], CEVNT_FAULT); -} - -/* msfees_leap - called when a leap second occurs */ -static void msfees_leap() -{ - register int i; - - /* This routine should be entered a few seconds after - * midnight UTC when a leap second occurs. To ensure we - * don't believe foolish time from the clock(s) we set a - * 40 minute hold on them. It shouldn't take anywhere - * near this amount of time to adjust if the clock is getTING - * data, but doing anything else is complicated. - */ - for (i = 0; i < MAXUNITS; i++) if (unitinuse[i]) - eesunits[i]->leaphold = current_time + EESLEAPHOLD; -} - -/* msfees_control - set fudge factors, return statistics */ -static void msfees_control(unit, in, out) - int unit; - struct refclockstat *in; - struct refclockstat *out; -{ - register struct eesunit *ees = eesunits[unit]; - - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "ees clock: unit %d invalid (max %d)", - unit, MAXUNITS-1); - return; - } - - if (in != 0) { - if (in->haveflags & CLK_HAVETIME1) - fudgefactor[unit] = in->fudgetime1; - if (in->haveflags & CLK_HAVETIME2) - os_delay[unit] = in->fudgetime2; - offset_fudge[unit] = os_delay[unit]; - L_ADD(&offset_fudge[unit], &fudgefactor[unit]); - L_ADD(&offset_fudge[unit], &inherent_delay[unit]); - if (in->haveflags & CLK_HAVEVAL1) { - stratumtouse[unit] = (u_char)(in->fudgeval1 & 0xf); - if (unitinuse[unit]) { - /* Should actually reselect clock, but - * will wait for the next timecode - */ - struct peer *peer = ees->peer; - struct refclockproc *pp = peer->procptr; - peer->stratum = stratumtouse[unit]; - if (stratumtouse[unit] <= 1) { - memmove((char *)&pp->refid, - EESREFID, 4); - if (unit>0 && unit<10) - ((char *)&pp->refid)[3] = - '0' + unit; - } - else peer->refid = htonl(EESHSREFID); - } - } - if (in->haveflags & CLK_HAVEVAL2) { - printf("Debug: %x -> %lx\n", debug, in->fudgeval2); - syslog(LOG_ERR, "MSF%d: debug %x -> %x", - unit, debug, in->fudgeval2); - debug = in->fudgeval2; - } - if (in->haveflags & CLK_HAVEFLAG1) { - sloppyclockflag[unit] = in->flags & CLK_FLAG1; - } - if (in->haveflags & CLK_HAVEFLAG2) { - ees->fix_pending++; - /* if (in->flags & CLK_FLAG2 && unitinuse[unit]) - ees->leaphold = 0; */ - } - if (in->haveflags & CLK_HAVEFLAG3 && unitinuse[unit]) { - printf("dump_vals: %x -> %x\n", ees->dump_vals, in->flags & CLK_FLAG3); - ees->dump_vals = in->flags & CLK_FLAG3; - } - if (in->haveflags & CLK_HAVEFLAG4 && unitinuse[unit]) { - ees->usealldata = in->flags & CLK_FLAG4; - } - } - - if (out != 0) { - struct peer *peer = ees->peer; - struct refclockproc *pp = peer->procptr; - out->type = REFCLK_MSF_EES; - out->haveflags - = CLK_HAVETIME1|CLK_HAVETIME2|CLK_HAVEVAL1|CLK_HAVEVAL2|CLK_HAVEFLAG1|CLK_HAVEFLAG3|CLK_HAVEFLAG4; - out->clockdesc = pp->clockdesc; - out->fudgetime1 = fudgefactor[unit]; - out->fudgetime2 = os_delay[unit]; - out->fudgeval1 = (long)stratumtouse[unit]; - /*out->fudgeval2= debug*/; - memmove((char *)&out->fudgeval2, (char *)&pp->refid, 4); - out->flags = sloppyclockflag[unit]; - if (unitinuse[unit]) { - out->flags |= ees->dump_vals | ees->usealldata; - out->lencode = ees->lencode; - out->lastcode = ees->lastcode; - out->timereset = current_time - ees->timestarted; - out->polls = 0; /* we don't poll */ - out->noresponse = 0; /* ditto */ - out->badformat = ees->badformat; - out->baddata = ees->baddata; - out->lastevent = ees->lastevent; - out->currentstatus = ees->status; - } else { - out->lencode = 0; - out->lastcode = ""; - out->polls = out->noresponse = 0; - out->badformat = out->baddata = 0; - out->timereset = 0; - out->currentstatus = out->lastevent = CEVNT_NOMINAL; - } - } -} - - -/* msfees_buginfo - return clock dependent debugging info */ -static void msfees_buginfo(unit, bug) - int unit; - register struct refclockbug *bug; -{ - register struct eesunit *ees; - - bug->nvalues = bug->ntimes = 0; - - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "ees clock: unit %d invalid (max %d)", - unit, MAXUNITS-1); - return; - } - - if (!unitinuse[unit]) - return; - ees = eesunits[unit]; - - bug->nvalues = 16; - bug->svalues = 0x0800; - bug->values[0] = (ees->lasttime) ? current_time - ees->lasttime : 0; - bug->values[1] = (ees->clocklastgood)?current_time-ees->clocklastgood:0; - bug->values[2] = (u_long)ees->status; - bug->values[3] = (u_long)ees->lastevent; - bug->values[4] = (u_long)ees->reason; - bug->values[5] = (u_long)ees->nsamples; - bug->values[6] = (u_long)ees->codestate; - bug->values[7] = (u_long)ees->day; - bug->values[8] = (u_long)ees->hour; - bug->values[9] = (u_long)ees->minute; - bug->values[10] = (u_long)ees->second; - bug->values[11] = (u_long)ees->tz; - bug->values[12] = ees->yearstart; - bug->values[13] = (ees->leaphold > current_time) ? - ees->leaphold - current_time : 0; - bug->values[14] = inherent_delay[unit].l_uf; - bug->values[15] = offset_fudge[unit].l_uf; - - bug->ntimes = 11; - bug->stimes = 0x3f8; - bug->times[0] = ees->reftime; - bug->times[1] = ees->arrvtime; - bug->times[2] = ees->lastsampletime; - bug->times[3] = ees->offset; - bug->times[4] = ees->lowoffset; - bug->times[5] = ees->highoffset; - bug->times[6] = inherent_delay[unit]; - bug->times[8] = os_delay[unit]; - bug->times[7] = fudgefactor[unit]; - bug->times[9] = offset_fudge[unit]; - bug->times[10].l_ui = ees->yearstart; - bug->times[10].l_uf = 0; -} - -struct refclock refclock_msfees = { - msfees_start, msfees_shutdown, msfees_poll, - msfees_control, msfees_init, msfees_buginfo, NOFLAGS -}; -#endif /* defined(REFCLOCK) && defined(MSFEESPPS) && defined(STREAM) */ diff --git a/usr.sbin/xntpd/xntpd/refclock_mx4200.c b/usr.sbin/xntpd/xntpd/refclock_mx4200.c deleted file mode 100644 index 577193dde4a5..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_mx4200.c +++ /dev/null @@ -1,1343 +0,0 @@ -/* - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66. - * - * Copyright (c) 1992 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Lawrence Berkeley Laboratory. - * 4. The name of the University may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if defined(REFCLOCK) && defined(PPS) && (defined(MX4200) || defined(MX4200CLK) || defined(MX4200PPS)) - -#if !defined(lint) && !defined(__GNUC__) -static char rcsid[] = - "@(#) /src/master/xntp-930612/xntpd/refclock_mx4200.c,v 1.5 1993/06/18 21:19:54 jbj Exp (LBL) "; -#endif - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_calendar.h" -#include "ntp_unixtime.h" - -#if __STDC__ -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -#if defined(HAVE_BSD_TTYS) -#include <sgtty.h> -#endif /* HAVE_BSD_TTYS */ - -#if defined(HAVE_SYSV_TTYS) -#include <termio.h> -#endif /* HAVE_SYSV_TTYS */ - -#if defined(HAVE_TERMIOS) -#include <termios.h> -#endif -#if defined(STREAM) -#include <stropts.h> -#if defined(MX4200CLK) -#include <sys/clkdefs.h> -#endif /* MX4200CLK */ -#endif /* STREAM */ - -#include <sys/ppsclock.h> - -#include "mx4200.h" -#include "ntp_stdlib.h" - -/* - * This driver supports the Magnavox Model MX4200 GPS Receiver. - */ - -/* - * Definitions - */ -#define MAXUNITS 2 /* max number of mx4200 units */ -#define MX4200232 "/dev/gps%d" -#define SPEED232 B4800 /* baud */ - -/* - * The number of raw samples which we acquire to derive a single estimate. - */ -#define NSTAMPS 64 - -/* - * Radio interface parameters - */ -#define MX4200PRECISION (-18) /* precision assumed (about 4 us) */ -#define MX4200REFID "GPS" /* reference id */ -#define MX4200DESCRIPTION "Magnavox MX4200 GPS Receiver" /* who we are */ -#define DEFFUDGETIME 0 /* default fudge time (ms) */ - -/* Leap stuff */ -extern U_LONG leap_hoursfromleap; -extern U_LONG leap_happened; -static int leap_debug; - -/* - * mx4200_reset - reset the count back to zero - */ -#define mx4200_reset(mx4200) \ - do { \ - (mx4200)->nsamples = 0; \ - } while (0) - -/* - * mx4200_event - record and report an event - */ -#define mx4200_event(mx4200, evcode) \ - do { \ - if ((mx4200)->status != (u_char)(evcode)) \ - mx4200_report_event((mx4200), (evcode)); \ - } while (0) - -/* - * Imported from the timer module - */ -extern U_LONG current_time; -extern struct event timerqueue[]; - -/* - * Imported from ntp_loopfilter module - */ -extern int fdpps; /* pps file descriptor */ - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * MX4200 unit control structure. - */ -struct mx4200unit { - struct peer *peer; /* associated peer structure */ - struct refclockio io; /* given to the I/O handler */ - U_LONG gpssamples[NSTAMPS]; /* the GPS time samples */ - l_fp unixsamples[NSTAMPS]; /* the UNIX time samples */ - - - l_fp lastsampletime; /* time of last estimate */ - u_int lastserial; /* last pps serial number */ -#ifdef notdef - l_fp lastrec; /* last receive time */ - l_fp lastref; /* last timecode time */ -#endif - char lastcode[RX_BUFF_SIZE]; /* last timecode received */ - U_LONG lasttime; /* last time clock heard from */ - u_char nsamples; /* number of samples we've collected */ - u_char unit; /* unit number for this guy */ - u_char status; /* clock status */ - u_char lastevent; /* last clock event */ - u_char reason; /* reason for last abort */ - u_char lencode; /* length of last timecode */ - u_char year; /* year of eternity */ - u_short monthday; /* day of month */ - u_char hour; /* hour of day */ - u_char minute; /* minute of hour */ - u_char second; /* seconds of minute */ - u_char leap; /* leap indicators */ - /* - * Status tallies - */ -#ifdef notdef - U_LONG polls; /* polls sent */ - U_LONG noresponse; /* number of nonresponses */ -#endif - U_LONG badformat; /* bad format */ - U_LONG baddata; /* bad data */ - U_LONG timestarted; /* time we started this */ -}; - -/* - * We demand that consecutive PPS samples are more than 0.995 seconds - * and less than 1.005 seconds apart. - */ -#define PPSLODIFF_UI 0 /* 0.900 as an l_fp */ -#define PPSLODIFF_UF 0xe6666610 - -#define PPSHIDIFF_UI 1 /* 1.100 as an l_fp */ -#define PPSHIDIFF_UF 0x19999990 - -/* - * reason codes - */ -#define PPSREASON 20 -#define CODEREASON 40 -#define PROCREASON 60 - -/* - * Data space for the unit structures. Note that we allocate these on - * the fly, but never give them back. - */ -static struct mx4200unit *mx4200units[MAXUNITS]; -static u_char unitinuse[MAXUNITS]; - -/* - * Keep the fudge factors separately so they can be set even - * when no clock is configured. - */ -static l_fp fudgefactor[MAXUNITS]; -static u_char stratumtouse[MAXUNITS]; -static u_char sloppyclockflag[MAXUNITS]; -static U_LONG refid[MAXUNITS]; - -static const char pmvxg[] = "PMVXG"; - -/* - * Function prototypes - */ -static void mx4200_init P((void)); -static int mx4200_start P((int, struct peer *)); -static void mx4200_shutdown P((int, struct peer *)); -static void mx4200_receive P((struct recvbuf *)); -static void mx4200_process P((struct mx4200unit *)); -static void mx4200_report_event P((struct mx4200unit *, int)); -static void mx4200_poll P((int, struct peer *)); -static void mx4200_control P((int, struct refclockstat *, struct refclockstat *)); -static void mx4200_buginfo P((int, struct refclockbug *)); - -static char * mx4200_parse P((char *, struct calendar *, int *, int *)); -static int mx4200_needconf P((char *)); -static void mx4200_config P((struct mx4200unit *)); -static void mx4200_send P((int, const char *, ...)); -static int mx4200_cmpl_fp P((void *, void *)); -static u_char cksum P((char *, u_int)); - -#ifdef DEBUG -static void opendfile P((int)); -static void checkdfile P((void)); -#endif /* DEBUG */ - -/* - * Transfer vector - */ -struct refclock refclock_mx4200 = { - mx4200_start, mx4200_shutdown, mx4200_poll, - mx4200_control, mx4200_init, mx4200_buginfo, NOFLAGS -}; - -/* - * mx4200_init - initialize internal mx4200 driver data - */ -static void -mx4200_init() -{ - register int i; - /* - * Just zero the data arrays - */ - memset((char *)mx4200units, 0, sizeof mx4200units); - memset((char *)unitinuse, 0, sizeof unitinuse); - - /* - * Initialize fudge factors to default. - */ - for (i = 0; i < MAXUNITS; i++) { - fudgefactor[i].l_ui = 0; - fudgefactor[i].l_uf = DEFFUDGETIME; - stratumtouse[i] = 0; - sloppyclockflag[i] = 0; - memcpy((char *)&refid[i], MX4200REFID, 4); - } -} - -#ifdef DEBUG -static char dfile[] = "/var/tmp/MX4200.debug"; -static FILE *df = NULL; - -static void -opendfile(create) - int create; -{ - if (!create && access(dfile, F_OK) < 0) { - syslog(LOG_ERR, "mx4200: open %s: %m", dfile); - return; - } - df = fopen(dfile, "a"); - if (df == NULL) - syslog(LOG_ERR, "mx4200: open %s: %m", dfile); - else if (setvbuf(df, NULL, _IOLBF, 0) < 0) - syslog(LOG_ERR, "mx4200: setvbuf %s: %m", dfile); -} - -static void -checkdfile() -{ - - if (df == NULL) - return; - - if (access(dfile, F_OK) < 0) { - fclose(df); - opendfile(1); - } -} - -#endif - - -/* - * mx4200_start - open the MX4200 devices and initialize data for processing - */ -static int -mx4200_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct mx4200unit *mx4200; - register int i; - int fd232; - char mx4200dev[20]; - - /* - * Check configuration info - */ - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "mx4200_start: unit %d invalid", unit); - return (0); - } - if (unitinuse[unit]) { - syslog(LOG_ERR, "mx4200_start: unit %d in use", unit); - return (0); - } - - /* - * Open serial port - */ - (void) sprintf(mx4200dev, MX4200232, unit); - fd232 = open(mx4200dev, O_RDWR, 0777); - if (fd232 == -1) { - syslog(LOG_ERR, - "mx4200_start: open of %s: %m", mx4200dev); - return (0); - } - -#if defined(HAVE_SYSV_TTYS) - /* - * System V serial line parameters (termio interface) - * - */ - { struct termio ttyb; - if (ioctl(fd232, TCGETA, &ttyb) < 0) { - syslog(LOG_ERR, - "mx4200_start: ioctl(%s, TCGETA): %m", mx4200dev); - goto screwed; - } - ttyb.c_iflag = IGNBRK|IGNPAR|ICRNL; - ttyb.c_oflag = 0; - ttyb.c_cflag = SPEED232|CS8|CLOCAL|CREAD; - ttyb.c_lflag = ICANON; - ttyb.c_cc[VERASE] = ttyb.c_cc[VKILL] = '\0'; - if (ioctl(fd232, TCSETA, &ttyb) < 0) { - syslog(LOG_ERR, - "mx4200_start: ioctl(%s, TCSETA): %m", mx4200dev); - goto screwed; - } - } -#endif /* HAVE_SYSV_TTYS */ -#if defined(HAVE_TERMIOS) - /* - * POSIX serial line parameters (termios interface) - * - * The MX4200CLK option provides timestamping at the driver level. - * It requires the tty_clk streams module. - * - * The MX4200PPS option provides timestamping at the driver level. - * It uses a 1-pps signal and level converter (gadget box) and - * requires the ppsclock streams module and SunOS 4.1.1 or - * later. - */ - { struct termios ttyb, *ttyp; - - ttyp = &ttyb; - if (tcgetattr(fd232, ttyp) < 0) { - syslog(LOG_ERR, - "mx4200_start: tcgetattr(%s): %m", mx4200dev); - goto screwed; - } - ttyp->c_iflag = IGNBRK|IGNPAR|ICRNL; - ttyp->c_oflag = 0; - ttyp->c_cflag = SPEED232|CS8|CLOCAL|CREAD; - ttyp->c_lflag = ICANON; - ttyp->c_cc[VERASE] = ttyp->c_cc[VKILL] = '\0'; - if (tcsetattr(fd232, TCSANOW, ttyp) < 0) { - syslog(LOG_ERR, - "mx4200_start: tcsetattr(%s): %m", mx4200dev); - goto screwed; - } - if (tcflush(fd232, TCIOFLUSH) < 0) { - syslog(LOG_ERR, - "mx4200_start: tcflush(%s): %m", mx4200dev); - goto screwed; - } - } -#endif /* HAVE_TERMIOS */ -#ifdef STREAM -#if defined(MX4200CLK) - if (ioctl(fd232, I_PUSH, "clk") < 0) - syslog(LOG_ERR, - "mx4200_start: ioctl(%s, I_PUSH, clk): %m", mx4200dev); - if (ioctl(fd232, CLK_SETSTR, "\n") < 0) - syslog(LOG_ERR, - "mx4200_start: ioctl(%s, CLK_SETSTR): %m", mx4200dev); -#endif /* MX4200CLK */ -#if defined(MX4200PPS) - if (ioctl(fd232, I_PUSH, "ppsclock") < 0) - syslog(LOG_ERR, - "mx4200_start: ioctl(%s, I_PUSH, ppsclock): %m", mx4200dev); - else - fdpps = fd232; -#endif /* MX4200PPS */ -#endif /* STREAM */ -#if defined(HAVE_BSD_TTYS) - /* - * 4.3bsd serial line parameters (sgttyb interface) - * - * The MX4200CLK option provides timestamping at the driver level. - * It requires the tty_clk line discipline and 4.3bsd or later. - */ - { struct sgttyb ttyb; -#if defined(MX4200CLK) - int ldisc = CLKLDISC; -#endif /* MX4200CLK */ - - if (ioctl(fd232, TIOCGETP, &ttyb) < 0) { - syslog(LOG_ERR, - "mx4200_start: ioctl(%s, TIOCGETP): %m", mx4200dev); - goto screwed; - } - ttyb.sg_ispeed = ttyb.sg_ospeed = SPEED232; -#if defined(MX4200CLK) - ttyb.sg_erase = ttyb.sg_kill = '\r'; - ttyb.sg_flags = RAW; -#else - ttyb.sg_erase = ttyb.sg_kill = '\0'; - ttyb.sg_flags = EVENP|ODDP|CRMOD; -#endif /* MX4200CLK */ - if (ioctl(fd232, TIOCSETP, &ttyb) < 0) { - syslog(LOG_ERR, - "mx4200_start: ioctl(%s, TIOCSETP): %m", mx4200dev); - goto screwed; - } -#if defined(MX4200CLK) - if (ioctl(fd232, TIOCSETD, &ldisc) < 0) { - syslog(LOG_ERR, - "mx4200_start: ioctl(%s, TIOCSETD): %m",mx4200dev); - goto screwed; - } -#endif /* MX4200CLK */ - } -#endif /* HAVE_BSD_TTYS */ - - /* - * Allocate unit structure - */ - if (mx4200units[unit] != 0) { - mx4200 = mx4200units[unit]; /* The one we want is okay */ - } else { - for (i = 0; i < MAXUNITS; i++) { - if (!unitinuse[i] && mx4200units[i] != 0) - break; - } - if (i < MAXUNITS) { - /* - * Reclaim this one - */ - mx4200 = mx4200units[i]; - mx4200units[i] = 0; - } else { - mx4200 = (struct mx4200unit *) - emalloc(sizeof(struct mx4200unit)); - } - } - - memset((char *)mx4200, 0, sizeof(struct mx4200unit)); - mx4200units[unit] = mx4200; - - /* - * Set up the structures - */ - mx4200->peer = peer; - mx4200->unit = (u_char)unit; - mx4200->timestarted = current_time; - - mx4200->io.clock_recv = mx4200_receive; - mx4200->io.srcclock = (caddr_t)mx4200; - mx4200->io.datalen = 0; - mx4200->io.fd = fd232; - if (!io_addclock(&mx4200->io)) - goto screwed; - - /* - * All done. Initialize a few random peer variables, then - * return success. - */ - peer->precision = MX4200PRECISION; - peer->rootdelay = 0; - peer->rootdispersion = 0; - peer->stratum = stratumtouse[unit]; - peer->refid = refid[unit]; - unitinuse[unit] = 1; - - /* Insure the receiver is properly configured */ - mx4200_config(mx4200); - -#ifdef DEBUG - opendfile(0); -#endif - return (1); - - /* - * Something broke; abandon ship - */ -screwed: - (void) close(fd232); - return (0); -} - -/* - * mx4200_shutdown - shut down a MX4200 clock - */ -static void -mx4200_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct mx4200unit *mx4200; - - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "mx4200_shutdown: unit %d invalid", unit); - return; - } - if (!unitinuse[unit]) { - syslog(LOG_ERR, "mx4200_shutdown: unit %d not in use", unit); - return; - } - - /* - * Tell the I/O module to turn us off. We're history. - */ - mx4200 = mx4200units[unit]; - io_closeclock(&mx4200->io); - unitinuse[unit] = 0; -} - -static void -mx4200_config(mx4200) - register struct mx4200unit *mx4200; -{ - register int fd = mx4200->io.fd; - -syslog(LOG_DEBUG, "mx4200_config"); - - /* Zero the output list (do it twice to flush possible junk) */ - mx4200_send(fd, "%s,%03d,,%d,,,,,,", pmvxg, PMVXG_S_PORTCONF, 1); - mx4200_send(fd, "%s,%03d,,%d,,,,,,", pmvxg, PMVXG_S_PORTCONF, 1); - - /* Switch to 2d mode */ - mx4200_send(fd, "%s,%03d,%d,,%.1f,%.1f,,%d,%d,%c,%d", - pmvxg, PMVXG_S_INITMODEB, - 2, /* 2d mode */ - 0.1, /* hor accel fact as per Steve */ - 0.1, /* ver accel fact as per Steve */ - 10, /* hdop limit as per Steve */ - 5, /* elevation limit as per Steve */ - 'U', /* time output mode */ - 0); /* local time offset from gmt */ - - /* Configure time recovery */ - mx4200_send(fd, "%s,%03d,%c,%c,%c,%d,%d,%d,", - pmvxg, PMVXG_S_TRECOVCONF, -#ifdef notdef - 'K', /* known position */ - 'D', /* dynamic position */ -#else - 'S', /* static position */ -#endif - 'U', /* steer clock to gps time */ - 'A', /* always output time pulse */ - 500, /* max time error in ns */ - 0, /* user bias in ns */ - 1); /* output to control port */ -} - -/* - * mx4200_report_event - note the occurrence of an event - */ -static void -mx4200_report_event(mx4200, code) - struct mx4200unit *mx4200; - int code; -{ - struct peer *peer; - - peer = mx4200->peer; - if (mx4200->status != (u_char)code) { - mx4200->status = (u_char)code; - if (code != CEVNT_NOMINAL) - mx4200->lastevent = (u_char)code; - syslog(LOG_INFO, - "mx4200 clock %s event %x", ntoa(&peer->srcadr), code); - } -} - -/* - * mx4200_poll - mx4200 watchdog routine - */ -static void -mx4200_poll(unit, peer) - int unit; - struct peer *peer; -{ - register struct mx4200unit *mx4200; - - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "mx4200_poll: unit %d invalid", unit); - return; - } - if (!unitinuse[unit]) { - syslog(LOG_ERR, "mx4200_poll: unit %d not used", unit); - return; - } - - mx4200 = mx4200units[unit]; - if ((current_time - mx4200->lasttime) > 150) { - mx4200_event(mx4200, CEVNT_FAULT); - - /* Request a status message which should trigger a reconfig */ - mx4200_send(mx4200->io.fd, "%s,%03d", "CDGPQ", PMVXG_D_STATUS); - syslog(LOG_DEBUG, "mx4200_poll: request status"); - } -} - -static const char char2hex[] = "0123456789ABCDEF"; - -/* - * mx4200_receive - receive gps data - */ -static void -mx4200_receive(rbufp) - struct recvbuf *rbufp; -{ - register struct mx4200unit *mx4200; - register char *dpt, *cp; - register U_LONG tmp_ui; - register U_LONG tmp_uf; - register U_LONG gpstime; - struct ppsclockev ev; - register struct calendar *jt; - struct calendar sjt; - register int n; - int valid, leapsec; - register u_char ck; - - mx4200 = (struct mx4200unit *)rbufp->recv_srcclock; - -#ifdef DEBUG - if (debug > 3) - printf("mx4200_receive: nsamples = %d\n", mx4200->nsamples); -#endif - - /* Record the time of this event */ - mx4200->lasttime = current_time; - - /* Get the pps value */ - if (ioctl(mx4200->io.fd, CIOGETEV, (char *)&ev) < 0) { - /* XXX Actually, if this fails, we're pretty much screwed */ -#ifdef DEBUG - if (debug) { - fprintf(stderr, "mx4200_receive: "); - perror("CIOGETEV"); - } -#endif - mx4200->reason = PPSREASON + 1; - mx4200_event(mx4200, CEVNT_FAULT); - mx4200_reset(mx4200); - return; - } - tmp_ui = ev.tv.tv_sec + (U_LONG)JAN_1970; - TVUTOTSF(ev.tv.tv_usec, tmp_uf); - - /* Get buffer and length; sock away last timecode */ - n = rbufp->recv_length; - dpt = rbufp->recv_buffer; - if (n <= 1) - return; - mx4200->lencode = n; - memmove(mx4200->lastcode, dpt, n); - - /* - * We expect to see something like: - * - * $PMVXG,830,T,1992,07,09,04:18:34,U,S,-02154,00019,000000,00*1D\n - * - * Reject if any important landmarks are missing. - */ - cp = dpt + n - 4; - if (cp < dpt || *dpt != '$' || cp[0] != '*' || cp[3] != '\n') { -#ifdef DEBUG - if (debug) - printf("mx4200_receive: bad format\n"); -#endif - mx4200->badformat++; - mx4200->reason = PPSREASON + 2; - mx4200_event(mx4200, CEVNT_BADREPLY); - mx4200_reset(mx4200); - return; - } - - /* Check checksum */ - ck = cksum(&dpt[1], n - 5); - if (char2hex[ck >> 4] != cp[1] || char2hex[ck & 0xf] != cp[2]) { -#ifdef DEBUG - if (debug) - printf("mx4200_receive: bad checksum\n"); -#endif - mx4200->badformat++; - mx4200->reason = PPSREASON + 3; - mx4200_event(mx4200, CEVNT_BADREPLY); - mx4200_reset(mx4200); - return; - } - - /* Truncate checksum (and the buffer for that matter) */ - *cp = '\0'; - - /* Leap second debugging stuff */ - if ((leap_hoursfromleap && !leap_happened) || leap_debug > 0) { - /* generate reports for awhile after leap */ - if (leap_hoursfromleap && !leap_happened) - leap_debug = 3600; - else - --leap_debug; - syslog(LOG_INFO, "mx4200 leap: %s \"%s\"", - umfptoa(tmp_ui, tmp_uf, 6), dpt); - } - - /* Parse time recovery message */ - jt = &sjt; - if ((cp = mx4200_parse(dpt, jt, &valid, &leapsec)) != NULL) { - /* Configure the receiver if necessary */ - if (mx4200_needconf(dpt)) - mx4200_config(mx4200); -#ifdef DEBUG - if (debug) - printf("mx4200_receive: mx4200_parse: %s\n", cp); -#endif - mx4200->badformat++; - mx4200->reason = PPSREASON + 5; - mx4200_event(mx4200, CEVNT_BADREPLY); - mx4200_reset(mx4200); - return; - } - - /* Setup leap second indicator */ - if (leapsec == 0) - mx4200->leap = LEAP_NOWARNING; - else if (leapsec == 1) - mx4200->leap = LEAP_ADDSECOND; - else if (leapsec == -1) - mx4200->leap = LEAP_DELSECOND; - else - mx4200->leap = LEAP_NOTINSYNC; /* shouldn't happen */ - - /* Check parsed time (allow for possible leap seconds) */ - if (jt->second >= 61 || jt->minute >= 60 || jt->hour >= 24) { -#ifdef DEBUG - if (debug) { - printf("mx4200_receive: bad time %d:%02d:%02d", - jt->hour, jt->minute, jt->second); - if (leapsec != 0) - printf(" (leap %+d)", leapsec); - putchar('\n'); - } -#endif - mx4200->baddata++; - mx4200->reason = PPSREASON + 6; - mx4200_event(mx4200, CEVNT_BADTIME); - mx4200_reset(mx4200); - /* Eat the next pulse which the clock claims will be bad */ - mx4200->nsamples = -1; - return; - } - - /* Check parsed date */ - if (jt->monthday > 31 || jt->month > 12 || jt->year < 1900) { -#ifdef DEBUG - if (debug) - printf("mx4200_receive: bad date (%d/%d/%d)\n", - jt->monthday, jt->month, jt->year); -#endif - mx4200->baddata++; - mx4200->reason = PPSREASON + 7; - mx4200_event(mx4200, CEVNT_BADDATE); - mx4200_reset(mx4200); - return; - } - - /* Convert to ntp time */ - gpstime = caltontp(jt); - - /* The gps message describes the *next* pulse; pretend it's this one */ - --gpstime; - - /* Debugging */ -#ifdef DEBUG - checkdfile(); - if (df != NULL) { - l_fp t; - - t.l_ui = gpstime; - t.l_uf = 0; - M_SUB(t.l_ui, t.l_uf, tmp_ui, tmp_uf); - fprintf(df, "%s\t%s", - umfptoa(tmp_ui, tmp_uf, 6), mfptoa(t.l_ui, t.l_uf, 6)); - if (debug > 3) - fprintf(df, "\t(gps: %lu)", (u_long)gpstime); - if (leapsec != 0) - fprintf(df, "\t(leap sec %+d)", leapsec); - if (!valid) - fprintf(df, "\t(pulse not valid)"); - fputc('\n', df); - } -#endif - - /* Check pps serial number against last one */ - if (mx4200->lastserial + 1 != ev.serial && mx4200->lastserial != 0) { -#ifdef DEBUG - if (debug) { - if (ev.serial == mx4200->lastserial) - printf("mx4200_receive: no new pps event\n"); - else - printf("mx4200_receive: missed %d pps events\n", - ev.serial - mx4200->lastserial - 1); - } -#endif - mx4200->reason = PPSREASON + 8; - mx4200_event(mx4200, CEVNT_FAULT); - mx4200_reset(mx4200); - /* fall through and this one collect as first sample */ - } - mx4200->lastserial = ev.serial; - -/* - * XXX - * Since this message is for the next pulse, it's really the next pulse - * that the clock might be telling us will be invalid. - */ - /* Toss if not designated "valid" by the gps */ - if (!valid) { -#ifdef DEBUG - if (debug) - printf("mx4200_receive: pps not valid\n"); -#endif - mx4200->reason = PPSREASON + 9; - mx4200_event(mx4200, CEVNT_BADTIME); - mx4200_reset(mx4200); - return; - } - - /* Copy time into mx4200unit struct */ - /* XXX (why?) */ - mx4200->year = jt->year; - mx4200->monthday = jt->monthday; - mx4200->hour = jt->hour; - mx4200->minute = jt->minute; - mx4200->second = jt->second; - - /* Sock away the GPS and UNIX timesamples */ - n = mx4200->nsamples++; - if (n < 0) - return; /* oops, this pulse is bad */ - mx4200->gpssamples[n] = gpstime; - mx4200->unixsamples[n].l_ui = mx4200->lastsampletime.l_ui = tmp_ui; - mx4200->unixsamples[n].l_uf = mx4200->lastsampletime.l_uf = tmp_uf; - if (mx4200->nsamples >= NSTAMPS) { - /* - * Here we've managed to complete an entire NSTAMPS - * second cycle without major mishap. Process what has - * been received. - */ - mx4200_process(mx4200); - mx4200_reset(mx4200); - } -} - -/* Compare two l_fp's, used with qsort() */ -static int -mx4200_cmpl_fp(p1, p2) - register void *p1, *p2; -{ - - if (!L_ISGEQ((l_fp *)p1, (l_fp *)p2)) - return (-1); - if (L_ISEQU((l_fp *)p1, (l_fp *)p2)) - return (0); - return (1); -} - -/* - * mx4200_process - process a pile of samples from the clock - */ -static void -mx4200_process(mx4200) - struct mx4200unit *mx4200; -{ - register int i, n; - register l_fp *fp, *op; - register U_LONG *lp; - l_fp off[NSTAMPS]; - register U_LONG tmp_ui, tmp_uf; - register U_LONG date_ui, date_uf; - u_fp dispersion; - - /* Compute offsets from the raw data. */ - fp = mx4200->unixsamples; - op = off; - lp = mx4200->gpssamples; - for (i = 0; i < NSTAMPS; ++i, ++lp, ++op, ++fp) { - op->l_ui = *lp; - op->l_uf = 0; - L_SUB(op, fp); - } - - /* Sort offsets into ascending order. */ - qsort((char *)off, NSTAMPS, sizeof(l_fp), mx4200_cmpl_fp); - - /* - * Reject the furthest from the median until 8 samples left - */ - i = 0; - n = NSTAMPS; - while ((n - i) > 8) { - tmp_ui = off[n-1].l_ui; - tmp_uf = off[n-1].l_uf; - date_ui = off[(n+i)/2].l_ui; - date_uf = off[(n+i)/2].l_uf; - M_SUB(tmp_ui, tmp_uf, date_ui, date_uf); - M_SUB(date_ui, date_uf, off[i].l_ui, off[i].l_uf); - if (M_ISHIS(date_ui, date_uf, tmp_ui, tmp_uf)) { - /* - * reject low end - */ - i++; - } else { - /* - * reject high end - */ - n--; - } - } - - /* - * Compute the dispersion based on the difference between the - * extremes of the remaining offsets. - */ - tmp_ui = off[n-1].l_ui; - tmp_uf = off[n-1].l_uf; - M_SUB(tmp_ui, tmp_uf, off[i].l_ui, off[i].l_uf); - dispersion = MFPTOFP(tmp_ui, tmp_uf); - - /* - * Now compute the offset estimate. If the sloppy clock - * flag is set, average the remainder, otherwise pick the - * median. - */ - if (sloppyclockflag[mx4200->unit]) { - tmp_ui = tmp_uf = 0; - while (i < n) { - M_ADD(tmp_ui, tmp_uf, off[i].l_ui, off[i].l_uf); - i++; - } - M_RSHIFT(tmp_ui, tmp_uf); - M_RSHIFT(tmp_ui, tmp_uf); - M_RSHIFT(tmp_ui, tmp_uf); - i = 0; - off[0].l_ui = tmp_ui; - off[0].l_uf = tmp_uf; - } else { - i = (n + i) / 2; - } - - /* - * Add the default MX4200 QT delay into this. - */ -#ifdef notdef - L_ADDUF(&off[i], MX4200QTFUDGE); -#endif - - /* - * Done. Use lastref as the reference time and lastrec - * as the receive time. ** note this can result in tossing - * out the peer in the protocol module if lastref > lastrec, - * so last rec is used for both values - dlm *** - */ - refclock_receive(mx4200->peer, &off[i], - (s_fp)0, /* delay */ - dispersion, - &mx4200->unixsamples[NSTAMPS-1], /* reftime */ - &mx4200->unixsamples[NSTAMPS-1], /* rectime */ - mx4200->leap); - - mx4200_event(mx4200, CEVNT_NOMINAL); -} - -/* - * mx4200_control - set fudge factors, return statistics - */ -static void -mx4200_control(unit, in, out) - int unit; - struct refclockstat *in; - struct refclockstat *out; -{ - register struct mx4200unit *mx4200; - - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "mx4200_control: unit %d invalid", unit); - return; - } - - if (in != 0) { - if (in->haveflags & CLK_HAVETIME1) - fudgefactor[unit] = in->fudgetime1; - if (in->haveflags & CLK_HAVEVAL1) - stratumtouse[unit] = (u_char)(in->fudgeval1); - if (in->haveflags & CLK_HAVEVAL2) - refid[unit] = in->fudgeval2; - if (in->haveflags & CLK_HAVEFLAG1) - sloppyclockflag[unit] = in->flags & CLK_FLAG1; - if (unitinuse[unit]) { - struct peer *peer; - - peer = mx4200units[unit]->peer; - peer->stratum = stratumtouse[unit]; - peer->refid = refid[unit]; - } - } - - if (out != 0) { - memset((char *)out, 0, sizeof (struct refclockstat)); - out->type = REFCLK_GPS_MX4200; - out->haveflags = CLK_HAVETIME1 | CLK_HAVEVAL1 | CLK_HAVEVAL2 | - CLK_HAVEFLAG1; - out->clockdesc = MX4200DESCRIPTION; - out->fudgetime1 = fudgefactor[unit]; - out->fudgeval1 = (LONG)stratumtouse[unit]; - out->fudgeval2 = refid[unit];; - out->flags = sloppyclockflag[unit]; - if (unitinuse[unit]) { - mx4200 = mx4200units[unit]; - out->lencode = mx4200->lencode; - out->lastcode = mx4200->lastcode; - out->lastevent = mx4200->lastevent; - out->currentstatus = mx4200->status; - - out->polls = 0; /* mx4200->polls; */ - out->noresponse = 0; /* mx4200->noresponse; */ - out->badformat = mx4200->badformat; - out->baddata = mx4200->baddata; - out->timereset = current_time - mx4200->timestarted; - } - } -} - -/* - * mx4200_buginfo - return clock dependent debugging info - */ -static void -mx4200_buginfo(unit, bug) - int unit; - register struct refclockbug *bug; -{ - register struct mx4200unit *mx4200; - - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "mx4200_buginfo: unit %d invalid", unit); - return; - } - - if (!unitinuse[unit]) - return; - mx4200 = mx4200units[unit]; - - memset((char *)bug, 0, sizeof(*bug)); - bug->nvalues = 10; - bug->ntimes = 2; - if (mx4200->lasttime != 0) - bug->values[0] = current_time - mx4200->lasttime; - else - bug->values[0] = 0; - bug->values[1] = (U_LONG)mx4200->reason; - bug->values[2] = (U_LONG)mx4200->year; - bug->values[3] = (U_LONG)mx4200->monthday; - bug->values[4] = (U_LONG)mx4200->hour; - bug->values[5] = (U_LONG)mx4200->minute; - bug->values[6] = (U_LONG)mx4200->second; -#ifdef notdef - bug->values[7] = mx4200->msec; - bug->values[8] = mx4200->noreply; - bug->values[9] = mx4200->yearstart; -#endif - bug->stimes = 0x1c; -#ifdef notdef - bug->times[0] = mx4200->lastref; - bug->times[1] = mx4200->lastrec; -#endif -} - -/* - * Returns true if the this is a status message. We use this as - * an indication that the receiver needs to be initialized. - */ -static int -mx4200_needconf(buf) - char *buf; -{ - register LONG v; - char *cp; - - cp = buf; - - if ((cp = strchr(cp, ',')) == NULL) - return (0); - ++cp; - - /* Record type */ - v = strtol(cp, &cp, 10); - if (v != PMVXG_D_STATUS) - return (0); - /* - * XXX - * Since we configure the receiver to not give us status - * messages and since the receiver outputs status messages by - * default after being reset to factory defaults when sent the - * "$PMVXG,018,C\r\n" message, any status message we get - * indicates the reciever needs to be initialized; thus, it is - * not necessary to decode the status message. - */ -#ifdef notdef - ++cp; - - /* Receiver status */ - if ((cp = strchr(cp, ',')) == NULL) - return (0); - ++cp; - - /* Number of satellites which should be visible */ - if ((cp = strchr(cp, ',')) == NULL) - return (0); - ++cp; - - /* Number of satellites being tracked */ - if ((cp = strchr(cp, ',')) == NULL) - return (0); - ++cp; - - /* Time since last NAV */ - if ((cp = strchr(cp, ',')) == NULL) - return (0); - ++cp; - - /* Initialization status */ - v = strtol(cp, &cp, 10); - if (v == 0) -#endif - return (1); -} - -/* Parse a mx4200 time recovery message. Returns a string if error */ -static char * -mx4200_parse(buf, jt, validp, leapsecp) - register char *buf; - register struct calendar *jt; - register int *validp, *leapsecp; -{ - register LONG v; - char *cp; - - cp = buf; - memset((char *)jt, 0, sizeof(*jt)); - - if ((cp = strchr(cp, ',')) == NULL) - return ("no rec-type"); - ++cp; - - /* Record type */ - v = strtol(cp, &cp, 10); - if (v != PMVXG_D_TRECOVOUT) - return ("wrong rec-type"); - - /* Pulse valid indicator */ - if (*cp++ != ',') - return ("no pulse-valid"); - if (*cp == 'T') - *validp = 1; - else if (*cp == 'F') - *validp = 0; - else - return ("bad pulse-valid"); - ++cp; - - /* Year */ - if (*cp++ != ',') - return ("no year"); - jt->year = strtol(cp, &cp, 10); - - /* Month of year */ - if (*cp++ != ',') - return ("no month"); - jt->month = strtol(cp, &cp, 10); - - /* Day of month */ - if (*cp++ != ',') - return ("no month day"); - jt->monthday = strtol(cp, &cp, 10); - - /* Hour */ - if (*cp++ != ',') - return ("no hour"); - jt->hour = strtol(cp, &cp, 10); - - /* Minute */ - if (*cp++ != ':') - return ("no minute"); - jt->minute = strtol(cp, &cp, 10); - - /* Second */ - if (*cp++ != ':') - return ("no second"); - jt->second = strtol(cp, &cp, 10); - - /* Time indicator */ - if (*cp++ != ',' || *cp++ == '\0') - return ("no time indicator"); - - /* Time recovery mode */ - if (*cp++ != ',' || *cp++ == '\0') - return ("no time mode"); - - /* Oscillator offset */ - if ((cp = strchr(cp, ',')) == NULL) - return ("no osc off"); - ++cp; - - /* Time mark error */ - if ((cp = strchr(cp, ',')) == NULL) - return ("no time mark err"); - ++cp; - - /* User time bias */ - if ((cp = strchr(cp, ',')) == NULL) - return ("no user bias"); - ++cp; - - /* Leap second flag */ - if ((cp = strchr(cp, ',')) == NULL) - return ("no leap"); - ++cp; - *leapsecp = strtol(cp, &cp, 10); - - return (NULL); -} - -/* Calculate the checksum */ -static u_char -cksum(cp, n) - register char *cp; - register u_int n; -{ - register u_char ck; - - for (ck = 0; n-- > 0; ++cp) - ck ^= *cp; - return (ck); -} - -static void -#if __STDC__ -mx4200_send(register int fd, const char *fmt, ...) -#else -mx4200_send(fd, fmt, va_alist) - register int fd; - const char *fmt; - va_dcl -#endif -{ - register char *cp; - register int n, m; - va_list ap; - char buf[1024]; - u_char ck; - -#if __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - cp = buf; - *cp++ = '$'; -#ifdef notdef - /* BSD is rational */ - n = vsnprintf(cp, sizeof(buf) - 1, fmt, ap); -#else - /* SunOS sucks */ - (void)vsprintf(cp, fmt, ap); - n = strlen(cp); -#endif - ck = cksum(cp, n); - cp += n; - ++n; -#ifdef notdef - /* BSD is rational */ - n += snprintf(cp, sizeof(buf) - n - 5, "*%02X\r\n", ck); -#else - /* SunOS sucks */ - sprintf(cp, "*%02X\r\n", ck); - n += strlen(cp); -#endif - - m = write(fd, buf, n); - if (m < 0) - syslog(LOG_ERR, "mx4200_send: write: %m (%s)", buf); - else if (m != n) - syslog(LOG_ERR, "mx4200_send: write: %d != %d (%s)", m, n, buf); - va_end(ap); -} -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_nmea.c b/usr.sbin/xntpd/xntpd/refclock_nmea.c deleted file mode 100644 index b7be01dc4162..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_nmea.c +++ /dev/null @@ -1,406 +0,0 @@ -/* - * refclock_nmea.c - clock driver for an NMEA GPS CLOCK - * Michael Petry Jun 20, 1994 - * based on refclock_heath.c - */ -#if defined(REFCLOCK) && defined(NMEA) - -#define DEBUG 1 - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_stdlib.h" - -/* - * This driver supports the NMEA GPS Receiver with - * - * Protype was refclock_trak.c, Thanks a lot. - * - * The reciever used spits out the NMEA sentences for boat navigation. - * And you thought it was an information superhighway. Try a raging river - * filled with rapids and whirlpools that rip away your data and warp time. - */ - -/* - * Definitions - */ -#define DEVICE "/dev/gps%d" /* name of radio device */ -#define SPEED232 B4800 /* uart speed (4800 bps) */ -#define PRECISION (-9) /* precision assumed (about 2 ms) */ -#define REFID "GPS\0" /* reference id */ -#define DESCRIPTION "NMEA GPS Clock" /* who we are */ - -#define NSAMPLES 3 /* stages of median filter */ -#define LENNMEA 75 /* min timecode length */ - -/* - * Imported from ntp_timer module - */ -extern u_long current_time; /* current time (s) */ - -/* - * Imported from ntp_loopfilter module - */ -extern int fdpps; /* pps file descriptor */ - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * Tables to compute the ddd of year form icky dd/mm timecode. Viva la - * leap. - */ -static day1tab[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; -static day2tab[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; - -/* - * Unit control structure - */ -struct nmeaunit { - int pollcnt; /* poll message counter */ - l_fp tstamp; /* timestamp of last poll */ -}; - -/* - * Function prototypes - */ -static int nmea_start P((int, struct peer *)); -static void nmea_shutdown P((int, struct peer *)); -static void nmea_receive P((struct recvbuf *)); -static void nmea_poll P((int, struct peer *)); -static void gps_send P((int, char *, struct peer *)); - -/* - * Transfer vector - */ -struct refclock refclock_nmea = { - nmea_start, /* start up driver */ - nmea_shutdown, /* shut down driver */ - nmea_poll, /* transmit poll message */ - noentry, /* handle control */ - noentry, /* initialize driver */ - noentry, /* buginfo */ - NOFLAGS /* not used */ -}; - -/* - * nmea_start - open the GPS devices and initialize data for processing - */ -static int -nmea_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct nmeaunit *up; - struct refclockproc *pp; - int fd; - char device[20]; - - /* - * Open serial port. Use CLK line discipline, if available. - */ - (void)sprintf(device, DEVICE, unit); - if (!(fd = refclock_open(device, SPEED232, LDISC_CLK))) - return (0); - - /* - * Allocate and initialize unit structure - */ - if (!(up = (struct nmeaunit *) - emalloc(sizeof(struct nmeaunit)))) { - (void) close(fd); - return (0); - } - memset((char *)up, 0, sizeof(struct nmeaunit)); - pp = peer->procptr; - pp->io.clock_recv = nmea_receive; - pp->io.srcclock = (caddr_t)peer; - pp->io.datalen = 0; - pp->io.fd = fd; - if (!io_addclock(&pp->io)) { - (void) close(fd); - free(up); - return (0); - } - pp->unitptr = (caddr_t)up; - - /* - * Initialize miscellaneous variables - */ - peer->precision = PRECISION; - pp->clockdesc = DESCRIPTION; - memcpy((char *)&pp->refid, REFID, 4); - up->pollcnt = 2; - gps_send(pp->io.fd,"$PMOTG,RMC,0000\n", peer); - return (1); -} - -/* - * nmea_shutdown - shut down a GPS clock - */ -static void -nmea_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct nmeaunit *up; - struct refclockproc *pp; - - pp = peer->procptr; - up = (struct nmeaunit *)pp->unitptr; - io_closeclock(&pp->io); - free(up); -} - -/* - * nmea_receive - receive data from the serial interface - */ -static void -nmea_receive(rbufp) - struct recvbuf *rbufp; -{ - register struct nmeaunit *up; - struct refclockproc *pp; - struct peer *peer; - l_fp trtmp; - int month, day; - int i; - char *cp, *dp; - int cmdtype; - char *field_parse(); - - /* - * Initialize pointers and read the timecode and timestamp - */ - peer = (struct peer *)rbufp->recv_srcclock; - pp = peer->procptr; - up = (struct nmeaunit *)pp->unitptr; - pp->lencode = refclock_gtlin(rbufp, pp->lastcode, BMAX, &trtmp); - - /* - * There is a case that a <CR><LF> gives back a "blank" line - */ - if (pp->lencode == 0) - return; - - /* - * We get a buffer and timestamp for each <cr>; however, we use - * the timestamp of "now" since this may be a broadcast instead - * of a poll. This needs to be checked empeerically - */ - gettstamp(&up->tstamp); /* HACK */ - pp->lastrec = up->tstamp; - up->pollcnt = 2; - record_clock_stats(&peer->srcadr, pp->lastcode); -#ifdef DEBUG - if (debug) - printf("nmea: timecode %d %s\n", pp->lencode, - pp->lastcode); -#endif - - /* - * We check the timecode format and decode its contents. The - * we only care about a few of them. The most important being - * the $GPRMC format - * $GPRMC,hhmmss,a,fddmm.xx,n,dddmmm.xx,w,zz.z,yyy.,ddmmyy,dd,v*CC - * $GPGGA,162617.0,4548.339,N,00837.719,E,1,07,0.97,00262,M,048,M,,*5D - */ -#define GPRMC 0 -#define GPXXX 1 -#define GPGCA 2 - cp = pp->lastcode; - pp->leap = 0; - cmdtype=0; - if(strncmp(cp,"$GPRMC",6)==0) { - cmdtype=GPRMC; - } - else if(strncmp(cp,"$GPGGA",6)==0) { - cmdtype=GPGCA; - } - else if(strncmp(cp,"$GPXXX",6)==0) { - cmdtype=GPXXX; - } - else - return; - - switch( cmdtype ) { - case GPRMC: - case GPGCA: - /* - * Check time code format of NMEA - */ - - dp = field_parse(cp,1); - if( !isdigit(dp[0]) || - !isdigit(dp[1]) || - !isdigit(dp[2]) || - !isdigit(dp[3]) || - !isdigit(dp[4]) || - !isdigit(dp[5]) - ) { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - break; - case GPXXX: - return; - default: - return; - - } - - if (cmdtype ==GPGCA) { - /* only time */ - time_t tt = time(NULL); - struct tm * t = gmtime(&tt); - day = t->tm_mday; - month = t->tm_mon + 1; - pp->year= t->tm_year; - } else { - dp = field_parse(cp,9); - /* - * Convert date and check values. - */ - day = dp[0] - '0'; - day = (day * 10) + dp[1] - '0'; - month = dp[2] - '0'; - month = (month * 10) + dp[3] - '0'; - pp->year = dp[4] - '0'; - pp->year = (pp->year * 10) + dp[5] - '0'; - } - - if (month < 1 || month > 12 || day < 1) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - - if (pp->year % 4) { - if (day > day1tab[month - 1]) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - for (i = 0; i < month - 1; i++) - day += day1tab[i]; - } else { - if (day > day2tab[month - 1]) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - for (i = 0; i < month - 1; i++) - day += day2tab[i]; - } - pp->day = day; - - dp = field_parse(cp,1); - /* - * Convert time and check values. - */ - pp->hour = ((dp[0] - '0') * 10) + dp[1] - '0'; - pp->minute = ((dp[2] - '0') * 10) + dp[3] - '0'; - pp->second = ((dp[4] - '0') * 10) + dp[5] - '0'; - pp->msec = 0; - - if (pp->hour > 23 || pp->minute > 59 || pp->second > 59) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - - /* - * Test for synchronization Check for quality byte. (soon) - */ - pp->leap = 0; - pp->lasttime = current_time; - - /* - * Process the new sample in the median filter and determine the - * reference clock offset and dispersion. We use lastrec as both - * the reference time and receive time, in order to avoid being - * cute, like setting the reference time later than the receive - * time, which may cause a paranoid protocol module to chuck out - * the data. - */ - if (!refclock_process(pp, NSAMPLES, NSAMPLES)) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - - refclock_receive(peer, &pp->offset, 0, pp->dispersion, - &pp->lastrec, &pp->lastrec, pp->leap); -} - -/* - * nmea_poll - called by the transmit procedure - * - * We go to great pains to avoid changing state here, since there may be - * more than one eavesdropper receiving the same timecode. - */ -static void -nmea_poll(unit, peer) - int unit; - struct peer *peer; -{ - register struct nmeaunit *up; - struct refclockproc *pp; - - pp = peer->procptr; - up = (struct nmeaunit *)pp->unitptr; - if (up->pollcnt == 0) - refclock_report(peer, CEVNT_TIMEOUT); - else - up->pollcnt--; - pp->polls++; - - /* - * usually nmea_receive can get a timestamp every second - */ - - gps_send(pp->io.fd,"$PMOTG,RMC,0\n", peer); -} - -/* - * - * gps_send(fd,cmd, peer) Sends a command to the GPS receiver. - * as gps_send(fd,"rqts,u\r", peer); - * - * We don't currently send any data, but would like to send - * RTCM SC104 messages for differential positioning. It should - * also give us better time. Without a PPS output, we're - * Just fooling ourselves because of the serial code paths - * - */ -static void -gps_send(fd, cmd, peer) - int fd; - char *cmd; - struct peer *peer; -{ - - if (write(fd, cmd, strlen(cmd)) == -1) { - refclock_report(peer, CEVNT_FAULT); - } -} - -char * -field_parse(cp, fn) - char *cp; - int fn; -{ - char *tp; - int i = fn; - - for (tp = cp; *tp != '\0'; tp++) { - if (*tp == ',') - i--; - if (i == 0) - break; - } - return (++tp); -} -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_omega.c b/usr.sbin/xntpd/xntpd/refclock_omega.c deleted file mode 100644 index 1dc31ff99b01..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_omega.c +++ /dev/null @@ -1,999 +0,0 @@ -/* - * refclock_omega - clock driver for the Kinemetrics Truetime OM-DC OMEGA - * receiver. - * - * Version 1.0 11-Dec-92 Steve Clift (clift@ml.csiro.au) - * Initial version, mostly lifted from refclock_goes.c. - * - * 1.1 03-May-93 Steve Clift - * Tarted up the sample filtering mechanism to give improved - * one-off measurements. Improved measurement dispersion code - * to account for accumulated drift when the clock loses lock. - * - */ - -#if defined(REFCLOCK) && (defined(OMEGA) || defined(OMEGACLK) || defined(OMEGAPPS)) - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_unixtime.h" - -#if defined(HAVE_BSD_TTYS) -#include <sgtty.h> -#endif /* HAVE_BSD_TTYS */ - -#if defined(HAVE_SYSV_TTYS) -#include <termio.h> -#endif /* HAVE_SYSV_TTYS */ - -#if defined(HAVE_TERMIOS) -#include <termios.h> -#endif -#if defined(STREAM) -#include <stropts.h> -#if defined(OMEGACLK) -#include <sys/clkdefs.h> -#endif /* OMEGACLK */ -#endif /* STREAM */ - -#if defined (OMEGAPPS) -#include <sys/ppsclock.h> -#endif /* OMEGAPPS */ - -#include "ntp_stdlib.h" - -/* - * Support for Kinemetrics Truetime OM-DC OMEGA Receiver - * - * Most of this code is copied from refclock_goes.c with thanks. - * - * the time code looks like follows; Send the clock a R or C and once per - * second a timestamp will appear that looks like this: - * ADDD:HH:MM:SSQCL - * A - control A - * Q Quality indication: indicates possible error of - * > >+- 5 seconds - * ? >+/- 500 milliseconds # >+/- 50 milliseconds - * * >+/- 5 milliseconds . >+/- 1 millisecond - * A-H less than 1 millisecond. Character indicates which station - * is being received as follows: - * A = Norway, B = Liberia, C = Hawaii, D = North Dakota, - * E = La Reunion, F = Argentina, G = Australia, H = Japan. - * C - Carriage return - * L - Line feed - * The carriage return start bit begins on 0 seconds and extends to 1 bit time. - */ - -/* - * Definitions - */ -#define MAXUNITS 4 /* max number of OMEGA units */ -#define OMEGA232 "/dev/omega%d" -#define SPEED232 B9600 /* 9600 baud */ - -/* - * Radio interface parameters - */ -#define OMEGADESCRIPTION "Kinemetrics OM-DC OMEGA Receiver" /* who we are */ -#define OMEGAMAXDISPERSE (FP_SECOND/32) /* max allowed sample dispersion */ -#define OMEGAPRECISION (-10) /* precision assumed (about 1 ms) */ -#define OMEGAREFID "VLF\0" /* reference id */ -#define LENOMEGA 13 /* length of standard response */ -#define GMT 0 /* hour offset from Greenwich */ -#define NSTAMPS 9 /* samples collected when polled */ -#define NSKEEP 5 /* samples to keep after discards */ - -/* - * The OM-DC puts out the start bit of the <CR> on the second, but - * we see the result after the <LF> is received, about 2ms later at - * 9600 baud. Use this as the default fudge time, and let the user - * fiddle it to account for driver latency etc. - */ -#define DEFFUDGETIME 0x00830000 /* default fudge time (~2ms) */ - -/* - * Clock drift errors as u_fp values. - */ -#define U_FP5000MS (5*FP_SECOND) /* 5 seconds */ -#define U_FP500MS (FP_SECOND/2) /* 500 msec */ -#define U_FP50MS (FP_SECOND/20) /* 50 msec */ -#define U_FP5MS (FP_SECOND/200) /* 5 msec */ - -/* - * Station codes - */ -#define STATION_NONE 0 -#define STATION_NORWAY 1 -#define STATION_LIBERIA 2 -#define STATION_HAWAII 3 -#define STATION_N_DAKOTA 4 -#define STATION_LA_REUNION 5 -#define STATION_ARGENTINA 6 -#define STATION_AUSTRALIA 7 -#define STATION_JAPAN 8 - -/* - * Hack to avoid excercising the multiplier. I have no pride. - */ -#define MULBY10(x) (((x)<<3) + ((x)<<1)) - -/* - * Imported from the timer module - */ -extern U_LONG current_time; -extern struct event timerqueue[]; - -/* - * Imported from ntp_loopfilter module - */ -extern int fdpps; /* pps file descriptor */ - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * OMEGA unit control structure - */ -struct omegaunit { - struct peer *peer; /* associated peer structure */ - struct refclockio io; /* given to the I/O handler */ - l_fp lastrec; /* last receive time */ - l_fp lastref; /* last timecode time */ - l_fp offset[NSTAMPS]; /* recent sample offsets */ - char lastcode[BMAX]; /* last timecode received */ - u_short station; /* which station we're locked to */ - u_short polled; /* Hand in a time sample? */ - U_LONG coderecv; /* timecodes received */ - u_char lencode; /* length of last timecode */ - U_LONG lasttime; /* last time clock heard from */ - u_char unit; /* unit number for this guy */ - u_char status; /* clock status */ - u_char lastevent; /* last clock event */ - u_char reason; /* reason for last failure */ - u_char year; /* year of eternity */ - u_short day; /* day of year */ - u_char hour; /* hour of day */ - u_char minute; /* minute of hour */ - u_char second; /* seconds of minute */ - u_char leap; /* leap indicators */ - u_short msec; /* millisecond of second */ - u_char quality; /* quality char from last timecode */ - u_long yearstart; /* start of current year */ - /* - * Status tallies - */ - U_LONG polls; /* polls sent */ - U_LONG noreply; /* no replies to polls */ - U_LONG badformat; /* bad format */ - U_LONG baddata; /* bad data */ - U_LONG timestarted; /* time we started this */ -}; - -/* - * Data space for the unit structures. Note that we allocate these on - * the fly, but never give them back. - */ -static struct omegaunit *omegaunits[MAXUNITS]; -static u_char unitinuse[MAXUNITS]; - -/* - * Keep the fudge factors separately so they can be set even - * when no clock is configured. - */ -static l_fp fudgefactor1[MAXUNITS]; -static l_fp fudgefactor2[MAXUNITS]; -static u_char stratumtouse[MAXUNITS]; -static u_char readonlyclockflag[MAXUNITS]; -static U_LONG refid[MAXUNITS]; - -/* - * Function prototypes - */ -static void omega_init P((void)); -static int omega_start P((int, struct peer *)); -static void omega_shutdown P((int, struct peer *)); -static void omega_report_event P((struct omegaunit *, int)); -static void omega_receive P((struct recvbuf *)); -static char omega_process P((struct omegaunit *, l_fp *, u_fp *)); -static void omega_poll P((int, struct peer *)); -static void omega_control P((int, struct refclockstat *, struct refclockstat *)); -static void omega_buginfo P((int, struct refclockbug *)); -static void omega_send P((struct omegaunit *, char *)); - -/* - * Transfer vector - */ -struct refclock refclock_omega = { - omega_start, omega_shutdown, omega_poll, - omega_control, omega_init, omega_buginfo, NOFLAGS -}; - -/* - * omega_init - initialize internal omega driver data - */ -static void -omega_init() -{ - register int i; - /* - * Just zero the data arrays - */ - memset((char *)omegaunits, 0, sizeof omegaunits); - memset((char *)unitinuse, 0, sizeof unitinuse); - - /* - * Initialize fudge factors to default. - */ - for (i = 0; i < MAXUNITS; i++) { - fudgefactor1[i].l_ui = 0; - fudgefactor1[i].l_uf = DEFFUDGETIME; - fudgefactor2[i].l_ui = 0; - fudgefactor2[i].l_uf = 0; - stratumtouse[i] = 0; - readonlyclockflag[i] = 0; - memcpy((char *)&refid[i], OMEGAREFID, 4); - } -} - - -/* - * omega_start - open the OMEGA devices and initialize data for processing - */ -static int -omega_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct omegaunit *omega; - register int i; - int fd232; - char omegadev[20]; - - /* - * Check configuration info - */ - if (unit >= MAXUNITS) { - syslog(LOG_ERR,"omega_start: unit %d invalid", unit); - return 0; - } - if (unitinuse[unit]) { - syslog(LOG_ERR, "omega_start: unit %d in use", unit); - return 0; - } - - /* - * Open serial port - */ - (void) sprintf(omegadev, OMEGA232, unit); - fd232 = open(omegadev, O_RDWR, 0777); - if (fd232 == -1) { - syslog(LOG_ERR, "omega_start: open of %s: %m", omegadev); - return 0; - } - -#if defined(HAVE_SYSV_TTYS) - /* - * System V serial line parameters (termio interface) - * - */ - { struct termio ttyb; - if (ioctl(fd232, TCGETA, &ttyb) < 0) { - syslog(LOG_ERR, - "omega_start: ioctl(%s, TCGETA): %m", omegadev); - goto screwed; - } - ttyb.c_iflag = IGNBRK|IGNPAR|ICRNL; - ttyb.c_oflag = 0; - ttyb.c_cflag = SPEED232|CS8|CLOCAL|CREAD; - ttyb.c_lflag = ICANON; - ttyb.c_cc[VERASE] = ttyb.c_cc[VKILL] = '\0'; - if (ioctl(fd232, TCSETA, &ttyb) < 0) { - syslog(LOG_ERR, - "omega_start: ioctl(%s, TCSETA): %m", omegadev); - goto screwed; - } - } -#endif /* HAVE_SYSV_TTYS */ -#if defined(HAVE_TERMIOS) - /* - * POSIX serial line parameters (termios interface) - * - * The OMEGACLK option provides timestamping at the driver level. - * It requires the tty_clk streams module. - * - * The OMEGAPPS option provides timestamping at the driver level. - * It uses a 1-pps signal and level converter (gadget box) and - * requires the ppsclock streams module and SunOS 4.1.1 or - * later. - */ - { struct termios ttyb, *ttyp; - - ttyp = &ttyb; - if (tcgetattr(fd232, ttyp) < 0) { - syslog(LOG_ERR, - "omega_start: tcgetattr(%s): %m", omegadev); - goto screwed; - } - ttyp->c_iflag = IGNBRK|IGNPAR|ICRNL; - ttyp->c_oflag = 0; - ttyp->c_cflag = SPEED232|CS8|CLOCAL|CREAD; - ttyp->c_lflag = ICANON; - ttyp->c_cc[VERASE] = ttyp->c_cc[VKILL] = '\0'; - if (tcsetattr(fd232, TCSANOW, ttyp) < 0) { - syslog(LOG_ERR, - "omega_start: tcsetattr(%s): %m", omegadev); - goto screwed; - } - if (tcflush(fd232, TCIOFLUSH) < 0) { - syslog(LOG_ERR, - "omega_start: tcflush(%s): %m", omegadev); - goto screwed; - } - } -#endif /* HAVE_TERMIOS */ -#ifdef STREAM -#if defined(OMEGACLK) - if (ioctl(fd232, I_PUSH, "clk") < 0) - syslog(LOG_ERR, - "omega_start: ioctl(%s, I_PUSH, clk): %m", omegadev); - if (ioctl(fd232, CLK_SETSTR, "\n") < 0) - syslog(LOG_ERR, - "omega_start: ioctl(%s, CLK_SETSTR): %m", omegadev); -#endif /* OMEGACLK */ -#if defined(OMEGAPPS) - if (ioctl(fd232, I_PUSH, "ppsclock") < 0) - syslog(LOG_ERR, - "omega_start: ioctl(%s, I_PUSH, ppsclock): %m", omegadev); - else - fdpps = fd232; -#endif /* OMEGAPPS */ -#endif /* STREAM */ -#if defined(HAVE_BSD_TTYS) - /* - * 4.3bsd serial line parameters (sgttyb interface) - * - * The OMEGACLK option provides timestamping at the driver level. - * It requires the tty_clk line discipline and 4.3bsd or later. - */ - { struct sgttyb ttyb; -#if defined(OMEGACLK) - int ldisc = CLKLDISC; -#endif /* OMEGACLK */ - - if (ioctl(fd232, TIOCGETP, &ttyb) < 0) { - syslog(LOG_ERR, - "omega_start: ioctl(%s, TIOCGETP): %m", omegadev); - goto screwed; - } - ttyb.sg_ispeed = ttyb.sg_ospeed = SPEED232; -#if defined(OMEGACLK) - ttyb.sg_erase = ttyb.sg_kill = '\r'; - ttyb.sg_flags = RAW; -#else - ttyb.sg_erase = ttyb.sg_kill = '\0'; - ttyb.sg_flags = EVENP|ODDP|CRMOD; -#endif /* OMEGACLK */ - if (ioctl(fd232, TIOCSETP, &ttyb) < 0) { - syslog(LOG_ERR, - "omega_start: ioctl(%s, TIOCSETP): %m", omegadev); - goto screwed; - } -#if defined(OMEGACLK) - if (ioctl(fd232, TIOCSETD, &ldisc) < 0) { - syslog(LOG_ERR, - "omega_start: ioctl(%s, TIOCSETD): %m",omegadev); - goto screwed; - } -#endif /* OMEGACLK */ - } -#endif /* HAVE_BSD_TTYS */ - - /* - * Allocate unit structure - */ - if (omegaunits[unit] != 0) { - omega = omegaunits[unit]; /* The one we want is okay */ - } else { - for (i = 0; i < MAXUNITS; i++) { - if (!unitinuse[i] && omegaunits[i] != 0) - break; - } - if (i < MAXUNITS) { - /* - * Reclaim this one - */ - omega = omegaunits[i]; - omegaunits[i] = 0; - } else { - omega = (struct omegaunit *) - emalloc(sizeof(struct omegaunit)); - } - } - memset((char *)omega, 0, sizeof(struct omegaunit)); - omegaunits[unit] = omega; - - /* - * Set up the structures - */ - omega->peer = peer; - omega->unit = (u_char)unit; - omega->timestarted = current_time; - omega->station = STATION_NONE; - - omega->io.clock_recv = omega_receive; - omega->io.srcclock = (caddr_t)omega; - omega->io.datalen = 0; - omega->io.fd = fd232; - if (!io_addclock(&omega->io)) { - goto screwed; - } - - /* - * All done. Initialize a few random peer variables, then - * return success. - */ - peer->precision = OMEGAPRECISION; - peer->rootdelay = 0; - peer->rootdispersion = 0; - peer->stratum = stratumtouse[unit]; - peer->refid = refid[unit]; - unitinuse[unit] = 1; - return 1; - - /* - * Something broke; abandon ship - */ -screwed: - (void) close(fd232); - return 0; -} - - -/* - * omega_shutdown - shut down a OMEGA clock - */ -static void -omega_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct omegaunit *omega; - - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "omega_shutdown: unit %d invalid", - unit); - return; - } - if (!unitinuse[unit]) { - syslog(LOG_ERR, "omega_shutdown: unit %d not in use", unit); - return; - } - - /* - * Tell the I/O module to turn us off. We're history. - */ - omega = omegaunits[unit]; - io_closeclock(&omega->io); - unitinuse[unit] = 0; -} - - -/* - * omega_report_event - note the occurance of an event - */ -static void -omega_report_event(omega, code) - struct omegaunit *omega; - int code; -{ - struct peer *peer; - - peer = omega->peer; - if (omega->status != (u_char)code) { - omega->status = (u_char)code; - if (code != CEVNT_NOMINAL) - omega->lastevent = (u_char)code; - syslog(LOG_INFO, - "omega clock %s event %x\n", ntoa(&peer->srcadr), code); - } -} - - -/* - * omega_receive - receive data from the serial interface on a - * Kinemetrics OM-DC OMEGA clock. - */ -static void -omega_receive(rbufp) - struct recvbuf *rbufp; -{ - register int i; - register struct omegaunit *omega; - register u_char *dpt; - register char *cp, *cpend; - register u_char *dpend; - l_fp tstmp; - u_fp dispersion, drift; - - /* - * Get the clock this applies to and a pointers to the data - */ - omega = (struct omegaunit *)rbufp->recv_srcclock; - dpt = (u_char *)&rbufp->recv_space; - -#ifndef PEDANTIC - /* - * The OM-DC outputs a timecode every second, but we only want - * a set of NSTAMPS timecodes when polled (every 64 seconds). - * Setting PEDANTIC causes a sanity check on every timecode. - */ - if (!omega->polled) - return; -#endif - - /* - * Edit timecode to remove control chars - */ - dpend = dpt + rbufp->recv_length; - cp = omega->lastcode; - cpend = omega->lastcode + BMAX - 1; - while (dpt < dpend && cp < cpend) { - if ((*cp = 0x7f & *dpt++) >= ' ') cp++; -#ifdef OMEGACLK - else if (*cp == '\r') { - if (dpend - dpt < 8) { - /* short timestamp */ - return; - } - if (!buftvtots(dpt,&omega->lastrec)) { - /* screwy timestamp */ - return; - } - dpt += 8; - } -#endif - } - *cp = '\0'; - omega->lencode = cp - omega->lastcode; - - if (omega->lencode == 0) - return; - else if (omega->lencode != LENOMEGA) { - omega->badformat++; - /* Sometimes get a lot of these, filling the log with noise */ - /* omega_report_event(omega, CEVNT_BADREPLY); */ - return; - } - -#ifndef OMEGACLK - omega->lastrec = rbufp->recv_time; -#endif - -#ifdef DEBUG - if (debug) - printf("omega: timecode %d %s\n", - omega->lencode, omega->lastcode); -#endif - - /* - * We get down to business, check the timecode format - * and decode its contents. - */ - cp = omega->lastcode; - omega->leap = 0; - /* - * Check timecode format. - */ - if (!isdigit(cp[0]) || /* day of year */ - !isdigit(cp[1]) || - !isdigit(cp[2]) || - cp[3] != ':' || /* <sp> */ - !isdigit(cp[4]) || /* hours */ - !isdigit(cp[5]) || - cp[6] != ':' || /* : separator */ - !isdigit(cp[7]) || /* minutes */ - !isdigit(cp[8]) || - cp[9] != ':' || /* : separator */ - !isdigit(cp[10]) || /* seconds */ - !isdigit(cp[11])) { - omega->badformat++; - omega_report_event(omega, CEVNT_BADREPLY); - return; - } - - /* - * Convert and check values. - */ - omega->year = 0; /* fake */ - omega->day = cp[0] - '0'; - omega->day = MULBY10(omega->day) + cp[1] - '0'; - omega->day = MULBY10(omega->day) + cp[2] - '0'; - omega->hour = MULBY10(cp[4] - '0') + cp[5] - '0'; - omega->minute = MULBY10(cp[7] - '0') + cp[8] - '0'; - omega->second = MULBY10(cp[10] - '0') + cp[11] - '0'; - omega->msec = 0; - - if (omega->day < 1 || omega->day > 366) { - omega->baddata++; - omega_report_event(omega, CEVNT_BADDATE); - return; - } - if (omega->hour > 23 || omega->minute > 59 || omega->second > 59) { - omega->baddata++; - omega_report_event(omega, CEVNT_BADTIME); - return; - } - - /* - * Check quality/station-id flag. The OM-DC should normally stay - * permanently locked to a station, and its time error should be less - * than 1 msec. If it loses lock for any reason, it makes a worst - * case drift estimate based on the internally stored stability figure - * for its reference oscillator. The stability figure can be adjusted - * by the user based on experience. The default value is 1E05, which - * is pretty bad - 2E07 is about right for the unit I have. - * - * The following is arbitrary, change it if you're offended: - * For errors less than 50 msec, just clear the station indicator. - * For errors greater than 50 msec, flag loss of sync and report a - * propagation problem. If the error is greater than 500 msec, - * something is dreadfully wrong - report a clock fault. - * - * In each case, we set a drift estimate which is used below as an - * estimate of measurement accuracy. - */ - omega->quality = cp[12]; - if (cp[12] == '>' || cp[12] == '?') { - /* Error 500 to 5000 msec */ - omega_report_event(omega, CEVNT_FAULT); - omega->leap = LEAP_NOTINSYNC; - omega->station = STATION_NONE; - drift = U_FP5000MS; - } else if (cp[12] == '#') { - /* Error 50 to 500 msec */ - omega_report_event(omega, CEVNT_PROP); - omega->leap = LEAP_NOTINSYNC; - omega->station = STATION_NONE; - drift = U_FP500MS; - } else if (cp[12] == '*') { - /* Error 5 to 50 msec */ - omega->lasttime = current_time; - omega->station = STATION_NONE; - drift = U_FP50MS; - } else if (cp[12] == '.') { - /* Error 1 to 5 msec */ - omega->lasttime = current_time; - omega->station = STATION_NONE; - drift = U_FP5MS; - } else if ('A' <= cp[12] && cp[12] <= 'H') { - /* Error less than 1 msec */ - omega->lasttime = current_time; - omega->station = cp[12] - 'A' + 1; - drift = 0; - } else { - omega->badformat++; - omega_report_event(omega, CEVNT_BADREPLY); - return; - } - -#ifdef PEDANTIC - /* If we haven't been polled, bail out. */ - if (!omega->polled) - return; -#endif - - /* - * Now, compute the reference time value. Use the heavy - * machinery for the seconds and the millisecond field for the - * fraction when present. - * - * this code does not yet know how to do the years - */ - tstmp = omega->lastrec; - if (!clocktime(omega->day, omega->hour, omega->minute, - omega->second, GMT, tstmp.l_ui, - &omega->yearstart, &omega->lastref.l_ui)) { - omega->baddata++; - omega_report_event(omega, CEVNT_BADTIME); - return; - } - MSUTOTSF(omega->msec, omega->lastref.l_uf); - - /* - * Adjust the read value by fudgefactor1 to correct RS232 delays. - */ - L_ADD(&omega->lastref, &fudgefactor1[omega->unit]); - - /* Carousel of NSTAMPS offsets. */ - i = omega->coderecv % NSTAMPS; - omega->offset[i] = omega->lastref; - L_SUB(&omega->offset[i], &tstmp); - omega->coderecv++; - - /* If we don't yet have a full set, return. */ - if (omega->coderecv < NSTAMPS) - return; - - /* - * Filter the samples, add the fudge factor and pass the - * offset and dispersion along. We use lastrec as both the - * reference time and receive time in order to avoid being cute, - * like setting the reference time later than the receive time, - * which may cause a paranoid protocol module to chuck out the - * data. If the sample filter chokes because of excessive - * dispersion or whatever, get a new sample (omega->coderecv - * is still >= NSTAMPS) and try again. - */ - if (!omega_process(omega, &tstmp, &dispersion)) { - omega->baddata++; - omega_report_event(omega, CEVNT_BADTIME); - return; - } - - /* - * Add accumulated clock drift to the dispersion to get - * a (hopefully) meaningful measurement accuracy estimate. - */ - dispersion += drift; - refclock_receive(omega->peer, &tstmp, GMT, dispersion, - &omega->lastrec, &omega->lastrec, omega->leap); - - /* - * We have succeeded in answering the poll. If the clock - * is locked, we're nominal. - */ - omega->polled = 0; - omega->coderecv = 0; - if (omega->leap != LEAP_NOTINSYNC) - omega_report_event(omega, CEVNT_NOMINAL); -} - - -/* - * omega_send - time to send the clock a signal to cough up a time sample - */ -static void -omega_send(omega,cmd) - struct omegaunit *omega; - char *cmd; -{ - if (!readonlyclockflag[omega->unit]) { - /* - * Send a command to the clock. - */ - if (write(omega->io.fd, cmd, 1) != 1) { - syslog(LOG_ERR, "omega_send: unit %d: %m", omega->unit); - omega_report_event(omega, CEVNT_FAULT); - } - } -} - - -/* - * Compare two l_fp's, used with qsort() - */ -static int -omega_cmpl_fp(p1, p2) - register void *p1, *p2; -{ - - if (!L_ISGEQ((l_fp *)p1, (l_fp *)p2)) - return (-1); - if (L_ISEQU((l_fp *)p1, (l_fp *)p2)) - return (0); - return (1); -} - - -/* - * omega_process - process a pile of samples from the clock - */ -static char -omega_process(omega, offset, dispersion) - struct omegaunit *omega; - l_fp *offset; - u_fp *dispersion; -{ - register int i, n; - register U_LONG med_ui, med_uf, tmp_ui, tmp_uf; - l_fp off[NSTAMPS]; - u_fp disp; - - /* Copy in offsets and sort into ascending order */ - for (i = 0; i < NSTAMPS; i++) - off[i] = omega->offset[i]; - qsort((char *)off, NSTAMPS, sizeof(l_fp), omega_cmpl_fp); - /* - * Reject the furthest from the median until NSKEEP samples remain - */ - i = 0; - n = NSTAMPS; - while ((n - i) > NSKEEP) { - tmp_ui = off[n-1].l_ui; - tmp_uf = off[n-1].l_uf; - med_ui = off[(n+i)/2].l_ui; - med_uf = off[(n+i)/2].l_uf; - M_SUB(tmp_ui, tmp_uf, med_ui, med_uf); - M_SUB(med_ui, med_uf, off[i].l_ui, off[i].l_uf); - if (M_ISHIS(med_ui, med_uf, tmp_ui, tmp_uf)) { - /* reject low end */ - i++; - } else { - /* reject high end */ - n--; - } - } - - /* - * Compute the dispersion based on the difference between the - * extremes of the remaining offsets. If this is greater than - * the allowed sample set dispersion, bail out. Otherwise, - * return the median offset and the dispersion. - */ - tmp_ui = off[n-1].l_ui; - tmp_uf = off[n-1].l_uf; - M_SUB(tmp_ui, tmp_uf, off[i].l_ui, off[i].l_uf); - disp = MFPTOFP(tmp_ui, tmp_uf); - if (disp > OMEGAMAXDISPERSE) - return 0; - *offset = off[(n+1)/2]; - *dispersion = disp; - return 1; -} - - -/* - * omega_poll - called by the transmit procedure - */ -static void -omega_poll(unit, peer) - int unit; - struct peer *peer; -{ - struct omegaunit *omega; - - /* - * You don't need to poll this clock. It puts out timecodes - * once per second. If asked for a timestamp, take note. - * The next time a timecode comes in, it will be fed back. - */ - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "omega_poll: unit %d invalid", unit); - return; - } - if (!unitinuse[unit]) { - syslog(LOG_ERR, "omega_poll: unit %d not in use", unit); - return; - } - omega = omegaunits[unit]; - if ((current_time - omega->lasttime) > 150) { - omega->noreply++; - omega_report_event(omegaunits[unit], CEVNT_TIMEOUT); - } - - /* - * polled every 64 seconds. Ask OMEGA_RECEIVE to hand in a timestamp. - */ - omega->polled = 1; - omega->polls++; - /* - * Ensure the clock is running in the correct mode - on-second - * timestamps. - */ - omega_send(omega,"C"); -} - - -/* - * omega_control - set fudge factors, return statistics - */ -static void -omega_control(unit, in, out) - int unit; - struct refclockstat *in; - struct refclockstat *out; -{ - register struct omegaunit *omega; - - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "omega_control: unit %d invalid", unit); - return; - } - - if (in != 0) { - if (in->haveflags & CLK_HAVETIME1) - fudgefactor1[unit] = in->fudgetime1; - if (in->haveflags & CLK_HAVETIME2) - fudgefactor2[unit] = in->fudgetime2; - if (in->haveflags & CLK_HAVEVAL1) - stratumtouse[unit] = (u_char)(in->fudgeval1); - if (in->haveflags & CLK_HAVEVAL2) - refid[unit] = in->fudgeval2; - if (in->haveflags & CLK_HAVEFLAG1) - readonlyclockflag[unit] = in->flags & CLK_FLAG1; - if (unitinuse[unit]) { - struct peer *peer; - - peer = omegaunits[unit]->peer; - peer->stratum = stratumtouse[unit]; - peer->refid = refid[unit]; - } - } - - if (out != 0) { - out->type = REFCLK_OMEGA_TRUETIME; - out->haveflags = CLK_HAVETIME1 | CLK_HAVETIME2 | CLK_HAVEVAL1 | - CLK_HAVEVAL2| CLK_HAVEFLAG1; - out->clockdesc = OMEGADESCRIPTION; - out->fudgetime1 = fudgefactor1[unit]; - out->fudgetime2 = fudgefactor2[unit]; - out->fudgeval1 = (LONG)stratumtouse[unit]; - out->fudgeval2 = refid[unit]; - out->flags = readonlyclockflag[unit]; - if (unitinuse[unit]) { - omega = omegaunits[unit]; - out->flags |= omega->station << 1; - out->lencode = omega->lencode; - out->lastcode = omega->lastcode; - out->timereset = current_time - omega->timestarted; - out->polls = omega->polls; - out->noresponse = omega->noreply; - out->badformat = omega->badformat; - out->baddata = omega->baddata; - out->lastevent = omega->lastevent; - out->currentstatus = omega->status; - } - } -} - - -/* - * omega_buginfo - return clock dependent debugging info - */ -static void -omega_buginfo(unit, bug) - int unit; - register struct refclockbug *bug; -{ - register struct omegaunit *omega; - - if (unit >= MAXUNITS) { - syslog(LOG_ERR, "omega_buginfo: unit %d invalid", unit); - return; - } - - if (!unitinuse[unit]) - return; - omega = omegaunits[unit]; - - bug->nvalues = 11; - bug->ntimes = 5; - if (omega->lasttime != 0) - bug->values[0] = current_time - omega->lasttime; - else - bug->values[0] = 0; - bug->values[1] = (U_LONG)omega->reason; - bug->values[2] = (U_LONG)omega->year; - bug->values[3] = (U_LONG)omega->day; - bug->values[4] = (U_LONG)omega->hour; - bug->values[5] = (U_LONG)omega->minute; - bug->values[6] = (U_LONG)omega->second; - bug->values[7] = (U_LONG)omega->msec; - bug->values[8] = omega->noreply; - bug->values[9] = omega->yearstart; - bug->values[10] = omega->quality; - bug->stimes = 0x1c; - bug->times[0] = omega->lastref; - bug->times[1] = omega->lastrec; - bug->times[2] = omega->offset[0]; - bug->times[3] = omega->offset[1]; - bug->times[4] = omega->offset[2]; -} -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_parse.c b/usr.sbin/xntpd/xntpd/refclock_parse.c deleted file mode 100644 index 6f7683e947c9..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_parse.c +++ /dev/null @@ -1,3925 +0,0 @@ -#if defined(REFCLOCK) && (defined(PARSE) || defined(PARSEPPS)) -/* - * /src/NTP/REPOSITORY/v3/xntpd/refclock_parse.c,v 3.53 1994/03/25 13:07:39 kardel Exp - * - * refclock_parse.c,v 3.53 1994/03/25 13:07:39 kardel Exp - * - * generic reference clock driver for receivers - * - * Added support for the Boeder DCF77 receiver on FreeBSD - * by Vincenzo Capuano 1995/04/18. - * - * make use of a STREAMS module for input processing where - * available and configured. Currently the STREAMS module - * is only available for Suns running SunOS 4.x and SunOS5.x (new - careful!) - * - * Copyright (c) 1989,1990,1991,1992,1993,1994 - * Frank Kardel Friedrich-Alexander Universitaet Erlangen-Nuernberg - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -/* - * Defines: - * REFCLOCK && (PARSE||PARSEPPS) - * - enable this mess - * STREAM - allow for STREAMS modules - * ("parse", "ppsclocd", "ppsclock") - * PARSEPPS - provide PPS information to loopfilter (for - * backward compatibilty only) - * PPS - supply loopfilter with PPS samples (if configured) - * PPSPPS - notify loopfilter of PPS file descriptor - * - * FREEBSD_CONRAD - Make very cheap "Conrad DCF77 RS-232" gadget work - * with FreeBSD. - * BOEDER - Make cheap "Boeder DCF77 RS-232" receiver work - * with FreeBSD. - * TTY defines: - * HAVE_BSD_TTYS - currently unsupported - * HAVE_SYSV_TTYS - will use termio.h - * HAVE_TERMIOS - will use termios.h - * STREAM - will use streams and implies HAVE_TERMIOS - */ - -/* - * This driver currently provides the support for - * - Meinberg DCF77 receiver DCF77 PZF 535 (TCXO version) (DCF) - * - Meinberg DCF77 receiver DCF77 PZF 535 (OCXO version) (DCF) - * - Meinberg DCF77 receiver U/A 31 (DCF) - * - ELV DCF7000 (DCF) - * - Schmid clock (DCF) - * - Conrad DCF77 receiver module (DCF) - * - Boeder DCF77 receiver (DCF) - * - FAU DCF77 NTP receiver (TimeBrick) (DCF) - * - Meinberg GPS166 (GPS) - * - Trimble SV6 (TSIP and TAIP protocol) (GPS) - * - */ - -/* - * Meinberg receivers are connected via a 9600 baud serial line - * - * Receivers that do NOT support: - * - leap second indication - * DCF U/A 31 - * DCF PZF535 (stock version) - * - * so... - * - for PZF535 please ask for revision PZFUERL4.6 or higher - * (support for leap second and alternate antenna) - * - * The Meinberg GPS receiver also has a special NTP time stamp - * format. The firmware release is Uni-Erlangen. Only this - * firmware release is supported by xntp3. - * - * Meinberg generic receiver setup: - * output time code every second - * Baud rate 9600 7E2S - */ - -#include "ntpd.h" -#include "ntp_refclock.h" -#include "ntp_unixtime.h" -#include "ntp_control.h" - -#include <stdio.h> -#include <ctype.h> -#include <time.h> - -#include <sys/errno.h> -#ifdef FREEBSD_CONRAD -#include <sys/ioctl.h> -#endif -extern int errno; - -#if !defined(STREAM) && !defined(HAVE_SYSV_TTYS) && !defined(HAVE_BSD_TTYS) && !defined(HAVE_TERMIOS) -/* #error NEED TO DEFINE ONE OF "STREAM" or "HAVE_SYSV_TTYS" */ -NEED TO DEFINE ONE OF "STREAM", "HAVE_SYSV_TTYS" or "HAVE_TERMIOS" -#endif - -#ifdef STREAM -#include <sys/stream.h> -#include <sys/stropts.h> -#ifndef HAVE_TERMIOS -#define HAVE_TERMIOS -#endif -#endif - -#ifdef HAVE_TERMIOS -#include <termios.h> -#define TTY_GETATTR(_FD_, _ARG_) tcgetattr((_FD_), (_ARG_)) -#define TTY_SETATTR(_FD_, _ARG_) tcsetattr((_FD_), TCSANOW, (_ARG_)) -#undef HAVE_SYSV_TTYS -#endif - -#ifdef HAVE_SYSV_TTYS -#include <termio.h> -#define TTY_GETATTR(_FD_, _ARG_) ioctl((_FD_), TCGETA, (_ARG_)) -#define TTY_SETATTR(_FD_, _ARG_) ioctl((_FD_), TCSETAW, (_ARG_)) -#endif - -#ifdef HAVE_BSD_TTYS -/* #error CURRENTLY NO BSD TTY SUPPORT */ -CURRENTLY NO BSD TTY SUPPORT -#endif - -#if !defined(O_RDWR) /* XXX SOLARIS */ -#include <fcntl.h> -#endif /* !def(O_RDWR) */ - -#ifdef PPSPPS -#include <sys/ppsclock.h> -#endif - -#include "ntp_select.h" -#include "ntp_stdlib.h" - -#include "parse.h" - -#if !defined(NO_SCCSID) && !defined(lint) && !defined(__GNUC__) -static char rcsid[]="refclock_parse.c,v 3.53 1994/03/25 13:07:39 kardel Exp"; -#endif - -/**=========================================================================== - ** external interface to xntp mechanism - **/ - -static void parse_init P((void)); -static int parse_start P((int, struct peer *)); -static void parse_shutdown P((int, struct peer *)); -static void parse_poll P((int, struct peer *)); -static void parse_control P((int, struct refclockstat *, struct refclockstat *)); - -#define parse_buginfo noentry - -struct refclock refclock_parse = { - parse_start, - parse_shutdown, - parse_poll, - parse_control, - parse_init, - parse_buginfo, - NOFLAGS -}; - -/* - * the unit field selects for one the prototype to be used (lower 4 bits) - * and for the other the clock type in case of different but similar - * receivers (bits 4-6) - * the most significant bit encodes PPS support - * when the most significant bit is set the pps telegrams will be used - * for controlling the local clock (ntp_loopfilter.c) - * receiver specific configration data is kept in the clockinfo field. - */ - -/* - * Definitions - */ -#define MAXUNITS 4 /* maximum number of "PARSE" units permitted */ -#define PARSEDEVICE "/dev/refclock-%d" /* device to open %d is unit number */ - -/**=========================================================================== - ** function vector for dynamically binding io handling mechanism - **/ - -typedef struct bind -{ - char *bd_description; /* name of type of binding */ - int (*bd_init)(); /* initialize */ - void (*bd_end)(); /* end */ - int (*bd_setcs)(); /* set character size */ - int (*bd_disable)(); /* disable */ - int (*bd_enable)(); /* enable */ - int (*bd_getfmt)(); /* get format */ - int (*bd_setfmt)(); /* setfmt */ - int (*bd_getstat)(); /* getstat */ - int (*bd_setstat)(); /* setstat */ - int (*bd_timecode)(); /* get time code */ - void (*bd_receive)(); /* receive operation */ - void (*bd_poll)(); /* poll operation */ -} bind_t; - -#define PARSE_END(_X_) (*(_X_)->binding->bd_end)(_X_) -#define PARSE_SETCS(_X_, _CS_) (*(_X_)->binding->bd_setcs)(_X_, _CS_) -#define PARSE_ENABLE(_X_) (*(_X_)->binding->bd_enable)(_X_) -#define PARSE_DISABLE(_X_) (*(_X_)->binding->bd_disable)(_X_) -#define PARSE_GETFMT(_X_, _DCT_) (*(_X_)->binding->bd_getfmt)(_X_, _DCT_) -#define PARSE_SETFMT(_X_, _DCT_) (*(_X_)->binding->bd_setfmt)(_X_, _DCT_) -#define PARSE_GETSTAT(_X_, _DCT_) (*(_X_)->binding->bd_getstat)(_X_, _DCT_) -#define PARSE_SETSTAT(_X_, _DCT_) (*(_X_)->binding->bd_setstat)(_X_, _DCT_) -#define PARSE_GETTIMECODE(_X_, _DCT_) (*(_X_)->binding->bd_timecode)(_X_, _DCT_) -#define PARSE_POLL(_X_) (*(_X_)->binding->bd_poll)(_X_) - -/* - * io modes - */ -#define PARSE_F_NOPOLLONLY 0x0001 /* always do async io (possible PPS support via PARSE) */ -#define PARSE_F_POLLONLY 0x0002 /* never do async io (no PPS support via PARSE) */ -#define PARSE_F_PPSPPS 0x0004 /* use loopfilter PPS code (CIOGETEV) */ -#define PARSE_F_PPSONSECOND 0x0008 /* PPS pulses are on second */ - -/**=========================================================================== - ** refclock instance data - **/ - -struct parseunit -{ - /* - * XNTP management - */ - struct peer *peer; /* backlink to peer structure - refclock inactive if 0 */ - int fd; /* device file descriptor */ - u_char unit; /* encoded unit/type/PPS */ - - /* - * XNTP io - */ - struct refclockio io; /* io system structure (used in PPS mode) */ - bind_t *binding; /* io handling binding */ - - /* - * parse state - */ - parse_t parseio; /* io handling structure (user level parsing) */ - - /* - * type specific parameters - */ - struct my_clockinfo *parse_type; /* link to clock description */ - - /* - * clock specific configuration - */ - l_fp basedelay; /* clock local phase offset */ - l_fp ppsdelay; /* clock local pps phase offset */ - - /* - * clock state handling/reporting - */ - u_char flags; /* flags (leap_control) */ - u_char status; /* current status */ - u_char lastevent; /* last not NORMAL status */ - U_LONG lastchange; /* time (xntp) when last state change accured */ - U_LONG statetime[CEVNT_MAX+1]; /* accumulated time of clock states */ - struct event stattimer; /* statistics timer */ - U_LONG polls; /* polls from NTP protocol machine */ - U_LONG noresponse; /* number of expected but not seen datagrams */ - U_LONG badformat; /* bad format (failed format conversions) */ - U_LONG baddata; /* usually bad receive length, bad format */ - - u_char pollonly; /* 1 for polling only (no PPS mode) */ - u_char pollneeddata; /* 1 for receive sample expected in PPS mode */ - U_LONG laststatus; /* last packet status (error indication) */ - u_short lastformat; /* last format used */ - U_LONG lastsync; /* time (xntp) when clock was last seen fully synchronized */ - U_LONG timestarted; /* time (xntp) when peer clock was instantiated */ - U_LONG nosynctime; /* time (xntp) when last nosync message was posted */ - U_LONG lastmissed; /* time (xntp) when poll didn't get data (powerup heuristic) */ - U_LONG ppsserial; /* magic cookie for ppsclock serials (avoids stale ppsclock data) */ - parsetime_t time; /* last (parse module) data */ - void *localdata; /* optional local data */ -}; - - -/**=========================================================================== - ** Clockinfo section all parameter for specific clock types - ** includes NTP paramaters, TTY parameters and IO handling parameters - **/ - -static void poll_dpoll P((struct parseunit *)); -static void poll_poll P((struct parseunit *)); -static int poll_init P((struct parseunit *)); -static void poll_end P((struct parseunit *)); - -typedef struct poll_info -{ - U_LONG rate; /* poll rate - once every "rate" seconds - 0 off */ - char * string; /* string to send for polling */ - U_LONG count; /* number of charcters in string */ -} poll_info_t; - -#define NO_FLAGS 0 -#define NO_POLL (void (*)())0 -#define NO_INIT (int (*)())0 -#define NO_END (void (*)())0 -#define NO_DATA (void *)0 -#define NO_FORMAT "" -#define NO_PPSDELAY 0 - -#define DCF_ID "DCF" /* generic DCF */ -#define DCF_A_ID "DCFa" /* AM demodulation */ -#define DCF_P_ID "DCFp" /* psuedo random phase shift */ -#define GPS_ID "GPS" /* GPS receiver */ - -#define NOCLOCK_ROOTDELAY 0x00000000 -#define NOCLOCK_BASEDELAY 0x00000000 -#define NOCLOCK_DESCRIPTION ((char *)0) -#define NOCLOCK_MAXUNSYNC 0 -#define NOCLOCK_CFLAG 0 -#define NOCLOCK_IFLAG 0 -#define NOCLOCK_OFLAG 0 -#define NOCLOCK_LFLAG 0 -#define NOCLOCK_ID "TILT" -#define NOCLOCK_POLL NO_POLL -#define NOCLOCK_INIT NO_INIT -#define NOCLOCK_END NO_END -#define NOCLOCK_DATA NO_DATA -#define NOCLOCK_FORMAT NO_FORMAT -#define NOCLOCK_TYPE CTL_SST_TS_UNSPEC - -#define DCF_TYPE CTL_SST_TS_LF -#define GPS_TYPE CTL_SST_TS_UHF - -/* - * receiver specific constants - */ -#define MBG_CFLAG19200 (B19200|CS7|PARENB|CREAD|HUPCL) -#define MBG_CFLAG (B9600|CS7|PARENB|CREAD|HUPCL) -#define MBG_IFLAG (IGNBRK|IGNPAR|ISTRIP) -#define MBG_OFLAG 0 -#define MBG_LFLAG 0 -/* - * Meinberg DCF U/A 31 (AM) receiver - */ -#define DCFUA31_ROOTDELAY 0x00000D00 /* 50.78125ms */ -#define DCFUA31_BASEDELAY 0x02C00000 /* 10.7421875ms: 10 ms (+/- 3 ms) */ -#define DCFUA31_DESCRIPTION "Meinberg DCF U/A 31" -#define DCFUA31_MAXUNSYNC 60*30 /* only trust clock for 1/2 hour */ -#define DCFUA31_CFLAG MBG_CFLAG -#define DCFUA31_IFLAG MBG_IFLAG -#define DCFUA31_OFLAG MBG_OFLAG -#define DCFUA31_LFLAG MBG_LFLAG - -/* - * Meinberg DCF PZF535/TCXO (FM/PZF) receiver - */ -#define DCFPZF535_ROOTDELAY 0x00000034 /* 800us */ -#define DCFPZF535_BASEDELAY 0x00800000 /* 1.968ms +- 104us (oscilloscope) - relative to start (end of STX) */ -#define DCFPZF535_DESCRIPTION "Meinberg DCF PZF 535/TCXO" -#define DCFPZF535_MAXUNSYNC 60*60*12 /* only trust clock for 12 hours - * @ 5e-8df/f we have accumulated - * at most 2.16 ms (thus we move to - * NTP synchronisation */ -#define DCFPZF535_CFLAG MBG_CFLAG -#define DCFPZF535_IFLAG MBG_IFLAG -#define DCFPZF535_OFLAG MBG_OFLAG -#define DCFPZF535_LFLAG MBG_LFLAG - - -/* - * Meinberg DCF PZF535/OCXO receiver - */ -#define DCFPZF535OCXO_ROOTDELAY 0x00000034 /* 800us (max error * 10) */ -#define DCFPZF535OCXO_BASEDELAY 0x00800000 /* 1.968ms +- 104us (oscilloscope) - relative to start (end of STX) */ -#define DCFPZF535OCXO_DESCRIPTION "Meinberg DCF PZF 535/OCXO" -#define DCFPZF535OCXO_MAXUNSYNC 60*60*96 /* only trust clock for 4 days - * @ 5e-9df/f we have accumulated - * at most an error of 1.73 ms - * (thus we move to NTP synchronisation) */ -#define DCFPZF535OCXO_CFLAG MBG_CFLAG -#define DCFPZF535OCXO_IFLAG MBG_IFLAG -#define DCFPZF535OCXO_OFLAG MBG_OFLAG -#define DCFPZF535OCXO_LFLAG MBG_LFLAG - -/* - * Meinberg GPS166 receiver - */ -#define GPS166_ROOTDELAY 0x00000000 /* nothing here */ -#define GPS166_BASEDELAY 0x00800000 /* XXX to be fixed ! 1.968ms +- 104us (oscilloscope) - relative to start (end of STX) */ -#define GPS166_DESCRIPTION "Meinberg GPS166 receiver" -#define GPS166_MAXUNSYNC 0 /* this clock is immediately lost */ -#define GPS166_CFLAG MBG_CFLAG -#define GPS166_IFLAG MBG_IFLAG -#define GPS166_OFLAG MBG_OFLAG -#define GPS166_LFLAG MBG_LFLAG -#define GPS166_POLL NO_POLL -#define GPS166_INIT NO_INIT -#define GPS166_END NO_END -#define GPS166_DATA NO_DATA -#define GPS166_ID GPS_ID -#define GPS166_FORMAT NO_FORMAT - -/* - * ELV DCF7000 Wallclock-Receiver/Switching Clock (Kit) - * - * This is really not the hottest clock - but before you have nothing ... - */ -#define DCF7000_ROOTDELAY 0x00000364 /* 13 ms */ -#define DCF7000_BASEDELAY 0x67AE0000 /* 405 ms - slow blow */ -#define DCF7000_DESCRIPTION "ELV DCF7000" -#define DCF7000_MAXUNSYNC (60*5) /* sorry - but it just was not build as a clock */ -#define DCF7000_CFLAG (B9600|CS8|CREAD|PARENB|PARODD|CLOCAL|HUPCL) -#define DCF7000_IFLAG (IGNBRK) -#define DCF7000_OFLAG 0 -#define DCF7000_LFLAG 0 - -/* - * Schmid DCF Receiver Kit - * - * When the WSDCF clock is operating optimally we want the primary clock - * distance to come out at 300 ms. Thus, peer.distance in the WSDCF peer - * structure is set to 290 ms and we compute delays which are at least - * 10 ms long. The following are 290 ms and 10 ms expressed in u_fp format - */ -#define WS_POLLRATE 1 /* every second - watch interdependency with poll routine */ -#define WS_POLLCMD "\163" -#define WS_CMDSIZE 1 - -static poll_info_t wsdcf_pollinfo = { WS_POLLRATE, WS_POLLCMD, WS_CMDSIZE }; - -#define WSDCF_INIT poll_init -#define WSDCF_POLL poll_dpoll -#define WSDCF_END poll_end -#define WSDCF_DATA ((void *)(&wsdcf_pollinfo)) -#define WSDCF_ROOTDELAY 0X00004A3D /* ~ 290ms */ -#define WSDCF_BASEDELAY 0x028F5C29 /* ~ 10ms */ -#define WSDCF_DESCRIPTION "WS/DCF Receiver" -#define WSDCF_FORMAT "Schmid" -#define WSDCF_MAXUNSYNC (60*60) /* assume this beast hold at 1 h better than 2 ms XXX-must verify */ -#define WSDCF_CFLAG (B1200|CS8|CREAD|CLOCAL) -#define WSDCF_IFLAG 0 -#define WSDCF_OFLAG 0 -#define WSDCF_LFLAG 0 - -/* - * RAW DCF77 - input of DCF marks via RS232 - many variants - */ -#define RAWDCF_FLAGS PARSE_F_NOPOLLONLY -#define RAWDCF_ROOTDELAY 0x00000364 /* 13 ms */ -#define RAWDCF_FORMAT "RAW DCF77 Timecode" -#define RAWDCF_MAXUNSYNC (0) /* sorry - its a true receiver - no signal - no time */ - -#if defined(FREEBSD_CONRAD) || (defined(SYS_FREEBSD) && defined(BOEDER)) -#define RAWDCF_CFLAG (CS8|CREAD|CLOCAL) -#else -#define RAWDCF_CFLAG (B50|CS8|CREAD|CLOCAL) -#endif -#define RAWDCF_IFLAG 0 -#define RAWDCF_OFLAG 0 -#define RAWDCF_LFLAG 0 - -/* - * RAW DCF variants - */ -/* - * Conrad receiver - * - * simplest (cheapest) DCF clock - e. g. DCF77 receiver by Conrad - * (~40DM - roughly $30 ) followed by a level converter for RS232 - */ -#define CONRAD_BASEDELAY 0x420C49B0 /* ~258 ms - Conrad receiver @ 50 Baud on a Sun */ -#define CONRAD_DESCRIPTION "RAW DCF77 CODE (Conrad DCF77 receiver module)" - -/* - * Boeder receiver - * - * simple (cheap) DCF clock - e. g. DCF77 receiver by Boeder - * followed by a level converter for RS232 - */ -#define BOEDER_BASEDELAY 0x420C49B0 /* ~258 ms - Conrad receiver @ 50 Baud */ -#define BOEDER_DESCRIPTION "RAW DCF77 CODE (BOEDER DCF77 receiver)" - -/* - * TimeBrick receiver - */ -#define TIMEBRICK_BASEDELAY 0x35C29000 /* ~210 ms - TimeBrick @ 50 Baud on a Sun */ -#define TIMEBRICK_DESCRIPTION "RAW DCF77 CODE (TimeBrick)" - -/* - * Trimble SV6 GPS receivers (TAIP and TSIP protocols) - */ -#define ETX 0x03 -#define DLE 0x10 - -#define TRIM_POLLRATE 0 /* only true direct polling */ - -#define TRIM_TAIPPOLLCMD ">QTM<" -#define TRIM_TAIPCMDSIZE 5 -static poll_info_t trimbletaip_pollinfo = { TRIM_POLLRATE, TRIM_TAIPPOLLCMD, TRIM_TAIPCMDSIZE }; -static int trimbletaip_init P((struct parseunit *)); - -/* query time & UTC correction data */ -static char tsipquery[] = { DLE, 0x21, DLE, ETX, DLE, 0x2F, DLE, ETX }; - -static poll_info_t trimbletsip_pollinfo = { TRIM_POLLRATE, tsipquery, sizeof(tsipquery) }; -static int trimbletsip_init P((struct parseunit *)); - -#define TRIMBLETAIP_CFLAG (B4800|CS8|CREAD) -#define TRIMBLETAIP_IFLAG (BRKINT|IGNPAR|ISTRIP|ICRNL|IXON) -#define TRIMBLETAIP_OFLAG (OPOST|ONLCR) -#define TRIMBLETAIP_LFLAG (ICANON|ECHOK) -#define TRIMBLETSIP_CFLAG (B9600|CS8|CLOCAL|CREAD|PARENB|PARODD) -#define TRIMBLETSIP_IFLAG (IGNBRK) -#define TRIMBLETSIP_OFLAG (0) -#define TRIMBLETSIP_LFLAG (0) - -#define TRIMBLETAIP_FLAGS (PARSE_F_PPSPPS|PARSE_F_PPSONSECOND) -#define TRIMBLETSIP_FLAGS (TRIMBLETAIP_FLAGS|PARSE_F_NOPOLLONLY) - -#define TRIMBLETAIP_POLL poll_dpoll -#define TRIMBLETSIP_POLL poll_dpoll - -#define TRIMBLETAIP_INIT trimbletaip_init -#define TRIMBLETSIP_INIT trimbletsip_init - -#define TRIMBLETAIP_END poll_end -#define TRIMBLETSIP_END poll_end - -#define TRIMBLETAIP_DATA ((void *)(&trimbletaip_pollinfo)) -#define TRIMBLETSIP_DATA ((void *)(&trimbletsip_pollinfo)) - -#define TRIMBLETAIP_ID GPS_ID -#define TRIMBLETSIP_ID GPS_ID - -#define TRIMBLETAIP_FORMAT NO_FORMAT -#define TRIMBLETSIP_FORMAT "Trimble SV6/TSIP" - -#define TRIMBLETAIP_ROOTDELAY 0x0 -#define TRIMBLETSIP_ROOTDELAY 0x0 - -#define TRIMBLETAIP_BASEDELAY 0x0 -#define TRIMBLETSIP_BASEDELAY 0x51EB852 /* 20 ms as a l_uf - avg GPS time message latency */ - -#define TRIMBLETAIP_DESCRIPTION "Trimble GPS (TAIP) receiver" -#define TRIMBLETSIP_DESCRIPTION "Trimble GPS (TSIP) receiver" - -#define TRIMBLETAIP_MAXUNSYNC 0 -#define TRIMBLETSIP_MAXUNSYNC 0 - -#define TRIMBLETAIP_EOL '<' - -static struct my_clockinfo -{ - U_LONG cl_flags; /* operation flags (io modes) */ - void (*cl_poll)(); /* active poll routine */ - int (*cl_init)(); /* active poll init routine */ - void (*cl_end)(); /* active poll end routine */ - void *cl_data; /* local data area for "poll" mechanism */ - u_fp cl_rootdelay; /* rootdelay */ - U_LONG cl_basedelay; /* current offset - unsigned l_fp fractional part */ - U_LONG cl_ppsdelay; /* current PPS offset - unsigned l_fp fractional part */ - char *cl_id; /* ID code (usually "DCF") */ - char *cl_description; /* device name */ - char *cl_format; /* fixed format */ - u_char cl_type; /* clock type (ntp control) */ - U_LONG cl_maxunsync; /* time to trust oscillator after loosing synch */ - U_LONG cl_cflag; /* terminal io flags */ - U_LONG cl_iflag; /* terminal io flags */ - U_LONG cl_oflag; /* terminal io flags */ - U_LONG cl_lflag; /* terminal io flags */ -} clockinfo[] = -{ /* 0. 0.0.128 - base offset for PPS support */ - { /* 127.127.8.<device> */ - NO_FLAGS, - NO_POLL, - NO_INIT, - NO_END, - NO_DATA, - DCFPZF535_ROOTDELAY, - DCFPZF535_BASEDELAY, - NO_PPSDELAY, - DCF_P_ID, - DCFPZF535_DESCRIPTION, - NO_FORMAT, - DCF_TYPE, - DCFPZF535_MAXUNSYNC, - DCFPZF535_CFLAG, - DCFPZF535_IFLAG, - DCFPZF535_OFLAG, - DCFPZF535_LFLAG - }, - { /* 127.127.8.4+<device> */ - NO_FLAGS, - NO_POLL, - NO_INIT, - NO_END, - NO_DATA, - DCFPZF535OCXO_ROOTDELAY, - DCFPZF535OCXO_BASEDELAY, - NO_PPSDELAY, - DCF_P_ID, - DCFPZF535OCXO_DESCRIPTION, - NO_FORMAT, - DCF_TYPE, - DCFPZF535OCXO_MAXUNSYNC, - DCFPZF535OCXO_CFLAG, - DCFPZF535OCXO_IFLAG, - DCFPZF535OCXO_OFLAG, - DCFPZF535OCXO_LFLAG - }, - { /* 127.127.8.8+<device> */ - NO_FLAGS, - NO_POLL, - NO_INIT, - NO_END, - NO_DATA, - DCFUA31_ROOTDELAY, - DCFUA31_BASEDELAY, - NO_PPSDELAY, - DCF_A_ID, - DCFUA31_DESCRIPTION, - NO_FORMAT, - DCF_TYPE, - DCFUA31_MAXUNSYNC, - DCFUA31_CFLAG, - DCFUA31_IFLAG, - DCFUA31_OFLAG, - DCFUA31_LFLAG - }, - { /* 127.127.8.12+<device> */ - NO_FLAGS, - NO_POLL, - NO_INIT, - NO_END, - NO_DATA, - DCF7000_ROOTDELAY, - DCF7000_BASEDELAY, - NO_PPSDELAY, - DCF_A_ID, - DCF7000_DESCRIPTION, - NO_FORMAT, - DCF_TYPE, - DCF7000_MAXUNSYNC, - DCF7000_CFLAG, - DCF7000_IFLAG, - DCF7000_OFLAG, - DCF7000_LFLAG - }, - { /* 127.127.8.16+<device> */ - NO_FLAGS, - WSDCF_POLL, - WSDCF_INIT, - WSDCF_END, - WSDCF_DATA, - WSDCF_ROOTDELAY, - WSDCF_BASEDELAY, - NO_PPSDELAY, - DCF_A_ID, - WSDCF_DESCRIPTION, - WSDCF_FORMAT, - DCF_TYPE, - WSDCF_MAXUNSYNC, - WSDCF_CFLAG, - WSDCF_IFLAG, - WSDCF_OFLAG, - WSDCF_LFLAG - }, - { /* 127.127.8.20+<device> */ - RAWDCF_FLAGS, - NO_POLL, - NO_INIT, - NO_END, - NO_DATA, - RAWDCF_ROOTDELAY, - CONRAD_BASEDELAY, - NO_PPSDELAY, - DCF_A_ID, - CONRAD_DESCRIPTION, - RAWDCF_FORMAT, - DCF_TYPE, - RAWDCF_MAXUNSYNC, - RAWDCF_CFLAG, - RAWDCF_IFLAG, - RAWDCF_OFLAG, - RAWDCF_LFLAG - }, - { /* 127.127.8.24+<device> */ - RAWDCF_FLAGS, - NO_POLL, - NO_INIT, - NO_END, - NO_DATA, - RAWDCF_ROOTDELAY, - TIMEBRICK_BASEDELAY, - NO_PPSDELAY, - DCF_A_ID, - TIMEBRICK_DESCRIPTION, - RAWDCF_FORMAT, - DCF_TYPE, - RAWDCF_MAXUNSYNC, - RAWDCF_CFLAG, - RAWDCF_IFLAG, - RAWDCF_OFLAG, - RAWDCF_LFLAG - }, - { /* 127.127.8.28+<device> */ - NO_FLAGS, - GPS166_POLL, - GPS166_INIT, - GPS166_END, - GPS166_DATA, - GPS166_ROOTDELAY, - GPS166_BASEDELAY, - NO_PPSDELAY, - GPS166_ID, - GPS166_DESCRIPTION, - GPS166_FORMAT, - GPS_TYPE, - GPS166_MAXUNSYNC, - GPS166_CFLAG, - GPS166_IFLAG, - GPS166_OFLAG, - GPS166_LFLAG - }, - { /* 127.127.8.32+<device> */ - TRIMBLETAIP_FLAGS, - TRIMBLETAIP_POLL, - TRIMBLETAIP_INIT, - TRIMBLETAIP_END, - TRIMBLETAIP_DATA, - TRIMBLETAIP_ROOTDELAY, - TRIMBLETAIP_BASEDELAY, - NO_PPSDELAY, - TRIMBLETAIP_ID, - TRIMBLETAIP_DESCRIPTION, - TRIMBLETAIP_FORMAT, - GPS_TYPE, - TRIMBLETAIP_MAXUNSYNC, - TRIMBLETAIP_CFLAG, - TRIMBLETAIP_IFLAG, - TRIMBLETAIP_OFLAG, - TRIMBLETAIP_LFLAG - }, - { /* 127.127.8.36+<device> */ - TRIMBLETSIP_FLAGS, - TRIMBLETSIP_POLL, - TRIMBLETSIP_INIT, - TRIMBLETSIP_END, - TRIMBLETSIP_DATA, - TRIMBLETSIP_ROOTDELAY, - TRIMBLETSIP_BASEDELAY, - NO_PPSDELAY, - TRIMBLETSIP_ID, - TRIMBLETSIP_DESCRIPTION, - TRIMBLETSIP_FORMAT, - GPS_TYPE, - TRIMBLETSIP_MAXUNSYNC, - TRIMBLETSIP_CFLAG, - TRIMBLETSIP_IFLAG, - TRIMBLETSIP_OFLAG, - TRIMBLETSIP_LFLAG - }, - { /* 127.127.8.40+<device> */ - RAWDCF_FLAGS, - NO_POLL, - NO_INIT, - NO_END, - NO_DATA, - RAWDCF_ROOTDELAY, - BOEDER_BASEDELAY, - NO_PPSDELAY, - DCF_A_ID, - BOEDER_DESCRIPTION, - RAWDCF_FORMAT, - DCF_TYPE, - RAWDCF_MAXUNSYNC, - RAWDCF_CFLAG, - RAWDCF_IFLAG, - RAWDCF_OFLAG, - RAWDCF_LFLAG - } -}; - -static int ncltypes = sizeof(clockinfo) / sizeof(struct my_clockinfo); - -#define CL_REALTYPE(x) (((x) >> 2) & 0x1F) -#define CL_TYPE(x) ((CL_REALTYPE(x) >= ncltypes) ? ~0 : CL_REALTYPE(x)) -#define CL_PPS(x) ((x) & 0x80) -#define CL_UNIT(x) ((x) & 0x3) - -/* - * Other constant stuff - */ -#define PARSEHSREFID 0x7f7f08ff /* 127.127.8.255 refid for hi strata */ - -#define PARSENOSYNCREPEAT (10*60) /* mention uninitialized clocks all 10 minutes */ -#define PARSESTATISTICS (60*60) /* output state statistics every hour */ - -static struct parseunit *parseunits[MAXUNITS]; - -extern U_LONG current_time; -extern s_char sys_precision; -extern struct event timerqueue[]; -#ifdef PPSPPS -extern int fdpps; -#endif - -static int notice = 0; - -#define PARSE_STATETIME(parse, i) ((parse->status == i) ? parse->statetime[i] + current_time - parse->lastchange : parse->statetime[i]) - -static void parse_event P((struct parseunit *, int)); -static void parse_process P((struct parseunit *, parsetime_t *)); - -/**=========================================================================== - ** implementation of i/o handling methods - ** (all STREAM, partial STREAM, user level) - **/ - -/* - * define possible io handling methods - */ -#ifdef STREAM -static int ppsclock_init P((struct parseunit *)); -static int stream_init P((struct parseunit *)); -static void stream_nop P((struct parseunit *)); -static int stream_enable P((struct parseunit *)); -static int stream_disable P((struct parseunit *)); -static int stream_setcs P((struct parseunit *, parsectl_t *)); -static int stream_getfmt P((struct parseunit *, parsectl_t *)); -static int stream_setfmt P((struct parseunit *, parsectl_t *)); -static int stream_getstat P((struct parseunit *, parsectl_t *)); -static int stream_setstat P((struct parseunit *, parsectl_t *)); -static int stream_timecode P((struct parseunit *, parsectl_t *)); -static void stream_receive P((struct recvbuf *)); -static void stream_poll P((struct parseunit *)); -#endif - -static int local_init P((struct parseunit *)); -static void local_end P((struct parseunit *)); -static int local_nop P((struct parseunit *)); -static int local_setcs P((struct parseunit *, parsectl_t *)); -static int local_getfmt P((struct parseunit *, parsectl_t *)); -static int local_setfmt P((struct parseunit *, parsectl_t *)); -static int local_getstat P((struct parseunit *, parsectl_t *)); -static int local_setstat P((struct parseunit *, parsectl_t *)); -static int local_timecode P((struct parseunit *, parsectl_t *)); -static void local_receive P((struct recvbuf *)); -static void local_poll P((struct parseunit *)); - -static bind_t io_bindings[] = -{ -#ifdef STREAM - { - "parse STREAM", - stream_init, - stream_nop, - stream_setcs, - stream_disable, - stream_enable, - stream_getfmt, - stream_setfmt, - stream_getstat, - stream_setstat, - stream_timecode, - stream_receive, - stream_poll - }, - { - "ppsclock STREAM", - ppsclock_init, - local_end, - local_setcs, - local_nop, - local_nop, - local_getfmt, - local_setfmt, - local_getstat, - local_setstat, - local_timecode, - local_receive, - local_poll - }, -#endif - { - "normal", - local_init, - local_end, - local_setcs, - local_nop, - local_nop, - local_getfmt, - local_setfmt, - local_getstat, - local_setstat, - local_timecode, - local_receive, - local_poll - }, - { - (char *)0, - } -}; - -#ifdef STREAM -/*-------------------------------------------------- - * ppsclock STREAM init - */ -static int -ppsclock_init(parse) - struct parseunit *parse; -{ - /* - * now push the parse streams module - * it will ensure exclusive access to the device - */ - if (ioctl(parse->fd, I_PUSH, (caddr_t)"ppsclocd") == -1 && - ioctl(parse->fd, I_PUSH, (caddr_t)"ppsclock") == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: ppsclock_init: ioctl(fd, I_PUSH, \"ppsclock\"): %m", - CL_UNIT(parse->unit)); - return 0; - } - if (!local_init(parse)) - { - (void)ioctl(parse->fd, I_POP, (caddr_t)0); - return 0; - } - - parse->flags |= PARSE_PPSCLOCK; - return 1; -} - -/*-------------------------------------------------- - * parse STREAM init - */ -static int -stream_init(parse) - struct parseunit *parse; -{ - /* - * now push the parse streams module - * to test whether it is there (Oh boy - neat kernel interface) - */ - if (ioctl(parse->fd, I_PUSH, (caddr_t)"parse") == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: stream_init: ioctl(fd, I_PUSH, \"parse\"): %m", CL_UNIT(parse->unit)); - return 0; - } - else - { - while(ioctl(parse->fd, I_POP, (caddr_t)0) == 0) - /* empty loop */; - - /* - * now push it a second time after we have removed all - * module garbage - */ - if (ioctl(parse->fd, I_PUSH, (caddr_t)"parse") == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: stream_init: ioctl(fd, I_PUSH, \"parse\"): %m", CL_UNIT(parse->unit)); - return 0; - } - else - { - return 1; - } - } -} - - /*-------------------------------------------------- - * STREAM setcs - */ -static int -stream_setcs(parse, tcl) - struct parseunit *parse; - parsectl_t *tcl; -{ - struct strioctl strioc; - - strioc.ic_cmd = PARSEIOC_SETCS; - strioc.ic_timout = 0; - strioc.ic_dp = (char *)tcl; - strioc.ic_len = sizeof (*tcl); - - if (ioctl(parse->fd, I_STR, (caddr_t)&strioc) == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: stream_setcs: ioctl(fd, I_STR, PARSEIOC_SETCS): %m", CL_UNIT(parse->unit)); - return 0; - } - return 1; -} - -/*-------------------------------------------------- - * STREAM nop - */ -static void -stream_nop(parse) - struct parseunit *parse; -{ -} - -/*-------------------------------------------------- - * STREAM enable - */ -static int -stream_enable(parse) - struct parseunit *parse; -{ - struct strioctl strioc; - - strioc.ic_cmd = PARSEIOC_ENABLE; - strioc.ic_timout = 0; - strioc.ic_dp = (char *)0; - strioc.ic_len = 0; - - if (ioctl(parse->fd, I_STR, (caddr_t)&strioc) == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: stream_enable: ioctl(fd, I_STR, PARSEIOC_ENABLE): %m", CL_UNIT(parse->unit)); - return 0; - } - return 1; -} - -/*-------------------------------------------------- - * STREAM disable - */ -static int -stream_disable(parse) - struct parseunit *parse; -{ - struct strioctl strioc; - - strioc.ic_cmd = PARSEIOC_DISABLE; - strioc.ic_timout = 0; - strioc.ic_dp = (char *)0; - strioc.ic_len = 0; - - if (ioctl(parse->fd, I_STR, (caddr_t)&strioc) == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: stream_disable: ioctl(fd, I_STR, PARSEIOC_DISABLE): %m", CL_UNIT(parse->unit)); - return 0; - } - return 1; -} - -/*-------------------------------------------------- - * STREAM getfmt - */ -static int -stream_getfmt(parse, tcl) - struct parseunit *parse; - parsectl_t *tcl; -{ - struct strioctl strioc; - - strioc.ic_cmd = PARSEIOC_GETFMT; - strioc.ic_timout = 0; - strioc.ic_dp = (char *)tcl; - strioc.ic_len = sizeof (*tcl); - if (ioctl(parse->fd, I_STR, (caddr_t)&strioc) == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: ioctl(fd, I_STR, PARSEIOC_GETFMT): %m", CL_UNIT(parse->unit)); - return 0; - } - return 1; -} - -/*-------------------------------------------------- - * STREAM setfmt - */ -static int -stream_setfmt(parse, tcl) - struct parseunit *parse; - parsectl_t *tcl; -{ - struct strioctl strioc; - - strioc.ic_cmd = PARSEIOC_SETFMT; - strioc.ic_timout = 0; - strioc.ic_dp = (char *)tcl; - strioc.ic_len = sizeof (*tcl); - - if (ioctl(parse->fd, I_STR, (caddr_t)&strioc) == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: stream_setfmt: ioctl(fd, I_STR, PARSEIOC_SETFMT): %m", CL_UNIT(parse->unit)); - return 0; - } - return 1; -} - -/*-------------------------------------------------- - * STREAM getstat - */ -static int -stream_getstat(parse, tcl) - struct parseunit *parse; - parsectl_t *tcl; -{ - struct strioctl strioc; - - strioc.ic_cmd = PARSEIOC_GETSTAT; - strioc.ic_timout = 0; - strioc.ic_dp = (char *)tcl; - strioc.ic_len = sizeof (*tcl); - - if (ioctl(parse->fd, I_STR, (caddr_t)&strioc) == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: stream_getstat: ioctl(fd, I_STR, PARSEIOC_GETSTAT): %m", CL_UNIT(parse->unit)); - return 0; - } - return 1; -} - -/*-------------------------------------------------- - * STREAM setstat - */ -static int -stream_setstat(parse, tcl) - struct parseunit *parse; - parsectl_t *tcl; -{ - struct strioctl strioc; - - strioc.ic_cmd = PARSEIOC_SETSTAT; - strioc.ic_timout = 0; - strioc.ic_dp = (char *)tcl; - strioc.ic_len = sizeof (*tcl); - - if (ioctl(parse->fd, I_STR, (caddr_t)&strioc) == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: stream_setstat: ioctl(fd, I_STR, PARSEIOC_SETSTAT): %m", CL_UNIT(parse->unit)); - return 0; - } - return 1; -} - -/*-------------------------------------------------- - * STREAM timecode - */ -static int -stream_timecode(parse, tcl) - struct parseunit *parse; - parsectl_t *tcl; -{ - struct strioctl strioc; - - strioc.ic_cmd = PARSEIOC_TIMECODE; - strioc.ic_timout = 0; - strioc.ic_dp = (char *)tcl; - strioc.ic_len = sizeof (*tcl); - - if (ioctl(parse->fd, I_STR, (caddr_t)&strioc) == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_process: ioctl(fd, I_STR, PARSEIOC_TIMECODE): %m", CL_UNIT(parse->unit), parse->fd); - return 0; - } - return 1; -} - -/*-------------------------------------------------- - * STREAM receive - */ -static void -stream_receive(rbufp) - struct recvbuf *rbufp; -{ - struct parseunit *parse = (struct parseunit *)rbufp->recv_srcclock; - parsetime_t parsetime; - - if (rbufp->recv_length != sizeof(parsetime_t)) - { - syslog(LOG_ERR,"PARSE receiver #%d: parse_receive: bad size (got %d expected %d)", - CL_UNIT(parse->unit), rbufp->recv_length, sizeof(parsetime_t)); - parse->baddata++; - parse_event(parse, CEVNT_BADREPLY); - return; - } - memmove((caddr_t)&parsetime, - (caddr_t)&rbufp->recv_space, - sizeof(parsetime_t)); - - /* - * switch time stamp world - be sure to normalize small usec field - * errors. - */ - -#define fix_ts(_X_) \ - if ((&(_X_))->tv.tv_usec >= 1000000) \ - { \ - (&(_X_))->tv.tv_usec -= 1000000; \ - (&(_X_))->tv.tv_sec += 1; \ - } - -#define cvt_ts(_X_, _Y_) \ - { \ - l_fp ts; \ - \ - fix_ts((_X_)); \ - if (!buftvtots((const char *)&(&(_X_))->tv, &ts)) \ - { \ - syslog(LOG_ERR,"parse: stream_receive: timestamp conversion error (buftvtots) (%s) (%d.%06d) ", (_Y_), (&(_X_))->tv.tv_sec, (&(_X_))->tv.tv_usec);\ - return; \ - } \ - else \ - { \ - (&(_X_))->fp = ts; \ - } \ - } - - if (PARSE_TIMECODE(parsetime.parse_state)) - { - cvt_ts(parsetime.parse_time, "parse_time"); - cvt_ts(parsetime.parse_stime, "parse_stime"); - } - - if (PARSE_PPS(parsetime.parse_state)) - cvt_ts(parsetime.parse_ptime, "parse_ptime"); - - parse_process(parse, &parsetime); -} - -/*-------------------------------------------------- - * STREAM poll - */ -static void -stream_poll(parse) - struct parseunit *parse; -{ - register int fd, i, rtc; - fd_set fdmask; - struct timeval timeout, starttime, curtime, selecttime; - parsetime_t parsetime; - - /* - * now we do the following: - * - read the first packet from the parse module (OLD !!!) - * - read the second packet from the parse module (fresh) - * - compute values for xntp - */ - - FD_ZERO(&fdmask); - fd = parse->fd; - FD_SET(fd, &fdmask); - timeout.tv_sec = 0; - timeout.tv_usec = 500000; /* 0.5 sec */ - - if (parse->parse_type->cl_poll) - { - parse->parse_type->cl_poll(parse); - } - - if (GETTIMEOFDAY(&starttime, 0L) == -1) - { - syslog(LOG_ERR,"gettimeofday failed: %m"); - exit(1); - } - - selecttime = timeout; - - while ((rtc = select(fd + 1, &fdmask, 0, 0, &selecttime)) != 1) - { - /* no data from the radio clock */ - - if (rtc == -1) - { - if (errno == EINTR) - { - if (GETTIMEOFDAY(&curtime, 0L) == -1) - { - syslog(LOG_ERR,"gettimeofday failed: %m"); - exit(1); - } - selecttime.tv_sec = curtime.tv_sec - starttime.tv_sec; - if (curtime.tv_usec < starttime.tv_usec) - { - selecttime.tv_sec -= 1; - selecttime.tv_usec = 1000000 + curtime.tv_usec - starttime.tv_usec; - } - else - { - selecttime.tv_usec = curtime.tv_usec - starttime.tv_usec; - } - - - if (timercmp(&selecttime, &timeout, >)) - { - /* - * elapsed real time passed timeout value - consider it timed out - */ - break; - } - - /* - * calculate residual timeout value - */ - selecttime.tv_sec = timeout.tv_sec - selecttime.tv_sec; - - if (selecttime.tv_usec > timeout.tv_usec) - { - selecttime.tv_sec -= 1; - selecttime.tv_usec = 1000000 + timeout.tv_usec - selecttime.tv_usec; - } - else - { - selecttime.tv_usec = timeout.tv_usec - selecttime.tv_usec; - } - - FD_SET(fd, &fdmask); - continue; - } - else - { - syslog(LOG_WARNING, "PARSE receiver #%d: no data[old] from device (select() error: %m)", CL_UNIT(parse->unit)); - } - } - else - { - syslog(LOG_WARNING, "PARSE receiver #%d: no data[old] from device", CL_UNIT(parse->unit)); - } - parse->noresponse++; - parse->lastmissed = current_time; - parse_event(parse, CEVNT_TIMEOUT); - - return; - } - - while (((i = read(fd, (char *)&parsetime, sizeof(parsetime))) < sizeof(parsetime))) - { - /* bad packet */ - if ( i == -1) - { - if (errno == EINTR) - { - continue; - } - else - { - syslog(LOG_WARNING, "PARSE receiver #%d: bad read[old] from streams module (read() error: %m)", CL_UNIT(parse->unit), i, sizeof(parsetime)); - } - } - else - { - syslog(LOG_WARNING, "PARSE receiver #%d: bad read[old] from streams module (got %d bytes - expected %d bytes)", CL_UNIT(parse->unit), i, sizeof(parsetime)); - } - parse->baddata++; - parse_event(parse, CEVNT_BADREPLY); - - return; - } - - if (parse->parse_type->cl_poll) - { - parse->parse_type->cl_poll(parse); - } - - timeout.tv_sec = 1; - timeout.tv_usec = 500000; /* 1.500 sec */ - FD_ZERO(&fdmask); - FD_SET(fd, &fdmask); - - if (GETTIMEOFDAY(&starttime, 0L) == -1) - { - syslog(LOG_ERR,"gettimeofday failed: %m"); - exit(1); - } - - selecttime = timeout; - - while ((rtc = select(fd + 1, &fdmask, 0, 0, &selecttime)) != 1) - { - /* no data from the radio clock */ - - if (rtc == -1) - { - if (errno == EINTR) - { - if (GETTIMEOFDAY(&curtime, 0L) == -1) - { - syslog(LOG_ERR,"gettimeofday failed: %m"); - exit(1); - } - selecttime.tv_sec = curtime.tv_sec - starttime.tv_sec; - if (curtime.tv_usec < starttime.tv_usec) - { - selecttime.tv_sec -= 1; - selecttime.tv_usec = 1000000 + curtime.tv_usec - starttime.tv_usec; - } - else - { - selecttime.tv_usec = curtime.tv_usec - starttime.tv_usec; - } - - - if (timercmp(&selecttime, &timeout, >)) - { - /* - * elapsed real time passed timeout value - consider it timed out - */ - break; - } - - /* - * calculate residual timeout value - */ - selecttime.tv_sec = timeout.tv_sec - selecttime.tv_sec; - - if (selecttime.tv_usec > timeout.tv_usec) - { - selecttime.tv_sec -= 1; - selecttime.tv_usec = 1000000 + timeout.tv_usec - selecttime.tv_usec; - } - else - { - selecttime.tv_usec = timeout.tv_usec - selecttime.tv_usec; - } - - FD_SET(fd, &fdmask); - continue; - } - else - { - syslog(LOG_WARNING, "PARSE receiver #%d: no data[new] from device (select() error: %m)", CL_UNIT(parse->unit)); - } - } - else - { - syslog(LOG_WARNING, "PARSE receiver #%d: no data[new] from device", CL_UNIT(parse->unit)); - } - - /* - * we will return here iff we got a good old sample as this would - * be misinterpreted. bad samples are passed on to be logged into the - * state statistics - */ - if ((parsetime.parse_status & CVT_MASK) == CVT_OK) - { - parse->noresponse++; - parse->lastmissed = current_time; - parse_event(parse, CEVNT_TIMEOUT); - return; - } - } - - /* - * we get here either by a possible read() (rtc == 1 - while assertion) - * or by a timeout or a system call error. when a read() is possible we - * get the new data, otherwise we stick with the old - */ - if ((rtc == 1) && ((i = read(fd, (char *)&parsetime, sizeof(parsetime))) < sizeof(parsetime))) - { - /* bad packet */ - if ( i== -1) - { - syslog(LOG_WARNING, "PARSE receiver #%d: bad read[new] from streams module (read() error: %m)", CL_UNIT(parse->unit), i, sizeof(parsetime)); - } - else - { - syslog(LOG_WARNING, "PARSE receiver #%d: bad read[new] from streams module (got %d bytes - expected %d bytes)", CL_UNIT(parse->unit), i, sizeof(parsetime)); - } - parse->baddata++; - parse_event(parse, CEVNT_BADREPLY); - - return; - } - - /* - * process what we got - */ - parse_process(parse, &parsetime); -} -#endif - -/*-------------------------------------------------- - * local init - */ -static int -local_init(parse) - struct parseunit *parse; -{ - return parse_ioinit(&parse->parseio); -} - -/*-------------------------------------------------- - * local end - */ -static void -local_end(parse) - struct parseunit *parse; -{ - parse_ioend(&parse->parseio); -} - - -/*-------------------------------------------------- - * local nop - */ -static int -local_nop(parse) - struct parseunit *parse; -{ - return 1; -} - -/*-------------------------------------------------- - * local setcs - */ -static int -local_setcs(parse, tcl) - struct parseunit *parse; - parsectl_t *tcl; -{ - return parse_setcs(tcl, &parse->parseio); -} - -/*-------------------------------------------------- - * local getfmt - */ -static int -local_getfmt(parse, tcl) - struct parseunit *parse; - parsectl_t *tcl; -{ - return parse_getfmt(tcl, &parse->parseio); -} - -/*-------------------------------------------------- - * local setfmt - */ -static int -local_setfmt(parse, tcl) - struct parseunit *parse; - parsectl_t *tcl; -{ - return parse_setfmt(tcl, &parse->parseio); -} - -/*-------------------------------------------------- - * local getstat - */ -static int -local_getstat(parse, tcl) - struct parseunit *parse; - parsectl_t *tcl; -{ - return parse_getstat(tcl, &parse->parseio); -} - -/*-------------------------------------------------- - * local setstat - */ -static int -local_setstat(parse, tcl) - struct parseunit *parse; - parsectl_t *tcl; -{ - return parse_setstat(tcl, &parse->parseio); -} - -/*-------------------------------------------------- - * local timecode - */ -static int -local_timecode(parse, tcl) - struct parseunit *parse; - parsectl_t *tcl; -{ - return parse_timecode(tcl, &parse->parseio); -} - - -/*-------------------------------------------------- - * local receive - */ -static void -local_receive(rbufp) - struct recvbuf *rbufp; -{ - struct parseunit *parse = (struct parseunit *)rbufp->recv_srcclock; - register int count; - register char *s; -#ifdef FREEBSD_CONRAD - struct timeval foo; -#endif - - /* - * eat all characters, parsing then and feeding complete samples - */ - count = rbufp->recv_length; - s = rbufp->recv_buffer; -#ifdef FREEBSD_CONRAD - ioctl(parse->fd,TIOCTIMESTAMP,&foo); - TVTOTS(&foo, &rbufp->recv_time); - rbufp->recv_time.l_uf += TS_ROUNDBIT; - rbufp->recv_time.l_ui += JAN_1970; - rbufp->recv_time.l_uf &= TS_MASK; -#endif - - while (count--) - { - if (parse_ioread(&parse->parseio, *s++, (timestamp_t *)&rbufp->recv_time)) - { - /* - * got something good to eat - */ -#ifdef PPSPPS - if (!PARSE_PPS(parse->parseio.parse_dtime.parse_state) && - (parse->flags & PARSE_PPSCLOCK)) - { - l_fp ts; - struct ppsclockev ev; - - if (ioctl(parse->fd, CIOGETEV, (caddr_t)&ev) == 0) - { - if (ev.serial != parse->ppsserial) - { - /* - * add PPS time stamp if available via ppsclock module - * and not supplied already. - */ - if (!buftvtots((const char *)&ev.tv, &ts)) - { - syslog(LOG_ERR,"parse: local_receive: timestamp conversion error (buftvtots) (ppsclockev.tv)"); - } - else - { - parse->parseio.parse_dtime.parse_ptime.fp = ts; - parse->parseio.parse_dtime.parse_state |= PARSEB_PPS|PARSEB_S_PPS; - } - } - parse->ppsserial = ev.serial; - } - } -#endif - parse_process(parse, &parse->parseio.parse_dtime); - parse_iodone(&parse->parseio); - } - } -} - -/*-------------------------------------------------- - * local poll - */ -static void -local_poll(parse) - struct parseunit *parse; -{ - register int fd, i, rtc; - fd_set fdmask; - struct timeval timeout, starttime, curtime, selecttime; - static struct timeval null_time = { 0, 0}; - timestamp_t ts; - - FD_ZERO(&fdmask); - fd = parse->fd; - FD_SET(fd, &fdmask); - timeout.tv_sec = 1; - timeout.tv_usec = 500000; /* 1.5 sec */ - - if (parse->parse_type->cl_poll) - { - parse->parse_type->cl_poll(parse); - } - - if (GETTIMEOFDAY(&starttime, 0L) == -1) - { - syslog(LOG_ERR,"gettimeofday failed: %m"); - exit(1); - } - - selecttime = timeout; - - do - { - while ((rtc = select(fd + 1, &fdmask, 0, 0, &selecttime)) != 1) - { - /* no data from the radio clock */ - - if (rtc == -1) - { - if (errno == EINTR) - { - if (GETTIMEOFDAY(&curtime, 0L) == -1) - { - syslog(LOG_ERR,"gettimeofday failed: %m"); - exit(1); - } - selecttime.tv_sec = curtime.tv_sec - starttime.tv_sec; - if (curtime.tv_usec < starttime.tv_usec) - { - selecttime.tv_sec -= 1; - selecttime.tv_usec = 1000000 + curtime.tv_usec - starttime.tv_usec; - } - else - { - selecttime.tv_usec = curtime.tv_usec - starttime.tv_usec; - } - - - if (!timercmp(&selecttime, &timeout, >)) - { - /* - * calculate residual timeout value - */ - selecttime.tv_sec = timeout.tv_sec - selecttime.tv_sec; - - if (selecttime.tv_usec > timeout.tv_usec) - { - selecttime.tv_sec -= 1; - selecttime.tv_usec = 1000000 + timeout.tv_usec - selecttime.tv_usec; - } - else - { - selecttime.tv_usec = timeout.tv_usec - selecttime.tv_usec; - } - - FD_SET(fd, &fdmask); - continue; - } - } - else - { - syslog(LOG_WARNING, "PARSE receiver #%d: no data from device (select() error: %m)", CL_UNIT(parse->unit)); - } - } - else - { - syslog(LOG_WARNING, "PARSE receiver #%d: no data from device", CL_UNIT(parse->unit)); - } - - parse->noresponse++; - parse->lastmissed = current_time; - parse_event(parse, CEVNT_TIMEOUT); - - return; - } - - /* - * at least 1 character is available - gobble everthing up that is available - */ - do - { - char inbuf[256]; - - register char *s = inbuf; - - rtc = i = read(fd, inbuf, sizeof(inbuf)); - - get_systime(&ts.fp); - - while (i-- > 0) - { - if (parse_ioread(&parse->parseio, *s++, &ts)) - { - /* - * got something good to eat - */ - parse_process(parse, &parse->parseio.parse_dtime); - parse_iodone(&parse->parseio); - /* - * done if no more characters are available - */ - FD_SET(fd, &fdmask); - if ((i == 0) && - (select(fd + 1, &fdmask, 0, 0, &null_time) == 0)) - return; - } - } - FD_SET(fd, &fdmask); - } while ((rtc = select(fd + 1, &fdmask, 0, 0, &null_time)) == 1); - FD_SET(fd, &fdmask); - } while (1); -} - -/*-------------------------------------------------- - * init_iobinding - find and initialize lower layers - */ -static bind_t * -init_iobinding(parse) - struct parseunit *parse; -{ - register bind_t *b = io_bindings; - - while (b->bd_description != (char *)0) - { - if ((*b->bd_init)(parse)) - { - return b; - } - b++; - } - return (bind_t *)0; -} - -/**=========================================================================== - ** support routines - **/ - -/*-------------------------------------------------- - * convert a flag field to a string - */ -static char * -parsestate(state, buffer) - unsigned LONG state; - char *buffer; -{ - static struct bits - { - unsigned LONG bit; - char *name; - } flagstrings[] = - { - { PARSEB_ANNOUNCE, "DST SWITCH WARNING" }, - { PARSEB_POWERUP, "NOT SYNCHRONIZED" }, - { PARSEB_NOSYNC, "TIME CODE NOT CONFIRMED" }, - { PARSEB_DST, "DST" }, - { PARSEB_UTC, "UTC DISPLAY" }, - { PARSEB_LEAPADD, "LEAP ADD WARNING" }, - { PARSEB_LEAPDEL, "LEAP DELETE WARNING" }, - { PARSEB_LEAPSECOND, "LEAP SECOND" }, - { PARSEB_ALTERNATE,"ALTERNATE ANTENNA" }, - { PARSEB_TIMECODE, "TIME CODE" }, - { PARSEB_PPS, "PPS" }, - { PARSEB_POSITION, "POSITION" }, - { 0 } - }; - - static struct sbits - { - unsigned LONG bit; - char *name; - } sflagstrings[] = - { - { PARSEB_S_LEAP, "LEAP INDICATION" }, - { PARSEB_S_PPS, "PPS SIGNAL" }, - { PARSEB_S_ANTENNA, "ANTENNA" }, - { PARSEB_S_POSITION, "POSITION" }, - { 0 } - }; - int i; - - *buffer = '\0'; - - i = 0; - while (flagstrings[i].bit) - { - if (flagstrings[i].bit & state) - { - if (buffer[0]) - strcat(buffer, "; "); - strcat(buffer, flagstrings[i].name); - } - i++; - } - - if (state & (PARSEB_S_LEAP|PARSEB_S_ANTENNA|PARSEB_S_PPS|PARSEB_S_POSITION)) - { - register char *s, *t; - - if (buffer[0]) - strcat(buffer, "; "); - - strcat(buffer, "("); - - t = s = buffer + strlen(buffer); - - i = 0; - while (sflagstrings[i].bit) - { - if (sflagstrings[i].bit & state) - { - if (t != s) - { - strcpy(t, "; "); - t += 2; - } - - strcpy(t, sflagstrings[i].name); - t += strlen(t); - } - i++; - } - strcpy(t, ")"); - } - return buffer; -} - -/*-------------------------------------------------- - * convert a status flag field to a string - */ -static char * -parsestatus(state, buffer) - unsigned LONG state; - char *buffer; -{ - static struct bits - { - unsigned LONG bit; - char *name; - } flagstrings[] = - { - { CVT_OK, "CONVERSION SUCCESSFUL" }, - { CVT_NONE, "NO CONVERSION" }, - { CVT_FAIL, "CONVERSION FAILED" }, - { CVT_BADFMT, "ILLEGAL FORMAT" }, - { CVT_BADDATE, "DATE ILLEGAL" }, - { CVT_BADTIME, "TIME ILLEGAL" }, - { 0 } - }; - int i; - - *buffer = '\0'; - - i = 0; - while (flagstrings[i].bit) - { - if (flagstrings[i].bit & state) - { - if (buffer[0]) - strcat(buffer, "; "); - strcat(buffer, flagstrings[i].name); - } - i++; - } - - return buffer; -} - -/*-------------------------------------------------- - * convert a clock status flag field to a string - */ -static char * -clockstatus(state) - unsigned LONG state; -{ - static char buffer[20]; - static struct status - { - unsigned LONG value; - char *name; - } flagstrings[] = - { - { CEVNT_NOMINAL, "NOMINAL" }, - { CEVNT_TIMEOUT, "NO RESPONSE" }, - { CEVNT_BADREPLY,"BAD FORMAT" }, - { CEVNT_FAULT, "FAULT" }, - { CEVNT_PROP, "PROPAGATION DELAY" }, - { CEVNT_BADDATE, "ILLEGAL DATE" }, - { CEVNT_BADTIME, "ILLEGAL TIME" }, - { ~0 } - }; - int i; - - i = 0; - while (flagstrings[i].value != ~0) - { - if (flagstrings[i].value == state) - { - return flagstrings[i].name; - } - i++; - } - - sprintf(buffer, "unknown #%d", state); - - return buffer; -} - -/*-------------------------------------------------- - * mkascii - make a printable ascii string - * assumes (unless defined better) 7-bit ASCII - */ -#ifndef isprint -#define isprint(_X_) (((_X_) > 0x1F) && ((_X_) < 0x7F)) -#endif - -static char * -mkascii(buffer, blen, src, srclen) - register char *buffer; - register LONG blen; - register char *src; - register LONG srclen; -{ - register char *b = buffer; - register char *endb = (char *)0; - - if (blen < 4) - return (char *)0; /* don't bother with mini buffers */ - - endb = buffer + blen - 4; - - blen--; /* account for '\0' */ - - while (blen && srclen--) - { - if ((*src != '\\') && isprint(*src)) - { /* printables are easy... */ - *buffer++ = *src++; - blen--; - } - else - { - if (blen < 4) - { - while (blen--) - { - *buffer++ = '.'; - } - *buffer = '\0'; - return b; - } - else - { - if (*src == '\\') - { - strcpy(buffer,"\\\\"); - buffer += 2; - blen -= 2; - } - else - { - sprintf(buffer, "\\x%02x", *src++); - blen -= 4; - buffer += 4; - } - } - } - if (srclen && !blen && endb) /* overflow - set last chars to ... */ - strcpy(endb, "..."); - } - - *buffer = '\0'; - return b; -} - - -/*-------------------------------------------------- - * l_mktime - make representation of a relative time - */ -static char * -l_mktime(delta) - unsigned LONG delta; -{ - unsigned LONG tmp, m, s; - static char buffer[40]; - - buffer[0] = '\0'; - - if ((tmp = delta / (60*60*24)) != 0) - { - sprintf(buffer, "%dd+", tmp); - delta -= tmp * 60*60*24; - } - - s = delta % 60; - delta /= 60; - m = delta % 60; - delta /= 60; - - sprintf(buffer+strlen(buffer), "%02d:%02d:%02d", - delta, m, s); - - return buffer; -} - - -/*-------------------------------------------------- - * parse_statistics - list summary of clock states - */ -static void -parse_statistics(parse) - register struct parseunit *parse; -{ - register int i; - - syslog(LOG_INFO, "PARSE receiver #%d: running time: %s", - CL_UNIT(parse->unit), - l_mktime(current_time - parse->timestarted)); - - syslog(LOG_INFO, "PARSE receiver #%d: current status: %s", - CL_UNIT(parse->unit), - clockstatus(parse->status)); - - for (i = 0; i <= CEVNT_MAX; i++) - { - register unsigned LONG stime; - register unsigned LONG percent, div = current_time - parse->timestarted; - - percent = stime = PARSE_STATETIME(parse, i); - - while (((unsigned LONG)(~0) / 10000) < percent) - { - percent /= 10; - div /= 10; - } - - if (div) - percent = (percent * 10000) / div; - else - percent = 10000; - - if (stime) - syslog(LOG_INFO, "PARSE receiver #%d: state %18s: %13s (%3d.%02d%%)", - CL_UNIT(parse->unit), - clockstatus(i), - l_mktime(stime), - percent / 100, percent % 100); - } -} - -/*-------------------------------------------------- - * cparse_statistics - wrapper for statistics call - */ -static void -cparse_statistics(peer) - register struct peer *peer; -{ - register struct parseunit *parse = (struct parseunit *)peer; - - parse_statistics(parse); - parse->stattimer.event_time = current_time + PARSESTATISTICS; - TIMER_ENQUEUE(timerqueue, &parse->stattimer); -} - -/**=========================================================================== - ** xntp interface routines - **/ - -/*-------------------------------------------------- - * parse_init - initialize internal parse driver data - */ -static void -parse_init() -{ - memset((caddr_t)parseunits, 0, sizeof parseunits); -} - - -/*-------------------------------------------------- - * parse_shutdown - shut down a PARSE clock - */ -static void -parse_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct parseunit *parse; - - unit = CL_UNIT(unit); - - if (unit >= MAXUNITS) { - syslog(LOG_ERR, - "PARSE receiver #%d: parse_shutdown: INTERNAL ERROR, unit invalid (max %d)", - unit,MAXUNITS); - return; - } - - parse = parseunits[unit]; - - if (parse && !parse->peer) { - syslog(LOG_ERR, - "PARSE receiver #%d: parse_shutdown: INTERNAL ERROR, unit not in use", unit); - return; - } - - /* - * print statistics a last time and - * stop statistics machine - */ - parse_statistics(parse); - TIMER_DEQUEUE(&parse->stattimer); - -#if PPSPPS - { - /* - * kill possible PPS association - */ - if (fdpps == parse->fd) - fdpps = -1; - } -#endif - - if (parse->parse_type->cl_end) - { - parse->parse_type->cl_end(parse); - } - - if (parse->binding) - PARSE_END(parse); - - /* - * Tell the I/O module to turn us off. We're history. - */ - if (!parse->pollonly) - io_closeclock(&parse->io); - else - (void) close(parse->fd); - - syslog(LOG_INFO, "PARSE receiver #%d: reference clock \"%s\" removed", - CL_UNIT(parse->unit), parse->parse_type->cl_description); - - parse->peer = (struct peer *)0; /* unused now */ -} - -/*-------------------------------------------------- - * parse_start - open the PARSE devices and initialize data for processing - */ -static int -parse_start(sysunit, peer) - int sysunit; - struct peer *peer; -{ - u_int unit; - int fd232, i; -#ifdef HAVE_TERMIOS - struct termios tm; /* NEEDED FOR A LONG TIME ! */ -#endif -#ifdef HAVE_SYSV_TTYS - struct termio tm; /* NEEDED FOR A LONG TIME ! */ -#endif - struct parseunit * parse; - char parsedev[sizeof(PARSEDEVICE)+20]; - parsectl_t tmp_ctl; - u_int type; - - type = CL_TYPE(sysunit); - unit = CL_UNIT(sysunit); - - if (unit >= MAXUNITS) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_start: unit number invalid (max %d)", - unit, MAXUNITS-1); - return 0; - } - - if ((type == ~0) || (clockinfo[type].cl_description == (char *)0)) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_start: unsupported clock type %d (max %d)", - unit, CL_REALTYPE(sysunit), ncltypes-1); - return 0; - } - - if (parseunits[unit] && parseunits[unit]->peer) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_start: unit in use", unit); - return 0; - } - - /* - * Unit okay, attempt to open the device. - */ - (void) sprintf(parsedev, PARSEDEVICE, unit); - -#if defined(SYS_FREEBSD) && defined(BOEDER) - fd232 = open(parsedev, O_RDONLY | O_NONBLOCK, 0777); -#else -#ifndef O_NOCTTY -#define O_NOCTTY 0 -#endif - - fd232 = open(parsedev, O_RDWR|O_NOCTTY, 0777); -#endif - if (fd232 == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_start: open of %s failed: %m", unit, parsedev); - return 0; - } - - /* - * Looks like this might succeed. Find memory for the structure. - * Look to see if there are any unused ones, if not we malloc() - * one. - */ - if (parseunits[unit]) - { - parse = parseunits[unit]; /* The one we want is okay - and free */ - } - else - { - for (i = 0; i < MAXUNITS; i++) - { - if (parseunits[i] && !parseunits[i]->peer) - break; - } - if (i < MAXUNITS) - { - /* - * Reclaim this one - */ - parse = parseunits[i]; - parseunits[i] = (struct parseunit *)0; - } - else - { - parse = (struct parseunit *) - emalloc(sizeof(struct parseunit)); - } - } - - memset((char *)parse, 0, sizeof(struct parseunit)); - parseunits[unit] = parse; - - /* - * Set up the structures - */ - parse->unit = (u_char)sysunit; - parse->timestarted = current_time; - parse->lastchange = current_time; - /* - * we want to filter input for the sake of - * getting an impression on dispersion - * also we like to average the median range - */ - parse->flags = PARSE_STAT_FILTER|PARSE_STAT_AVG; - parse->pollneeddata = 0; - parse->pollonly = 1; /* go for default polling mode */ - parse->lastformat = ~0; /* assume no format known */ - parse->status = CEVNT_TIMEOUT; /* expect the worst */ - parse->laststatus = ~0; /* be sure to mark initial status change */ - parse->nosynctime = 0; /* assume clock reasonable */ - parse->lastmissed = 0; /* assume got everything */ - parse->ppsserial = 0; - parse->localdata = (void *)0; - - parse->parse_type = &clockinfo[type]; - - parse->basedelay.l_ui = 0; /* we can only pre-configure delays less than 1 second */ - parse->basedelay.l_uf = parse->parse_type->cl_basedelay; - - parse->ppsdelay.l_ui = 0; /* we can only pre-configure delays less than 1 second */ - parse->ppsdelay.l_uf = parse->parse_type->cl_ppsdelay; - - peer->rootdelay = parse->parse_type->cl_rootdelay; - peer->sstclktype = parse->parse_type->cl_type; - peer->precision = sys_precision; - peer->stratum = STRATUM_REFCLOCK; - if (peer->stratum <= 1) - memmove((char *)&peer->refid, parse->parse_type->cl_id, 4); - else - peer->refid = htonl(PARSEHSREFID); - - parse->fd = fd232; - - parse->peer = peer; /* marks it also as busy */ - - parse->binding = init_iobinding(parse); - - if (parse->binding == (bind_t *)0) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_start: io sub system initialisation failed."); - parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */ - return 0; /* well, ok - special initialisation broke */ - } - - /* - * configure terminal line - */ - if (TTY_GETATTR(fd232, &tm) == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_start: tcgetattr(%d, &tm): %m", unit, fd232); - parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */ - return 0; - } - else - { -#ifndef _PC_VDISABLE - memset((char *)tm.c_cc, 0, sizeof(tm.c_cc)); -#else - int disablec; - errno = 0; /* pathconf can deliver -1 without changing errno ! */ - - disablec = fpathconf(parse->fd, _PC_VDISABLE); - if (disablec == -1 && errno) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_start: fpathconf(fd, _PC_VDISABLE): %m", CL_UNIT(parse->unit)); - memset((char *)tm.c_cc, 0, sizeof(tm.c_cc)); /* best guess */ - } - else - if (disablec != -1) - memset((char *)tm.c_cc, disablec, sizeof(tm.c_cc)); -#endif - - tm.c_cflag = clockinfo[type].cl_cflag; - tm.c_iflag = clockinfo[type].cl_iflag; - tm.c_oflag = clockinfo[type].cl_oflag; - tm.c_lflag = clockinfo[type].cl_lflag; -#if defined(SYS_FREEBSD) && (defined(BOEDER) || defined(FREEBSD_CONRAD)) - if (cfsetspeed(&tm, B50) == -1) - { - syslog(LOG_ERR, - "PARSE receiver #%d: parse_start: cfsetspeed(&tm, B50): %m", - unit); - parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */ - return 0; - } -#endif - if (TTY_SETATTR(fd232, &tm) == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_start: tcsetattr(%d, &tm): %m", unit, fd232); - parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */ - return 0; - } - } - - /* - * as we always(?) get 8 bit chars we want to be - * sure, that the upper bits are zero for less - * than 8 bit I/O - so we pass that information on. - * note that there can be only one bit count format - * per file descriptor - */ - - switch (tm.c_cflag & CSIZE) - { - case CS5: - tmp_ctl.parsesetcs.parse_cs = PARSE_IO_CS5; - break; - - case CS6: - tmp_ctl.parsesetcs.parse_cs = PARSE_IO_CS6; - break; - - case CS7: - tmp_ctl.parsesetcs.parse_cs = PARSE_IO_CS7; - break; - - case CS8: - tmp_ctl.parsesetcs.parse_cs = PARSE_IO_CS8; - break; - } - - if (!PARSE_SETCS(parse, &tmp_ctl)) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_start: parse_setcs() FAILED.", unit); - parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */ - return 0; /* well, ok - special initialisation broke */ - } - -#ifdef FREEBSD_CONRAD - { - int i,j; - struct timeval tv; - ioctl(parse->fd,TIOCTIMESTAMP,&tv); - j = TIOCM_RTS; - i = ioctl(fd232, TIOCMBIC, &j); - if (i < 0) { - syslog(LOG_ERR, - "PARSE receiver #%d: lowrts_poll: failed to lower RTS: %m", - CL_UNIT(parse->unit)); - } - } -#endif -#if defined(SYS_FREEBSD) && defined(BOEDER) - if (fcntl(fd232, F_SETFL, fcntl(fd232, F_GETFL, 0) & ~O_NONBLOCK) == -1) - { - syslog(LOG_ERR, - "PARSE receiver #%d: parse_start: fcntl(%d, F_SETFL, ...): %m", - unit, fd232); - parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */ - return 0; - } - - if (ioctl(fd232, TIOCCDTR, 0) == -1) - { - syslog(LOG_ERR, - "PARSE receiver #%d: parse_start: ioctl(%d, TIOCCDTR, 0): %m", - unit, fd232); - parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */ - return 0; - } -#endif - - strcpy(tmp_ctl.parseformat.parse_buffer, parse->parse_type->cl_format); - tmp_ctl.parseformat.parse_count = strlen(tmp_ctl.parseformat.parse_buffer); - - if (!PARSE_SETFMT(parse, &tmp_ctl)) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_start: parse_setfmt() FAILED.", unit); - parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */ - return 0; /* well, ok - special initialisation broke */ - } - -#ifdef TCFLSH - /* - * get rid of all IO accumulated so far - */ - { -#ifndef TCIOFLUSH -#define TCIOFLUSH 2 -#endif - int flshcmd = TCIOFLUSH; - - (void) ioctl(parse->fd, TCFLSH, (caddr_t)&flshcmd); - } -#endif - - tmp_ctl.parsestatus.flags = parse->flags & PARSE_STAT_FLAGS; - - if (!PARSE_SETSTAT(parse, &tmp_ctl)) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_start: parse_setstat() FAILED.", unit); - parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */ - return 0; /* well, ok - special initialisation broke */ - } - - /* - * try to do any special initializations - */ - if (parse->parse_type->cl_init) - { - if (parse->parse_type->cl_init(parse)) - { - parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */ - return 0; /* well, ok - special initialisation broke */ - } - } - - if (!(parse->parse_type->cl_flags & PARSE_F_POLLONLY) && - (CL_PPS(parse->unit) || (parse->parse_type->cl_flags & PARSE_F_NOPOLLONLY))) - { - /* - * Insert in async io device list. - */ - parse->io.clock_recv = parse->binding->bd_receive; /* pick correct receive routine */ - parse->io.srcclock = (caddr_t)parse; - parse->io.datalen = 0; - parse->io.fd = parse->fd; /* replicated, but what the heck */ - if (!io_addclock(&parse->io)) - { - if (parse->parse_type->cl_flags & PARSE_F_NOPOLLONLY) - { - syslog(LOG_ERR, - "PARSE receiver #%d: parse_start: addclock %s fails (ABORT - clock type requires async io)", CL_UNIT(parse->unit), parsedev); - parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */ - return 0; - } - else - { - syslog(LOG_ERR, - "PARSE receiver #%d: parse_start: addclock %s fails (switching to polling mode)", CL_UNIT(parse->unit), parsedev); - } - } - else - { - parse->pollonly = 0; /* - * update at receipt of time_stamp - also - * supports PPS processing - */ - } - } - -#ifdef PPSPPS - if (parse->pollonly || (parse->parse_type->cl_flags & PARSE_F_PPSPPS)) - { - if (fdpps == -1) - { - fdpps = parse->fd; - if (!PARSE_DISABLE(parse)) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_start: parse_disable() FAILED", CL_UNIT(parse->unit)); - parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */ - return 0; - } - } - else - { - syslog(LOG_NOTICE, "PARSE receiver #%d: parse_start: loopfilter PPS already active - no PPS via CIOGETEV", CL_UNIT(parse->unit)); - } - } -#endif - - /* - * wind up statistics timer - */ - parse->stattimer.peer = (struct peer *)parse; /* we know better, but what the heck */ - parse->stattimer.event_handler = cparse_statistics; - parse->stattimer.event_time = current_time + PARSESTATISTICS; - TIMER_ENQUEUE(timerqueue, &parse->stattimer); - - /* - * get out Copyright information once - */ - if (!notice) - { - syslog(LOG_INFO, "NTP PARSE support: Copyright (c) 1989-1993, Frank Kardel"); - notice = 1; - } - - /* - * print out configuration - */ - syslog(LOG_INFO, "PARSE receiver #%d: reference clock \"%s\" (device %s) added", - CL_UNIT(parse->unit), - parse->parse_type->cl_description, parsedev); - - syslog(LOG_INFO, "PARSE receiver #%d: Stratum %d, %sPPS support, trust time %s, precision %d", - CL_UNIT(parse->unit), - parse->peer->stratum, (parse->pollonly || !CL_PPS(parse->unit)) ? "no " : "", - l_mktime(parse->parse_type->cl_maxunsync), parse->peer->precision); - - syslog(LOG_INFO, "PARSE receiver #%d: rootdelay %s s, phaseadjust %s s, %s IO handling", - CL_UNIT(parse->unit), - ufptoa(parse->parse_type->cl_rootdelay, 6), - lfptoa(&parse->basedelay, 8), - parse->binding->bd_description); - - syslog(LOG_INFO, "PARSE receiver #%d: Format recognition: %s", CL_UNIT(parse->unit), - !(*parse->parse_type->cl_format) ? "<AUTOMATIC>" : parse->parse_type->cl_format); - -#ifdef PPSPPS - syslog(LOG_INFO, "PARSE receiver #%d: %sCD PPS support", - CL_UNIT(parse->unit), - (fdpps == parse->fd) ? "" : "NO "); -#endif - - return 1; -} - -/*-------------------------------------------------- - * parse_poll - called by the transmit procedure - */ -static void -parse_poll(unit, peer) - int unit; - struct peer *peer; -{ - register struct parseunit *parse; - - unit = CL_UNIT(unit); - - if (unit >= MAXUNITS) - { - syslog(LOG_ERR, "PARSE receiver #%d: poll: INTERNAL: unit invalid", - unit); - return; - } - - parse = parseunits[unit]; - - if (!parse->peer) - { - syslog(LOG_ERR, "PARSE receiver #%d: poll: INTERNAL: unit unused", - unit); - return; - } - - if (peer != parse->peer) - { - syslog(LOG_ERR, - "PARSE receiver #%d: poll: INTERNAL: peer incorrect", - unit); - return; - } - - /* - * Update clock stat counters - */ - parse->polls++; - - /* - * in PPS mode we just mark that we want the next sample - * for the clock filter - */ - if (!parse->pollonly) - { - if (parse->pollneeddata) - { - /* - * bad news - didn't get a response last time - */ - parse->noresponse++; - parse->lastmissed = current_time; - parse_event(parse, CEVNT_TIMEOUT); - - syslog(LOG_WARNING, "PARSE receiver #%d: no data from device within poll interval", CL_UNIT(parse->unit)); - } - parse->pollneeddata = 1; - if (parse->parse_type->cl_poll) - { - parse->parse_type->cl_poll(parse); - } - return; - } - - /* - * the following code is only executed only when polling is used - */ - - PARSE_POLL(parse); -} - -/*-------------------------------------------------- - * parse_leap - called when a leap second occurs - */ - -static void -parse_leap() -{ - /* - * PARSE encodes the LEAP correction direction. - * For timecodes that do not pass on the leap correction direction - * the default PARSEB_LEAPADD must be used. It may then be modified - * with a fudge flag (flag2). - */ -} - - -/*-------------------------------------------------- - * parse_control - set fudge factors, return statistics - */ -static void -parse_control(unit, in, out) - int unit; - struct refclockstat *in; - struct refclockstat *out; -{ - register struct parseunit *parse; - parsectl_t tmpctl; - unsigned LONG type; - static char outstatus[400]; /* status output buffer */ - - type = CL_TYPE(unit); - unit = CL_UNIT(unit); - - if (out) - { - out->lencode = 0; - out->lastcode = 0; - out->polls = out->noresponse = 0; - out->badformat = out->baddata = 0; - out->timereset = 0; - out->currentstatus = out->lastevent = CEVNT_NOMINAL; - out->kv_list = (struct ctl_var *)0; - } - - if (unit >= MAXUNITS) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_control: unit invalid (max %d)", - unit, MAXUNITS-1); - return; - } - - parse = parseunits[unit]; - - if (!parse || !parse->peer) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_control: unit invalid (UNIT INACTIVE)", - unit); - return; - } - - if (in) - { - if (in->haveflags & CLK_HAVETIME1) - parse->basedelay = in->fudgetime1; - - if (in->haveflags & CLK_HAVETIME2) - { - parse->ppsdelay = in->fudgetime2; - } - - if (in->haveflags & CLK_HAVEVAL1) - { - parse->peer->stratum = (u_char)(in->fudgeval1 & 0xf); - if (parse->peer->stratum <= 1) - memmove((char *)&parse->peer->refid, - parse->parse_type->cl_id, - 4); - else - parse->peer->refid = htonl(PARSEHSREFID); - } - - /* - * NOT USED - yet - * - if (in->haveflags & CLK_HAVEVAL2) - { - } - */ - if (in->haveflags & (CLK_HAVEFLAG1|CLK_HAVEFLAG2|CLK_HAVEFLAG3|CLK_HAVEFLAG4)) - { - parse->flags = (in->flags & (CLK_FLAG1|CLK_FLAG2|CLK_FLAG3|CLK_FLAG4)) | - (parse->flags & ~PARSE_STAT_FLAGS); - } - - if (in->haveflags & (CLK_HAVEVAL2|CLK_HAVETIME2|CLK_HAVEFLAG1|CLK_HAVEFLAG2|CLK_HAVEFLAG3|CLK_HAVEFLAG4)) - { - parsectl_t tmpctl; - tmpctl.parsestatus.flags = parse->flags & PARSE_STAT_FLAGS; - - if (!PARSE_SETSTAT(parse, &tmpctl)) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_control: parse_setstat() FAILED", unit); - } - } - } - - if (out) - { - register unsigned LONG sum = 0; - register char *t, *tt; - register struct tm *tm; - register short utcoff; - register char sign; - register int i; - time_t tim; - - outstatus[0] = '\0'; - - out->haveflags = CLK_HAVETIME1|CLK_HAVETIME2|CLK_HAVEVAL1|CLK_HAVEFLAG1|CLK_HAVEFLAG2|CLK_HAVEFLAG3; - out->clockdesc = parse->parse_type->cl_description; - - out->fudgetime1 = parse->basedelay; - - out->fudgetime2 = parse->ppsdelay; - - out->fudgeval1 = (LONG)parse->peer->stratum; - - out->fudgeval2 = 0; - - out->flags = parse->flags & PARSE_STAT_FLAGS; - - out->type = REFCLK_PARSE; - - /* - * figure out skew between PPS and RS232 - just for informational - * purposes - returned in time2 value - */ - if (PARSE_SYNC(parse->time.parse_state)) - { - if (PARSE_PPS(parse->time.parse_state) && PARSE_TIMECODE(parse->time.parse_state)) - { - l_fp off; - - /* - * we have a PPS and RS232 signal - calculate the skew - * WARNING: assumes on TIMECODE == PULSE (timecode after pulse) - */ - off = parse->time.parse_stime.fp; - L_SUB(&off, &parse->time.parse_ptime.fp); /* true offset */ - tt = add_var(&out->kv_list, 40, RO); - sprintf(tt, "refclock_ppsskew=%s", lfptoms(&off, 6)); - } - } - - if (PARSE_PPS(parse->time.parse_state)) - { - tt = add_var(&out->kv_list, 80, RO|DEF); - sprintf(tt, "refclock_ppstime=\"%s\"", prettydate(&parse->time.parse_ptime.fp)); - } - - /* - * all this for just finding out the +-xxxx part (there are always - * new and changing fields in the standards 8-(). - * - * but we do it for the human user... - */ - tim = parse->time.parse_time.fp.l_ui - JAN_1970; - tm = gmtime(&tim); - utcoff = tm->tm_hour * 60 + tm->tm_min; - tm = localtime(&tim); - utcoff = tm->tm_hour * 60 + tm->tm_min - utcoff + 12 * 60; - utcoff += 24 * 60; - utcoff %= 24 * 60; - utcoff -= 12 * 60; - if (utcoff < 0) - { - utcoff = -utcoff; - sign = '-'; - } - else - { - sign = '+'; - } - - tt = add_var(&out->kv_list, 128, RO|DEF); - sprintf(tt, "refclock_time=\""); - tt += strlen(tt); - - if (parse->time.parse_time.fp.l_ui == 0) - { - strcpy(tt, "<UNDEFINED>\""); - } - else - { - strcpy(tt, prettydate(&parse->time.parse_time.fp)); - t = tt + strlen(tt); - - sprintf(t, " (%c%02d%02d)\"", sign, utcoff / 60, utcoff % 60); - } - - if (!PARSE_GETTIMECODE(parse, &tmpctl)) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_control: parse_timecode() FAILED", unit); - } - else - { - tt = add_var(&out->kv_list, 128, RO|DEF); - sprintf(tt, "refclock_status=\""); - tt += strlen(tt); - - /* - * copy PPS flags from last read transaction (informational only) - */ - tmpctl.parsegettc.parse_state |= parse->time.parse_state & - (PARSEB_PPS|PARSEB_S_PPS); - - (void) parsestate(tmpctl.parsegettc.parse_state, tt); - - strcat(tt, "\""); - - if (tmpctl.parsegettc.parse_count) - mkascii(outstatus+strlen(outstatus), sizeof(outstatus)- strlen(outstatus) - 1, - tmpctl.parsegettc.parse_buffer, tmpctl.parsegettc.parse_count - 1); - - parse->badformat += tmpctl.parsegettc.parse_badformat; - } - - tmpctl.parseformat.parse_format = tmpctl.parsegettc.parse_format; - - if (!PARSE_GETFMT(parse, &tmpctl)) - { - syslog (LOG_ERR, "PARSE receiver #%d: parse_control: parse_getfmt() FAILED", unit); - } - else - { - tt = add_var(&out->kv_list, 80, RO|DEF); - sprintf(tt, "refclock_format=\""); - - strncat(tt, tmpctl.parseformat.parse_buffer, tmpctl.parseformat.parse_count); - strcat(tt,"\""); - } - - /* - * gather state statistics - */ - - tt = add_var(&out->kv_list, 200, RO|DEF); - strcpy(tt, "refclock_states=\""); - tt += strlen(tt); - - for (i = 0; i <= CEVNT_MAX; i++) - { - register unsigned LONG stime; - register unsigned LONG div = current_time - parse->timestarted; - register unsigned LONG percent; - - percent = stime = PARSE_STATETIME(parse, i); - - while (((unsigned LONG)(~0) / 10000) < percent) - { - percent /= 10; - div /= 10; - } - - if (div) - percent = (percent * 10000) / div; - else - percent = 10000; - - if (stime) - { - sprintf(tt, "%s%s%s: %s (%d.%02d%%)", - sum ? "; " : "", - (parse->status == i) ? "*" : "", - clockstatus(i), - l_mktime(stime), - percent / 100, percent % 100); - sum += stime; - tt += strlen(tt); - } - } - - sprintf(tt, "; running time: %s\"", l_mktime(sum)); - - tt = add_var(&out->kv_list, 32, RO); - sprintf(tt, "refclock_id=\"%s\"", parse->parse_type->cl_id); - - tt = add_var(&out->kv_list, 80, RO); - sprintf(tt, "refclock_iomode=\"%s\"", parse->binding->bd_description); - - tt = add_var(&out->kv_list, 128, RO); - sprintf(tt, "refclock_driver_version=\"refclock_parse.c,v 3.53 1994/03/25 13:07:39 kardel Exp\""); - - out->lencode = strlen(outstatus); - out->lastcode = outstatus; - out->timereset = parse->timestarted; - out->polls = parse->polls; - out->noresponse = parse->noresponse; - out->badformat = parse->badformat; - out->baddata = parse->baddata; - out->lastevent = parse->lastevent; - out->currentstatus = parse->status; - } -} - -/**=========================================================================== - ** processing routines - **/ - -/*-------------------------------------------------- - * event handling - note that nominal events will also be posted - */ -static void -parse_event(parse, event) - struct parseunit *parse; - int event; -{ - if (parse->status != (u_char) event) - { - parse->statetime[parse->status] += current_time - parse->lastchange; - parse->lastchange = current_time; - - parse->status = (u_char)event; - if (event != CEVNT_NOMINAL) - parse->lastevent = parse->status; - - report_event(EVNT_PEERCLOCK, parse->peer); - } -} - -/*-------------------------------------------------- - * process a PARSE time sample - */ -static void -parse_process(parse, parsetime) - struct parseunit *parse; - parsetime_t *parsetime; -{ - unsigned char leap; - struct timeval usecdisp; - l_fp off, rectime, reftime, dispersion; - - /* - * check for changes in conversion status - * (only one for each new status !) - */ - if (parse->laststatus != parsetime->parse_status) - { - char buffer[200]; - - syslog(LOG_WARNING, "PARSE receiver #%d: conversion status \"%s\"", - CL_UNIT(parse->unit), parsestatus(parsetime->parse_status, buffer)); - - if ((parsetime->parse_status & CVT_MASK) == CVT_FAIL) - { - /* - * tell more about the story - list time code - * there is a slight change for a race condition and - * the time code might be overwritten by the next packet - */ - parsectl_t tmpctl; - - if (!PARSE_GETTIMECODE(parse, &tmpctl)) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_process: parse_timecode() FAILED", CL_UNIT(parse->unit)); - } - else - { - syslog(LOG_WARNING, "PARSE receiver #%d: FAILED TIMECODE: \"%s\"", - CL_UNIT(parse->unit), mkascii(buffer, sizeof buffer, tmpctl.parsegettc.parse_buffer, tmpctl.parsegettc.parse_count - 1)); - parse->badformat += tmpctl.parsegettc.parse_badformat; - } - } - - parse->laststatus = parsetime->parse_status; - } - - /* - * examine status and post appropriate events - */ - if ((parsetime->parse_status & CVT_MASK) != CVT_OK) - { - /* - * got bad data - tell the rest of the system - */ - switch (parsetime->parse_status & CVT_MASK) - { - case CVT_NONE: - break; /* well, still waiting - timeout is handled at higher levels */ - - case CVT_FAIL: - parse->badformat++; - if (parsetime->parse_status & CVT_BADFMT) - { - parse_event(parse, CEVNT_BADREPLY); - } - else - if (parsetime->parse_status & CVT_BADDATE) - { - parse_event(parse, CEVNT_BADDATE); - } - else - if (parsetime->parse_status & CVT_BADTIME) - { - parse_event(parse, CEVNT_BADTIME); - } - else - { - parse_event(parse, CEVNT_BADREPLY); /* for the lack of something better */ - } - } - return; /* skip the rest - useless */ - } - - /* - * check for format changes - * (in case somebody has swapped clocks 8-) - */ - if (parse->lastformat != parsetime->parse_format) - { - parsectl_t tmpctl; - - tmpctl.parseformat.parse_format = parsetime->parse_format; - - if (!PARSE_GETFMT(parse, &tmpctl)) - { - syslog(LOG_ERR, "PARSE receiver #%d: parse_getfmt() FAILED", CL_UNIT(parse->unit)); - } - else - { - syslog(LOG_INFO, "PARSE receiver #%d: new packet format \"%s\"", - CL_UNIT(parse->unit), tmpctl.parseformat.parse_buffer); - } - parse->lastformat = parsetime->parse_format; - } - - /* - * now, any changes ? - */ - if (parse->time.parse_state != parsetime->parse_state) - { - char tmp1[200]; - char tmp2[200]; - /* - * something happend - */ - - (void) parsestate(parsetime->parse_state, tmp1); - (void) parsestate(parse->time.parse_state, tmp2); - - syslog(LOG_INFO,"PARSE receiver #%d: STATE CHANGE: %s -> %s", - CL_UNIT(parse->unit), tmp2, tmp1); - } - - /* - * remember for future - */ - parse->time = *parsetime; - - /* - * check to see, whether the clock did a complete powerup or lost PZF signal - * and post correct events for current condition - */ - if (PARSE_POWERUP(parsetime->parse_state)) - { - /* - * this is bad, as we have completely lost synchronisation - * well this is a problem with the receiver here - * for PARSE U/A 31 the lost synchronisation ist true - * as it is the powerup state and the time is taken - * from a crude real time clock chip - * for the PZF series this is only partly true, as - * PARSE_POWERUP only means that the pseudo random - * phase shift sequence cannot be found. this is only - * bad, if we have never seen the clock in the SYNC - * state, where the PHASE and EPOCH are correct. - * for reporting events the above business does not - * really matter, but we can use the time code - * even in the POWERUP state after having seen - * the clock in the synchronized state (PZF class - * receivers) unless we have had a telegram disruption - * after having seen the clock in the SYNC state. we - * thus require having seen the clock in SYNC state - * *after* having missed telegrams (noresponse) from - * the clock. one problem remains: we might use erroneously - * POWERUP data if the disruption is shorter than 1 polling - * interval. fortunately powerdowns last usually longer than 64 - * seconds and the receiver is at least 2 minutes in the - * POWERUP or NOSYNC state before switching to SYNC - */ - parse_event(parse, CEVNT_FAULT); - if (parse->nosynctime) - { - /* - * repeated POWERUP/NOSYNC state - look whether - * the message should be repeated - */ - if (current_time - parse->nosynctime > PARSENOSYNCREPEAT) - { - syslog(LOG_ERR,"PARSE receiver #%d: *STILL* NOT SYNCHRONIZED (POWERUP or no PZF signal)", - CL_UNIT(parse->unit)); - parse->nosynctime = current_time; - } - } - else - { - syslog(LOG_ERR,"PARSE receiver #%d: NOT SYNCHRONIZED", - CL_UNIT(parse->unit)); - parse->nosynctime = current_time; - } - } - else - { - /* - * we have two states left - * - * SYNC: - * this state means that the EPOCH (timecode) and PHASE - * information has be read correctly (at least two - * successive PARSE timecodes were received correctly) - * this is the best possible state - full trust - * - * NOSYNC: - * The clock should be on phase with respect to the second - * signal, but the timecode has not been received correctly within - * at least the last two minutes. this is a sort of half baked state - * for PARSE U/A 31 this is bad news (clock running without timecode - * confirmation) - * PZF 535 has also no time confirmation, but the phase should be - * very precise as the PZF signal can be decoded - */ - parse->nosynctime = 0; /* current state is better than worst state */ - - if (PARSE_SYNC(parsetime->parse_state)) - { - /* - * currently completely synchronized - best possible state - */ - parse->lastsync = current_time; - /* - * log OK status - */ - parse_event(parse, CEVNT_NOMINAL); - } - else - { - /* - * we have had some problems receiving the time code - */ - parse_event(parse, CEVNT_PROP); - } - } - - if (PARSE_TIMECODE(parsetime->parse_state)) - { - l_fp offset; - - /* - * calculate time offset including systematic delays - * off = PARSE-timestamp + propagation delay - kernel time stamp - */ - offset = parse->basedelay; - - off = parsetime->parse_time.fp; - - reftime = off; - - L_ADD(&off, &offset); - rectime = off; /* this makes org time and xmt time somewhat artificial */ - - L_SUB(&off, &parsetime->parse_stime.fp); - - if ((parse->flags & PARSE_STAT_FILTER) && - (off.l_i > -60) && - (off.l_i < 60)) /* take usec error only if within +- 60 secs */ - { - struct timeval usecerror; - /* - * offset is already calculated - */ - usecerror.tv_sec = parsetime->parse_usecerror / 1000000; - usecerror.tv_usec = parsetime->parse_usecerror % 1000000; - - sTVTOTS(&usecerror, &off); - L_ADD(&off, &offset); - } - } - - if (PARSE_PPS(parsetime->parse_state) && CL_PPS(parse->unit)) - { - l_fp offset; - - /* - * we have a PPS signal - much better than the RS232 stuff (we hope) - */ - offset = parsetime->parse_ptime.fp; - - L_ADD(&offset, &parse->ppsdelay); - - if (PARSE_TIMECODE(parsetime->parse_state)) - { - if (M_ISGEQ(off.l_i, off.l_f, -1, 0x80000000) && - M_ISGEQ(0, 0x7fffffff, off.l_i, off.l_f)) - { - /* - * RS232 offsets within [-0.5..0.5[ - take PPS offsets - */ - - if (parse->parse_type->cl_flags & PARSE_F_PPSONSECOND) - { - reftime = off = offset; - rectime = offset; - /* - * implied on second offset - */ - off.l_uf = ~off.l_uf; /* map [0.5..1[ -> [-0.5..0[ */ - off.l_ui = (off.l_f < 0) ? ~0 : 0; /* sign extend */ - } - else - { - /* - * time code describes pulse - */ - off = parsetime->parse_time.fp; - - rectime = reftime = off; /* take reference time - fake rectime */ - - L_SUB(&off, &offset); /* true offset */ - } - } - /* - * take RS232 offset when PPS when out of bounds - */ - } - else - { - /* - * Well, no time code to guide us - assume on second pulse - * and pray, that we are within [-0.5..0.5[ - */ - reftime = off = offset; - rectime = offset; - /* - * implied on second offset - */ - off.l_uf = ~off.l_uf; /* map [0.5..1[ -> [-0.5..0[ */ - off.l_ui = (off.l_f < 0) ? ~0 : 0; /* sign extend */ - } - } - else - { - if (!PARSE_TIMECODE(parsetime->parse_state)) - { - /* - * Well, no PPS, no TIMECODE, no more work ... - */ - return; - } - } - - -#if defined(PPS) || defined(PPSCLK) || defined(PPSPPS) || defined(PARSEPPS) - if (CL_PPS(parse->unit) && !parse->pollonly && PARSE_SYNC(parsetime->parse_state)) - { - /* - * only provide PPS information when clock - * is in sync - * thus PHASE and EPOCH are correct and PPS is not - * done via the CIOGETEV loopfilter mechanism - */ -#ifdef PPSPPS - if (fdpps != parse->fd) -#endif - (void) pps_sample(&off); - } -#endif /* PPS || PPSCLK || PPSPPS || PARSEPPS */ - - /* - * ready, unless the machine wants a sample - */ - if (!parse->pollonly && !parse->pollneeddata) - return; - - parse->pollneeddata = 0; - - if (PARSE_PPS(parsetime->parse_state)) - { - L_CLR(&dispersion); - } - else - { - /* - * convert usec dispersion into NTP TS world - */ - - usecdisp.tv_sec = parsetime->parse_usecdisp / 1000000; - usecdisp.tv_usec = parsetime->parse_usecdisp % 1000000; - - TVTOTS(&usecdisp, &dispersion); - } - - /* - * and now stick it into the clock machine - * samples are only valid iff lastsync is not too old and - * we have seen the clock in sync at least once - * after the last time we didn't see an expected data telegram - * see the clock states section above for more reasoning - */ - if (((current_time - parse->lastsync) > parse->parse_type->cl_maxunsync) || - (parse->lastsync <= parse->lastmissed)) - { - leap = LEAP_NOTINSYNC; - } - else - { - if (PARSE_LEAPADD(parsetime->parse_state)) - { - /* - * we pick this state also for time code that pass leap warnings - * without direction information (as earth is currently slowing - * down). - */ - leap = (parse->flags & PARSE_LEAP_DELETE) ? LEAP_DELSECOND : LEAP_ADDSECOND; - } - else - if (PARSE_LEAPDEL(parsetime->parse_state)) - { - leap = LEAP_DELSECOND; - } - else - { - leap = LEAP_NOWARNING; - } - } - - refclock_receive(parse->peer, &off, 0, LFPTOFP(&dispersion), &reftime, &rectime, leap); -} - -/**=========================================================================== - ** clock polling support - **/ - -struct poll_timer -{ - struct event timer; /* we'd like to poll a a higher rate than 1/64s */ -}; - -typedef struct poll_timer poll_timer_t; - -/*-------------------------------------------------- - * direct poll routine - */ -static void -poll_dpoll(parse) - struct parseunit *parse; -{ - register int rtc; - register char *ps = ((poll_info_t *)parse->parse_type->cl_data)->string; - register int ct = ((poll_info_t *)parse->parse_type->cl_data)->count; - - rtc = write(parse->fd, ps, ct); - if (rtc < 0) - { - syslog(LOG_ERR, "PARSE receiver #%d: poll_dpoll: failed to send cmd to clock: %m", CL_UNIT(parse->unit)); - } - else - if (rtc != ct) - { - syslog(LOG_ERR, "PARSE receiver #%d: poll_dpoll: failed to send cmd incomplete (%d of %d bytes sent)", CL_UNIT(parse->unit), rtc, ct); - } -} - -/*-------------------------------------------------- - * periodic poll routine - */ -static void -poll_poll(parse) - struct parseunit *parse; -{ - register poll_timer_t *pt = (poll_timer_t *)parse->localdata; - - poll_dpoll(parse); - - if (pt != (poll_timer_t *)0) - { - pt->timer.event_time = current_time + ((poll_info_t *)parse->parse_type->cl_data)->rate; - TIMER_ENQUEUE(timerqueue, &pt->timer); - } -} - -/*-------------------------------------------------- - * init routine - setup timer - */ -static int -poll_init(parse) - struct parseunit *parse; -{ - register poll_timer_t *pt; - - if (((poll_info_t *)parse->parse_type->cl_data)->rate) - { - parse->localdata = (void *)malloc(sizeof(poll_timer_t)); - memset((char *)parse->localdata, 0, sizeof(poll_timer_t)); - - pt = (poll_timer_t *)parse->localdata; - - pt->timer.peer = (struct peer *)parse; /* well, only we know what it is */ - pt->timer.event_handler = poll_poll; - poll_poll(parse); - } - else - { - parse->localdata = (void *)0; - } - - return 0; -} - -/*-------------------------------------------------- - * end routine - clean up timer - */ -static void -poll_end(parse) - struct parseunit *parse; -{ - if (parse->localdata != (void *)0) - { - TIMER_DEQUEUE(&((poll_timer_t *)parse->localdata)->timer); - free((char *)parse->localdata); - parse->localdata = (void *)0; - } -} - -/**=========================================================================== - ** special code for special clocks - **/ - - -/*-------------------------------------------------- - * trimble TAIP init routine - setup EOL and then do poll_init. - */ -static int -trimbletaip_init(parse) - struct parseunit *parse; -{ -#ifdef HAVE_TERMIOS - struct termios tm; -#endif -#ifdef HAVE_SYSV_TTYS - struct termio tm; -#endif - /* - * configure terminal line for trimble receiver - */ - if (TTY_GETATTR(parse->fd, &tm) == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: trimbletaip_init: tcgetattr(fd, &tm): %m", CL_UNIT(parse->unit)); - return 0; - } - else - { - tm.c_cc[VEOL] = TRIMBLETAIP_EOL; - - if (TTY_SETATTR(parse->fd, &tm) == -1) - { - syslog(LOG_ERR, "PARSE receiver #%d: trimbletaip_init: tcsetattr(fd, &tm): %m", CL_UNIT(parse->unit)); - return 0; - } - } - return poll_init(parse); -} - -/* - * This driver supports the Trimble SVee Six Plus GPS receiver module. - * It should support other Trimble receivers which use the Trimble Standard - * Interface Protocol (see below). - * - * The module has a serial I/O port for command/data and a 1 pulse-per-second - * output, about 1 microsecond wide. The leading edge of the pulse is - * coincident with the change of the GPS second. This is the same as - * the change of the UTC second +/- ~1 microsecond. Some other clocks - * specifically use a feature in the data message as a timing reference, but - * the SVee Six Plus does not do this. In fact there is considerable jitter - * on the timing of the messages, so this driver only supports the use - * of the PPS pulse for accurate timing. Where it is determined that - * the offset is way off, when first starting up xntpd for example, - * the timing of the data stream is used until the offset becomes low enough - * (|offset| < CLOCK_MAX), at which point the pps offset is used. - * - * It can use either option for receiving PPS information - the 'ppsclock' - * stream pushed onto the serial data interface to timestamp the Carrier - * Detect interrupts, where the 1PPS connects to the CD line. This only - * works on SunOS 4.1.x currently. To select this, define PPSPPS in - * Config.local. The other option is to use a pulse-stretcher/level-converter - * to convert the PPS pulse into a RS232 start pulse & feed this into another - * tty port. To use this option, define PPSCLK in Config.local. The pps input, - * by whichever method, is handled in ntp_loopfilter.c - * - * The receiver uses a serial message protocol called Trimble Standard - * Interface Protocol (it can support others but this driver only supports - * TSIP). Messages in this protocol have the following form: - * - * <DLE><id> ... <data> ... <DLE><ETX> - * - * Any bytes within the <data> portion of value 10 hex (<DLE>) are doubled - * on transmission and compressed back to one on reception. Otherwise - * the values of data bytes can be anything. The serial interface is RS-422 - * asynchronous using 9600 baud, 8 data bits with odd party (**note** 9 bits - * in total!), and 1 stop bit. The protocol supports byte, integer, single, - * and double datatypes. Integers are two bytes, sent most significant first. - * Singles are IEEE754 single precision floating point numbers (4 byte) sent - * sign & exponent first. Doubles are IEEE754 double precision floating point - * numbers (8 byte) sent sign & exponent first. - * The receiver supports a large set of messages, only a small subset of - * which are used here. From driver to receiver the following are used: - * - * ID Description - * - * 21 Request current time - * 22 Mode Select - * 2C Set/Request operating parameters - * 2F Request UTC info - * 35 Set/Request I/O options - - * From receiver to driver the following are recognised: - * - * ID Description - * - * 41 GPS Time - * 44 Satellite selection, PDOP, mode - * 46 Receiver health - * 4B Machine code/status - * 4C Report operating parameters (debug only) - * 4F UTC correction data (used to get leap second warnings) - * 55 I/O options (debug only) - * - * All others are accepted but ignored. - * - */ - -#define PI 3.1415926535898 /* lots of sig figs */ -#define D2R PI/180.0 - -/*------------------------------------------------------------------- - * sendcmd, sendbyte, sendetx, sendflt, sendint implement the command - * interface to the receiver. - * - * CAVEAT: the sendflt, sendint routines are byte order dependend and - * float implementation dependend - these must be converted to portable - * versions ! - */ - -union { - u_char bd[8]; - int iv; - float fv; - double dv; -} uval; - -struct txbuf -{ - short idx; /* index to first unused byte */ - u_char *txt; /* pointer to actual data buffer */ -}; - -void -sendcmd(buf, c) - struct txbuf *buf; - u_char c; -{ - buf->txt[0] = DLE; - buf->txt[1] = c; - buf->idx = 2; -} - -void sendbyte(buf, b) - struct txbuf *buf; - u_char b; -{ - if (b == DLE) - buf->txt[buf->idx++] = DLE; - buf->txt[buf->idx++] = b; -} - -void -sendetx(buf, parse) - struct txbuf *buf; - struct parseunit *parse; -{ - buf->txt[buf->idx++] = DLE; - buf->txt[buf->idx++] = ETX; - - if (write(parse->fd, buf->txt, buf->idx) != buf->idx) - { - syslog(LOG_ERR, "PARSE receiver #%d: sendetx: failed to send cmd to clock: %m", CL_UNIT(parse->unit)); - } -} - -void -sendint(buf, a) - struct txbuf *buf; - int a; -{ - uval.iv = a; - sendbyte(buf, uval.bd[2]); - sendbyte(buf, uval.bd[3]); -} - -void -sendflt(buf, a) - struct txbuf *buf; - float a; -{ - int i; - - uval.fv = a; - for (i=0; i<=3; i++) - sendbyte(buf, uval.bd[i]); -} - -/*-------------------------------------------------- - * trimble TSIP init routine - */ -static int -trimbletsip_init(parse) - struct parseunit *parse; -{ - u_char buffer[256]; - struct txbuf buf; - - buf.txt = buffer; - - if (!poll_init(parse)) - { - sendcmd(&buf, 0x1f); /* request software versions */ - sendetx(&buf, parse); - - sendcmd(&buf, 0x2c); /* set operating parameters */ - sendbyte(&buf, 4); /* static */ - sendflt(&buf, 5.0*D2R); /* elevation angle mask = 10 deg XXX */ - sendflt(&buf, 4.0); /* s/n ratio mask = 6 XXX */ - sendflt(&buf, 12.0); /* PDOP mask = 12 */ - sendflt(&buf, 8.0); /* PDOP switch level = 8 */ - sendetx(&buf, parse); - - sendcmd(&buf, 0x22); /* fix mode select */ - sendbyte(&buf, 0); /* automatic */ - sendetx(&buf, parse); - - sendcmd(&buf, 0x28); /* request system message */ - sendetx(&buf, parse); - - sendcmd(&buf, 0x8e); /* superpacket fix */ - sendbyte(&buf, 0x2); /* binary mode */ - sendetx(&buf, parse); - - sendcmd(&buf, 0x35); /* set I/O options */ - sendbyte(&buf, 0); /* no position output */ - sendbyte(&buf, 0); /* no velocity output */ - sendbyte(&buf, 7); /* UTC, compute on seconds, send only on request */ - sendbyte(&buf, 0); /* no raw measurements */ - sendetx(&buf, parse); - - sendcmd(&buf, 0x2f); /* request UTC correction data */ - sendetx(&buf, parse); - return 0; - } - else - return 1; -} - -#endif /* defined(REFCLOCK) && defined(PARSE) */ - -/* - * History: - * - * refclock_parse.c,v - * Revision 3.53 1994/03/25 13:07:39 kardel - * fixed offset calculation for large (>4 Min) offsets - * - * Revision 3.52 1994/03/03 09:58:00 kardel - * stick -kv in cvs is no fun - * - * Revision 3.49 1994/02/20 13:26:00 kardel - * rcs id cleanup - * - * Revision 3.48 1994/02/20 13:04:56 kardel - * parse add/delete second support - * - * Revision 3.47 1994/02/02 17:44:30 kardel - * rcs ids fixed - * - * Revision 3.45 1994/01/25 19:06:27 kardel - * 94/01/23 reconcilation - * - * Revision 3.44 1994/01/25 17:32:23 kardel - * settable extended variables - * - * Revision 3.43 1994/01/23 16:28:39 kardel - * HAVE_TERMIOS introduced - * - * Revision 3.42 1994/01/22 11:35:04 kardel - * added HAVE_TERMIOS - * - * Revision 3.41 1993/11/27 18:44:37 kardel - * can't trust GPS166 on unsync - * - * Revision 3.40 1993/11/21 18:03:36 kardel - * useless declaration deleted - * - * Revision 3.39 1993/11/21 15:30:15 kardel - * static funcitions may be declared only at outer level - * - * Revision 3.38 1993/11/15 21:26:49 kardel - * conditional define comments fixed - * - * Revision 3.37 1993/11/11 11:20:49 kardel - * declaration fixes - * - * Revision 3.36 1993/11/10 12:17:14 kardel - * #ifdef glitch - * - * Revision 3.35 1993/11/01 21:15:06 kardel - * comments updated - * - * Revision 3.34 1993/11/01 20:01:08 kardel - * parse Solaris support (initial version) - * - * Revision 3.33 1993/10/30 09:44:58 kardel - * conditional compilation flag cleanup - * - * Revision 3.32 1993/10/22 14:28:43 kardel - * Oct. 22nd 1993 reconcilation - * - * Revision 3.31 1993/10/10 21:19:10 kardel - * compilation cleanup - (minimal porting tests) - * - * Revision 3.30 1993/10/09 21:44:35 kardel - * syslog strings fixed - * - * Revision 3.29 1993/10/09 14:40:15 kardel - * default precision setting fixed - * - * Revision 3.28 1993/10/08 14:48:22 kardel - * Changed offset determination logic: - * Take the PPS offset if it is available and the time - * code offset is within [-0.5..0.5[, otherwise stick - * to the time code offset - * - * Revision 3.27 1993/10/08 00:53:17 kardel - * announce also simulated PPS via CIOGETEV in ntpq cl - * - * Revision 3.26 1993/10/07 23:29:35 kardel - * trimble fixes - * - * Revision 3.25 1993/10/06 21:13:35 kardel - * test reversed (CIOGETEV support) - * - * Revision 3.24 1993/10/03 20:18:26 kardel - * Well, values > 999999 in the usec field from uniqtime() timestamps - * can prove harmful. - * - * Revision 3.23 1993/10/03 19:49:54 kardel - * buftvtots where failing on uninitialized time stamps - * - * Revision 3.22 1993/10/03 19:11:09 kardel - * restructured I/O handling - * - * Revision 3.21 1993/09/29 11:30:18 kardel - * special init for trimble to set EOL - * - * Revision 3.20 1993/09/27 22:46:28 kardel - * preserve module stack if I_PUSH parse fails - * - * Revision 3.19 1993/09/27 21:10:11 kardel - * wrong structure member - * - * Revision 3.18 1993/09/27 13:05:06 kardel - * Trimble is true polling only - * - * Revision 3.17 1993/09/27 12:47:10 kardel - * poll string support generalized - * - * Revision 3.16 1993/09/26 23:40:56 kardel - * new parse driver logic - * - * Revision 3.15 1993/09/24 15:00:51 kardel - * Sep 23rd distribution... - * - * Revision 3.14 1993/09/22 18:21:15 kardel - * support ppsclock streams module (-DSTREAM -DPPSPPS -DPARSEPPS -UPARSESTREAM) - * - * Revision 3.13 1993/09/05 15:38:33 kardel - * not every cpp understands #error... - * - * Revision 3.12 1993/09/02 20:04:19 kardel - * TTY cleanup - * - * Revision 3.11 1993/09/01 21:48:47 kardel - * conditional cleanup - * - * Revision 3.10 1993/09/01 11:32:45 kardel - * assuming HAVE_POSIX_TTYS when STREAM defined - * - * Revision 3.9 1993/08/31 22:31:46 kardel - * SINIX-M SysVR4 integration - * - * Revision 3.8 1993/08/27 00:29:50 kardel - * compilation cleanup - * - * Revision 3.7 1993/08/24 22:27:30 kardel - * cleaned up AUTOCONF DCF77 mess 8-) - wasn't too bad - * - * Revision 3.6 1993/08/24 21:36:23 kardel - * casting and ifdefs - * - * Revision 3.5 1993/07/09 23:36:59 kardel - * HAVE_POSIX_TTYS used to produce errors 8-( - BSD driver support still lacking - * - * Revision 3.4 1993/07/09 12:42:29 kardel - * RAW DCF now officially released - * - * Revision 3.3 1993/07/09 11:50:37 kardel - * running GPS also on 960 to be able to switch GPS/DCF77 - * - * Revision 3.2 1993/07/09 11:37:34 kardel - * Initial restructured version + GPS support - * - * Revision 3.1 1993/07/06 10:01:07 kardel - * DCF77 driver goes generic... - * - */ diff --git a/usr.sbin/xntpd/xntpd/refclock_pst.c b/usr.sbin/xntpd/xntpd/refclock_pst.c deleted file mode 100644 index edc77f9b56df..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_pst.c +++ /dev/null @@ -1,329 +0,0 @@ -/* - * refclock_pst - clock driver for PSTI/Traconex WWV/WWVH receivers - */ -#if defined(REFCLOCK) && defined(PST) - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_stdlib.h" - -/* - * 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 internal switches) - * 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. - */ - -/* - * Interface definitions - */ -#define DEVICE "/dev/pst%d" /* device name and unit */ -#define SPEED232 B9600 /* uart speed (9600 baud) */ -#define PRECISION (-10) /* precision assumed (about 1 ms) */ -#define WWVREFID "WWV\0" /* WWV reference ID */ -#define WWVHREFID "WWVH" /* WWVH reference ID */ -#define DESCRIPTION "PSTI/Traconex WWV/WWVH Receiver" /* WRU */ - -#define NSAMPLES 3 /* stages of median filter */ -#define LENPST 46 /* min timecode length */ - -/* - * Imported from ntp_timer module - */ -extern u_long current_time; /* current time (s) */ - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * Unit control structure - */ -struct pstunit { - int pollcnt; /* poll message counter */ - - u_char tcswitch; /* timecode switch */ - char *lastptr; /* pointer to timecode data */ -}; - -/* - * Function prototypes - */ -static int pst_start P((int, struct peer *)); -static void pst_shutdown P((int, struct peer *)); -static void pst_receive P((struct recvbuf *)); -static void pst_poll P((int, struct peer *)); - -/* - * Transfer vector - */ -struct refclock refclock_pst = { - pst_start, /* start up driver */ - pst_shutdown, /* shut down driver */ - pst_poll, /* transmit poll message */ - noentry, /* not used (old pst_control) */ - noentry, /* initialize driver */ - noentry, /* not used (old pst_buginfo) */ - NOFLAGS /* not used */ -}; - - -/* - * pst_start - open the devices and initialize data for processing - */ -static int -pst_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct pstunit *up; - struct refclockproc *pp; - int fd; - char device[20]; - - /* - * Open serial port. Use CLK line discipline, if available. - */ - (void)sprintf(device, DEVICE, unit); - if (!(fd = refclock_open(device, SPEED232, LDISC_CLK))) - return (0); - - /* - * Allocate and initialize unit structure - */ - if (!(up = (struct pstunit *) - emalloc(sizeof(struct pstunit)))) { - (void) close(fd); - return (0); - } - memset((char *)up, 0, sizeof(struct pstunit)); - pp = peer->procptr; - pp->io.clock_recv = pst_receive; - pp->io.srcclock = (caddr_t)peer; - pp->io.datalen = 0; - pp->io.fd = fd; - if (!io_addclock(&pp->io)) { - (void) close(fd); - free(up); - return (0); - } - pp->unitptr = (caddr_t)up; - - /* - * Initialize miscellaneous variables - */ - peer->precision = PRECISION; - pp->clockdesc = DESCRIPTION; - memcpy((char *)&pp->refid, WWVREFID, 4); - up->pollcnt = 2; - return (1); -} - - -/* - * pst_shutdown - shut down the clock - */ -static void -pst_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct pstunit *up; - struct refclockproc *pp; - - pp = peer->procptr; - up = (struct pstunit *)pp->unitptr; - io_closeclock(&pp->io); - free(up); -} - - -/* - * pst_receive - receive data from the serial interface - */ -static void -pst_receive(rbufp) - struct recvbuf *rbufp; -{ - register struct pstunit *up; - struct refclockproc *pp; - struct peer *peer; - l_fp trtmp; - u_long ltemp; - char ampmchar; /* AM/PM indicator */ - char daychar; /* standard/daylight indicator */ - char junque[10]; /* "yy/dd/mm/" discard */ - char info[14]; /* "frdzycchhSSFT" clock info */ - - /* - * Initialize pointers and read the timecode and timestamp - */ - peer = (struct peer *)rbufp->recv_srcclock; - pp = peer->procptr; - up = (struct pstunit *)pp->unitptr; - up->lastptr += refclock_gtlin(rbufp, up->lastptr, pp->lastcode - + BMAX - 2 - up->lastptr, &trtmp); - *up->lastptr++ = ' '; - *up->lastptr = '\0'; - - /* - * Note we get a buffer and timestamp for each <cr>, but only - * the first timestamp is retained. - */ - if (!up->tcswitch) - pp->lastrec = trtmp; - up->tcswitch++; - pp->lencode = up->lastptr - pp->lastcode; - if (up->tcswitch < 3) - return; - up->pollcnt = 2; - record_clock_stats(&peer->srcadr, pp->lastcode); -#ifdef DEBUG - if (debug) - printf("pst: timecode %d %s\n", pp->lencode, - pp->lastcode); -#endif - - /* - * We get down to business, check the timecode format and decode - * its contents. If the timecode has invalid length or is not in - * proper format, we declare bad format and exit. - */ - if (pp->lencode < LENPST) { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - - /* - * Timecode format: - * "ahh:mm:ss.fffs yy/dd/mm/ddd frdzycchhSSFTttttuuxx" - */ - if (sscanf(pp->lastcode, "%c%2d:%2d:%2d.%3d%c %9s%3d%13s%4ld", - &mchar, &pp->hour, &pp->minute, &pp->second, - &pp->msec, &daychar, junque, &pp->day, - info, <emp) != 10) { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - - /* - * Decode synchronization, quality and last update. If - * unsynchronized, set the leap bits accordingly and exit. Once - * synchronized, the dispersion depends only on when the clock - * was last heard, which depends on the time since last update, - * as reported by the clock. - */ - if (info[9] != '8') { - pp->leap = LEAP_NOTINSYNC; - } else { - pp->leap = 0; - pp->lasttime = current_time - ltemp; - if (info[12] == 'H') - memcpy((char *)&pp->refid, WWVHREFID, 4); - else - memcpy((char *)&pp->refid, WWVREFID, 4); - if (peer->stratum <= 1) - peer->refid = pp->refid; - } - - /* - * Process the new sample in the median filter and determine the - * reference clock offset and dispersion. We use lastrec as both - * the reference time and receive time in order to avoid being - * cute, like setting the reference time later than the receive - * time, which may cause a paranoid protocol module to chuck out - * the data. - */ - if (!refclock_process(pp, NSAMPLES, NSAMPLES)) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - trtmp = pp->lastrec; - trtmp.l_ui -= ltemp; - refclock_receive(peer, &pp->offset, 0, pp->dispersion, &trtmp, - &pp->lastrec, pp->leap); -} - - -/* - * pst_poll - called by the transmit procedure - */ -static void -pst_poll(unit, peer) - int unit; - struct peer *peer; -{ - register struct pstunit *up; - struct refclockproc *pp; - - /* - * Time to poll the clock. The PSTI/Traconex clock responds to a - * "QTQDQMT" by returning a timecode in the format specified - * above. If nothing is heard from the clock for two polls, - * declare a timeout and keep going. - */ - pp = peer->procptr; - up = (struct pstunit *)pp->unitptr; - if (up->pollcnt == 0) - refclock_report(peer, CEVNT_TIMEOUT); - else - up->pollcnt--; - up->tcswitch = 0; - up->lastptr = pp->lastcode; - if (write(pp->io.fd, "QTQDQMT", 6) != 6) { - refclock_report(peer, CEVNT_FAULT); - } else - pp->polls++; -} - -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_tpro.c b/usr.sbin/xntpd/xntpd/refclock_tpro.c deleted file mode 100644 index d530fbffee1a..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_tpro.c +++ /dev/null @@ -1,227 +0,0 @@ -/* - * refclock_tpro - clock driver for the KSI/Odetics TPRO-S IRIG-B reader - */ -#if defined(REFCLOCK) && defined(TPRO) && defined(sun) - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_unixtime.h" -#include "sys/tpro.h" -#include "ntp_stdlib.h" - -/* - * This driver supports the KSI/Odetecs TPRO-S IRIG-B reader and TPRO- - * SAT GPS receiver for the Sun Microsystems SBus. It requires that the - * tpro.o device driver be installed and loaded. - */ - -/* - * TPRO interface definitions - */ -#define DEVICE "/dev/tpro%d" /* device name and unit */ -#define PRECISION (-20) /* precision assumed (1 us) */ -#define REFID "IRIG" /* reference ID */ -#define DESCRIPTION "KSI/Odetics TPRO/S IRIG Interface" /* WRU */ - -#define NSAMPLES 3 /* stages of median filter */ - -/* - * Imported from ntp_timer module - */ -extern u_long current_time; /* current time (s) */ - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * Unit control structure - */ -struct tprounit { - struct tproval tprodata; /* data returned from tpro read */ -}; - -/* - * Function prototypes - */ -static int tpro_start P((int, struct peer *)); -static void tpro_shutdown P((int, struct peer *)); -static void tpro_poll P((int unit, struct peer *)); - -/* - * Transfer vector - */ -struct refclock refclock_tpro = { - tpro_start, /* start up driver */ - tpro_shutdown, /* shut down driver */ - tpro_poll, /* transmit poll message */ - noentry, /* not used (old tpro_control) */ - noentry, /* initialize driver (not used) */ - noentry, /* not used (old tpro_buginfo) */ - NOFLAGS /* not used */ -}; - - -/* - * tpro_start - open the TPRO device and initialize data for processing - */ -static int -tpro_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct tprounit *up; - struct refclockproc *pp; - char device[20]; - int fd; - - /* - * Open TPRO device - */ - (void)sprintf(device, DEVICE, unit); - fd = open(device, O_RDONLY | O_NDELAY, 0777); - if (fd == -1) { - syslog(LOG_ERR, "tpro_start: open of %s: %m", device); - return (0); - } - - /* - * Allocate and initialize unit structure - */ - if (!(up = (struct tprounit *) - emalloc(sizeof(struct tprounit)))) { - (void) close(fd); - return (0); - } - memset((char *)up, 0, sizeof(struct tprounit)); - pp = peer->procptr; - pp->io.clock_recv = noentry; - pp->io.srcclock = (caddr_t)peer; - pp->io.datalen = 0; - pp->io.fd = fd; - if (!io_addclock(&pp->io)) { - (void) close(fd); - free(up); - return (0); - } - pp->unitptr = (caddr_t)up; - - /* - * Initialize miscellaneous peer variables - */ - peer->precision = PRECISION; - pp->clockdesc = DESCRIPTION; - memcpy((char *)&pp->refid, REFID, 4); - return (1); -} - - -/* - * tpro_shutdown - shut down the clock - */ -static void -tpro_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct tprounit *up; - struct refclockproc *pp; - - pp = peer->procptr; - up = (struct tprounit *)pp->unitptr; - io_closeclock(&pp->io); - free(up); -} - - -/* - * tpro_poll - called by the transmit procedure - */ -static void -tpro_poll(unit, peer) - int unit; - struct peer *peer; -{ - register struct tprounit *up; - struct refclockproc *pp; - struct tproval *tp; - - /* - * This is the main routine. It snatches the time from the TPRO - * board and tacks on a local timestamp. - */ - pp = peer->procptr; - up = (struct tprounit *)pp->unitptr; - - tp = &up->tprodata; - if (read(pp->io.fd, (char *)tp, sizeof(struct tproval)) < 0) { - refclock_report(peer, CEVNT_FAULT); - return; - } - gettstamp(&pp->lastrec); - pp->lasttime = current_time; - pp->polls++; - - /* - * We get down to business, check the timecode format and decode - * its contents. If the timecode has invalid length or is not in - * proper format, we declare bad format and exit. Note: we - * can't use the sec/usec conversion produced by the driver, - * since the year may be suspect. All format error checking is - * done by the sprintf() and sscanf() routines. - */ - if (sprintf(pp->lastcode, - "%1x%1x%1x %1x%1x:%1x%1x:%1x%1x.%1x%1x%1x%1x%1x%1x %1x", - tp->day100, tp->day10, tp->day1, tp->hour10, tp->hour1, - tp->min10, tp->min1, tp->sec10, tp->sec1, tp->ms100, - tp->ms10, tp->ms1, tp->usec100, tp->usec10, tp->usec1, - tp->status)) { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - -#ifdef DEBUG - if (debug) - printf("tpro: time %s timecode %d %s\n", - ulfptoa(&pp->lastrec, 6), pp->lencode, - pp->lastcode); -#endif - record_clock_stats(&peer->srcadr, pp->lastcode); - if (sscanf(pp->lastcode, "%3d %2d:%2d:%2d.%6ld", &pp->day, - &pp->hour, &pp->minute, &pp->second, &pp->usec) - != 5) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - if (tp->status != 0xff) { - pp->leap = LEAP_NOTINSYNC; - refclock_report(peer, CEVNT_FAULT); - return; - } else { - pp->leap = 0; - pp->lasttime = current_time; - } - - /* - * Process the new sample in the median filter and determine the - * reference clock offset and dispersion. We use lastrec as both - * the reference time and receive time in order to avoid being - * cute, like setting the reference time later than the receive - * time, which may cause a paranoid protocol module to chuck out - * the data. - */ - if (!refclock_process(pp, NSAMPLES, NSAMPLES)) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - refclock_receive(peer, &pp->offset, 0, pp->dispersion, - &pp->lastrec, &pp->lastrec, pp->leap); -} - -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_trak.c b/usr.sbin/xntpd/xntpd/refclock_trak.c deleted file mode 100644 index d10d75234fbd..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_trak.c +++ /dev/null @@ -1,339 +0,0 @@ -/* - * refclock_trak - clock driver for the TRAK 8820 GPS Station Clock - * - * Thanks to Tomoaki TSURUOKA <tsuruoka@nc.fukuoka-u.ac.jp> for the - * previous version from which this one was developed. - */ -#if defined(REFCLOCK) && defined(TRAK) - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_stdlib.h" - -/* - * 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 memus, 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 - * wtih 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. - */ - -/* - * Interface definitions - */ -#define DEVICE "/dev/trak%d" /* device name and unit */ -#define SPEED232 B9600 /* uart speed (9600 baud) */ -#define PRECISION (-10) /* precision assumed (about 1 ms) */ -#define REFID "TRAK" /* reference ID */ -#define DESCRIPTION "TRACK 8810/8820 Station Clock" /* WRU */ - -#define NSAMPLES 3 /* stages of median filter */ -#define LENTRAK 24 /* timecode length */ -#define C_CTO "RQTS\r" /* start continuous time output */ - -/* - * Imported from ntp_timer module - */ -extern u_long current_time; /* current time (s) */ - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * Unit control structure - */ -struct wwvbunit { - int pollcnt; /* poll message counter */ - - u_char tcswitch; /* timecode switch */ - char qualchar; /* quality indicator */ -}; - -/* - * Function prototypes - */ -static int trak_start P((int, struct peer *)); -static void trak_shutdown P((int, struct peer *)); -static void trak_receive P((struct recvbuf *)); -static void trak_poll P((int, struct peer *)); - -/* - * Transfer vector - */ -struct refclock refclock_trak = { - trak_start, /* start up driver */ - trak_shutdown, /* shut down driver */ - trak_poll, /* transmit poll message */ - noentry, /* not used (old trak_control) */ - noentry, /* initialize driver (not used) */ - noentry, /* not used (old trak_buginfo) */ - NOFLAGS /* not used */ -}; - - -/* - * trak_start - open the devices and initialize data for processing - */ -static int -trak_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct wwvbunit *up; - struct refclockproc *pp; - int fd; - char device[20]; - - /* - * Open serial port. The LDISC_ACTS line discipline inserts a - * timestamp following the "*" on-time character of the - * timecode. - */ - (void)sprintf(device, DEVICE, unit); - if (!(fd = refclock_open(device, SPEED232, LDISC_ACTS))) - return (0); - - /* - * Allocate and initialize unit structure - */ - if (!(up = (struct wwvbunit *) - emalloc(sizeof(struct wwvbunit)))) { - (void) close(fd); - return (0); - } - memset((char *)up, 0, sizeof(struct wwvbunit)); - pp = peer->procptr; - pp->io.clock_recv = trak_receive; - pp->io.srcclock = (caddr_t)peer; - pp->io.datalen = 0; - pp->io.fd = fd; - if (!io_addclock(&pp->io)) { - (void) close(fd); - free(up); - return (0); - } - pp->unitptr = (caddr_t)up; - - /* - * Initialize miscellaneous variables - */ - peer->precision = PRECISION; - pp->clockdesc = DESCRIPTION; - memcpy((char *)&pp->refid, REFID, 4); - up->pollcnt = 2; - - /* - * Start continuous time output. If something breaks, fold the - * tent and go home. - */ - if (write(pp->io.fd, C_CTO, sizeof(C_CTO)) != sizeof(C_CTO)) { - refclock_report(peer, CEVNT_FAULT); - (void) close(fd); - free(up); - return (0); - } - return (1); -} - - -/* - * trak_shutdown - shut down the clock - */ -static void -trak_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct wwvbunit *up; - struct refclockproc *pp; - - pp = peer->procptr; - up = (struct wwvbunit *)pp->unitptr; - io_closeclock(&pp->io); - free(up); -} - - -/* - * trak_receive - receive data from the serial interface - */ -static void -trak_receive(rbufp) - struct recvbuf *rbufp; -{ - register struct wwvbunit *up; - struct refclockproc *pp; - struct peer *peer; - l_fp trtmp; - char *dpt, *dpend; - char qchar; - - /* - * Initialize pointers and read the timecode and timestamp. We - * then chuck out everything, including runts, except one - * message each poll interval. - */ - peer = (struct peer *)rbufp->recv_srcclock; - pp = peer->procptr; - up = (struct wwvbunit *)pp->unitptr; - pp->lencode = refclock_gtlin(rbufp, pp->lastcode, BMAX, - &pp->lastrec); - if (up->tcswitch || pp->lencode < 9) - return; - up->tcswitch = 1; - - /* - * We get a buffer and timestamp following the '*' on-time - * character. If a valid timestamp, we use that in place of the - * buffer timestamp and edit out the timestamp for prettyprint - * billboards. - */ - dpt = pp->lastcode; - dpend = dpt + pp->lencode; - if (*dpt == '*' && buftvtots(dpt + 1, &trtmp)) { - if (trtmp.l_i == pp->lastrec.l_i || trtmp.l_i == - pp->lastrec.l_i + 1) { - pp->lastrec = trtmp; - dpt += 9; - while (dpt < dpend) - *(dpt - 8) = *dpt++; - } - } - up->pollcnt = 2; - record_clock_stats(&peer->srcadr, pp->lastcode); -#ifdef DEBUG - if (debug) - printf("trak: timecode %d %s\n", pp->lencode, - pp->lastcode); -#endif - - /* - * We get down to business, check the timecode format and decode - * its contents. If the timecode has invalid length or is not in - * proper format, we declare bad format and exit. - */ - if (pp->lencode < LENTRAK) { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - - /* - * Timecode format: "*RQTS U,ddd:hh:mm:ss.0,q" - */ - if (sscanf(pp->lastcode, "*RQTS U,%3d:%2d:%2d:%2d.0,%c", - &pp->day, &pp->hour, &pp->minute, &pp->second, &qchar) != 5) { - refclock_report(peer, CEVNT_BADREPLY); - return; - } - - /* - * Decode quality and leap characters. If unsynchronized, set - * the leap bits accordingly and exit. - */ - if (qchar == '0') - pp->leap = LEAP_NOTINSYNC; - else { - pp->leap = 0; - pp->lasttime = current_time; - } - - /* - * Process the new sample in the median filter and determine the - * reference clock offset and dispersion. We use lastrec as both - * the reference time and receive time in order to avoid being - * cute, like setting the reference time later than the receive - * time, which may cause a paranoid protocol module to chuck out - * the data. - */ - if (!refclock_process(pp, NSAMPLES, NSAMPLES)) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - refclock_receive(peer, &pp->offset, 0, pp->dispersion, - &pp->lastrec, &pp->lastrec, pp->leap); -} - - -/* - * trak_poll - called by the transmit procedure - */ -static void -trak_poll(unit, peer) - int unit; - struct peer *peer; -{ - register struct wwvbunit *up; - struct refclockproc *pp; - - /* - * We don't really do anything here, except arm the receiving - * side to capture a sample and check for timeouts. - */ - pp = peer->procptr; - up = (struct wwvbunit *)pp->unitptr; - if (up->pollcnt == 0) - refclock_report(peer, CEVNT_TIMEOUT); - else - up->pollcnt--; - up->tcswitch = 0; - pp->polls++; -} - -#endif diff --git a/usr.sbin/xntpd/xntpd/refclock_wwvb.c b/usr.sbin/xntpd/xntpd/refclock_wwvb.c deleted file mode 100644 index ea0c82e28ec1..000000000000 --- a/usr.sbin/xntpd/xntpd/refclock_wwvb.c +++ /dev/null @@ -1,420 +0,0 @@ -/* - * refclock_wwvb - clock driver for Spectracom WWVB receivers - */ -#if defined(REFCLOCK) && defined(WWVB) - -#include <stdio.h> -#include <ctype.h> -#include <sys/time.h> - -#include "ntpd.h" -#include "ntp_io.h" -#include "ntp_refclock.h" -#include "ntp_stdlib.h" - -/* - * 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 of 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 of 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. - */ - -/* - * Interface definitions - */ -#define DEVICE "/dev/wwvb%d" /* device name and unit */ -#define SPEED232 B9600 /* uart speed (9600 baud) */ -#define PRECISION (-10) /* precision assumed (about 1 ms) */ -#define REFID "WWVB" /* reference ID */ -#define DESCRIPTION "Spectracom WWVB Receiver" /* WRU */ - -#define NSAMPLES 3 /* stages of median filter */ -#define LENWWVB0 22 /* format 0 timecode length */ -#define LENWWVB2 24 /* format 2 timecode length */ -#define MONLIN 15 /* number of monitoring lines */ - -/* - * Imported from ntp_timer module - */ -extern u_long current_time; /* current time (s) */ - -/* - * Imported from ntpd module - */ -extern int debug; /* global debug flag */ - -/* - * WWVB unit control structure - */ -struct wwvbunit { - int pollcnt; /* poll message counter */ - - u_char tcswitch; /* timecode switch */ - l_fp laststamp; /* last receive timestamp */ - u_char lasthour; /* last hour (for monitor) */ - u_char linect; /* count ignored lines (for monitor */ -}; - -/* - * Function prototypes - */ -static int wwvb_start P((int, struct peer *)); -static void wwvb_shutdown P((int, struct peer *)); -static void wwvb_receive P((struct recvbuf *)); -static void wwvb_poll P((int, struct peer *)); - -/* - * Transfer vector - */ -struct refclock refclock_wwvb = { - wwvb_start, /* start up driver */ - wwvb_shutdown, /* shut down driver */ - wwvb_poll, /* transmit poll message */ - noentry, /* not used (old wwvb_control) */ - noentry, /* initialize driver (not used) */ - noentry, /* not used (old wwvb_buginfo) */ - NOFLAGS /* not used */ -}; - - -/* - * wwvb_start - open the devices and initialize data for processing - */ -static int -wwvb_start(unit, peer) - int unit; - struct peer *peer; -{ - register struct wwvbunit *up; - struct refclockproc *pp; - int fd; - char device[20]; - - /* - * Open serial port. Use CLK line discipline, if available. - */ - (void)sprintf(device, DEVICE, unit); - if (!(fd = refclock_open(device, SPEED232, LDISC_CLK))) - return (0); - - /* - * Allocate and initialize unit structure - */ - if (!(up = (struct wwvbunit *) - emalloc(sizeof(struct wwvbunit)))) { - (void) close(fd); - return (0); - } - memset((char *)up, 0, sizeof(struct wwvbunit)); - pp = peer->procptr; - pp->io.clock_recv = wwvb_receive; - pp->io.srcclock = (caddr_t)peer; - pp->io.datalen = 0; - pp->io.fd = fd; - if (!io_addclock(&pp->io)) { - (void) close(fd); - free(up); - return (0); - } - pp->unitptr = (caddr_t)up; - - /* - * Initialize miscellaneous variables - */ - peer->precision = PRECISION; - pp->clockdesc = DESCRIPTION; - memcpy((char *)&pp->refid, REFID, 4); - up->pollcnt = 2; - return (1); -} - - -/* - * wwvb_shutdown - shut down the clock - */ -static void -wwvb_shutdown(unit, peer) - int unit; - struct peer *peer; -{ - register struct wwvbunit *up; - struct refclockproc *pp; - - pp = peer->procptr; - up = (struct wwvbunit *)pp->unitptr; - io_closeclock(&pp->io); - free(up); -} - - -/* - * wwvb_receive - receive data from the serial interface - */ -static void -wwvb_receive(rbufp) - struct recvbuf *rbufp; -{ - register struct wwvbunit *up; - struct refclockproc *pp; - struct peer *peer; - l_fp trtmp; - u_long ltemp; - int temp; - char syncchar; /* synchronization indicator */ - char qualchar; /* quality indicator */ - char leapchar; /* leap indicator */ - - /* - * Initialize pointers and read the timecode and timestamp - */ - peer = (struct peer *)rbufp->recv_srcclock; - pp = peer->procptr; - up = (struct wwvbunit *)pp->unitptr; - temp = refclock_gtlin(rbufp, pp->lastcode, BMAX, &trtmp); - - /* - * Note we get a buffer and timestamp for both a <cr> and <lf>, - * but only the <cr> timestamp is retained. Note: in format 0 on - * a Netclock/2 or upgraded 8170 the start bit is delayed 100 - * +-50 us relative to the pps; however, on an unmodified 8170 - * the start bit can be delayed up to 10 ms. In format 2 the - * reading precision is only to the millisecond. Thus, unless - * you have a pps gadget and don't have to have the year, format - * 0 provides the lowest jitter. - */ - if (temp == 0) { - if (up->tcswitch == 0) { - up->tcswitch = 1; - up->laststamp = trtmp; - } else - up->tcswitch = 0; - return; - } - pp->lencode = temp; - pp->lastrec = up->laststamp; - up->laststamp = trtmp; - up->tcswitch = 1; - up->pollcnt = 2; - record_clock_stats(&peer->srcadr, pp->lastcode); -#ifdef DEBUG - if (debug) - printf("wwvb: timecode %d %s\n", pp->lencode, - pp->lastcode); -#endif - - /* - * We get down to business, check the timecode format and decode - * its contents. This code uses the timecode length to determine - * whether format 0 or format 2. If the timecode has invalid - * length or is not in proper format, we declare bad format and - * exit. - */ - switch (pp->lencode) { - - case LENWWVB0: - - /* - * Timecode format 0: "I ddd hh:mm:ss TZ=nn" - */ - qualchar = leapchar = ' '; - if (sscanf(pp->lastcode, "%c %3d %2d:%2d:%2d", - &syncchar, &pp->day, &pp->hour, &pp->minute, - &pp->second) == 5) - break; - - case LENWWVB2: - - /* - * Timecode format 2: "IQyy ddd hh:mm:ss.mmm LD" - */ - if (sscanf(pp->lastcode, "%c%c %2d %3d %2d:%2d:%2d.%3d %c", - &syncchar, &qualchar, &pp->year, &pp->day, - &pp->hour, &pp->minute, &pp->second, &pp->msec, - &leapchar) == 9) - break; - - default: - - if (up->linect > 0) - up->linect--; - else - refclock_report(peer, CEVNT_BADREPLY); - return; - } - - /* - * Decode synchronization, quality and leap characters. If - * unsynchronized, set the leap bits accordingly and exit. - * Otherwise, set the leap bits according to the leap character. - * Once synchronized, the dispersion depends only on when the - * clock was last heard. The first time the clock is heard, the - * time last heard is faked based on the quality indicator. The - * magic numbers (in seconds) are from the clock specifications. - */ - switch (qualchar) { - - case ' ': - ltemp = 0; - break; - - case 'A': - ltemp = 800; - break; - - case 'B': - ltemp = 5300; - break; - - case 'C': - ltemp = 25300; - break; - - case 'D': - ltemp = NTP_MAXAGE; - break; - - default: - refclock_report(peer, CEVNT_BADREPLY); - return; - } - if (syncchar != ' ') - pp->leap = LEAP_NOTINSYNC; - else { - if (leapchar == 'L') - pp->leap = LEAP_ADDSECOND; - else - pp->leap = 0; - pp->lasttime = current_time - ltemp; - } - - /* - * If the monitor flag is set (flag4), we dump the internal - * quality table at the first timecode beginning the day. - */ - if (pp->sloppyclockflag & CLK_FLAG4 && pp->hour < - up->lasthour) - up->linect = MONLIN; - up->lasthour = pp->hour; - - /* - * Process the new sample in the median filter and determine the - * reference clock offset and dispersion. We use lastrec as both - * the reference time and receive time in order to avoid being - * cute, like setting the reference time later than the receive - * time, which may cause a paranoid protocol module to chuck out - * the data. - */ - if (!refclock_process(pp, NSAMPLES, NSAMPLES)) { - refclock_report(peer, CEVNT_BADTIME); - return; - } - trtmp = pp->lastrec; - trtmp.l_ui -= ltemp; - refclock_receive(peer, &pp->offset, 0, pp->dispersion, - &trtmp, &pp->lastrec, pp->leap); -} - - -/* - * wwvb_poll - called by the transmit procedure - */ -static void -wwvb_poll(unit, peer) - int unit; - struct peer *peer; -{ - register struct wwvbunit *up; - struct refclockproc *pp; - char poll; - - /* - * Time to poll the clock. The Spectracom clock responds to a - * 'T' by returning a timecode in the format(s) specified above. - * Note there is no checking on state, since this may not be the - * only customer reading the clock. Only one customer need poll - * the clock; all others just listen in. If nothing is heard - * from the clock for two polls, declare a timeout and keep - * going. - */ - pp = peer->procptr; - up = (struct wwvbunit *)pp->unitptr; - if (up->pollcnt == 0) - refclock_report(peer, CEVNT_TIMEOUT); - else - up->pollcnt--; - if (up->linect > 0) - poll = 'R'; - else - poll = 'T'; - if (write(pp->io.fd, &poll, 1) != 1) { - refclock_report(peer, CEVNT_FAULT); - } else - pp->polls++; -} - -#endif diff --git a/usr.sbin/xntpd/xntpdc/Makefile b/usr.sbin/xntpd/xntpdc/Makefile deleted file mode 100644 index 8c8a1a2b1afd..000000000000 --- a/usr.sbin/xntpd/xntpdc/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# -# $FreeBSD$ -# - -CFLAGS+= -I${.CURDIR}/../include - -DPADD= ${LIBNTP} ${LIBEDIT} ${LIBTERMCAP} -LDADD= ${LIBNTP} -ledit -ltermcap - -PROG= xntpdc -MAN8= ${.CURDIR}/../doc/xntpdc.8 -CLEANFILES+= .version version.c - -SRCS= ntpdc.c ntpdc_ops.c version.c - -version.c: ${.CURDIR}/../VERSION - sh -e ${.CURDIR}/../scripts/mkversion xntpdc - -.include <bsd.prog.mk> diff --git a/usr.sbin/xntpd/xntpdc/README b/usr.sbin/xntpd/xntpdc/README deleted file mode 100644 index 9d0b661e6c09..000000000000 --- a/usr.sbin/xntpd/xntpdc/README +++ /dev/null @@ -1,6 +0,0 @@ -README file for directory ./xntpdc of the NTP Version 3 distribution - -This directory contains the sources for the xntpdc utility program. See -the README and RELNOTES files in the parent directory for directions on -how to make and install this program. The current version number of this -program is in the version.c file. diff --git a/usr.sbin/xntpd/xntpdc/ntpdc.c b/usr.sbin/xntpd/xntpdc/ntpdc.c deleted file mode 100644 index dd090693f37d..000000000000 --- a/usr.sbin/xntpd/xntpdc/ntpdc.c +++ /dev/null @@ -1,1560 +0,0 @@ -/* - * xntpdc - control and monitor your xntpd daemon - */ -#include <stdio.h> -#include <ctype.h> -#include <signal.h> -#include <setjmp.h> -#include <sys/types.h> -#include <sys/time.h> -#include <netdb.h> -#include <histedit.h> - -#include "ntpdc.h" -#include "ntp_select.h" -#include "ntp_io.h" -#include "ntp_stdlib.h" - -/* - * Because we now potentially understand a lot of commands (and - * it requires a lot of commands to talk to xntpd) we will run - * interactive if connected to a terminal. - */ -static int interactive = 0; /* set to 1 when we should prompt */ -static char * prompt = "xntpdc> "; /* prompt to ask him about */ - - -/* - * Keyid used for authenticated requests. Obtained on the fly. - */ -static u_long info_auth_keyid; - -/* - * Type of key md5 or des - */ -#define KEY_TYPE_DES 3 -#define KEY_TYPE_MD5 4 - -static int info_auth_keytype = KEY_TYPE_DES; /* DES */ - - -/* - * Built in command handler declarations - */ -static int openhost P((char *)); -static int sendpkt P((char *, int)); -static void growpktdata P((void)); -static int getresponse P((int, int, int *, int *, char **)); -static int sendrequest P((int, int, int, int, int, char *)); -static void getcmds P((void)); -static RETSIGTYPE abortcmd P((int)); -static void docmd P((char *)); -static void tokenize P((char *, char **, int *)); -static int findcmd P((char *, struct xcmd *, struct xcmd *, struct xcmd **)); -static int getarg P((char *, int, arg_v *)); -static int getnetnum P((char *, u_long *, char *)); -static void help P((struct parse *, FILE *)); -#if defined(sgi) || defined(SYS_BSDI) || defined(__STDC__) -static int helpsort P((const void *, const void *)); -#else -static int helpsort P((char **, char **)); -#endif /* sgi */ -static void printusage P((struct xcmd *, FILE *)); -static void timeout P((struct parse *, FILE *)); -static void delay P((struct parse *, FILE *)); -static void host P((struct parse *, FILE *)); -static void keyid P((struct parse *, FILE *)); -static void keytype P((struct parse *, FILE *)); -static void passwd P((struct parse *, FILE *)); -static void hostnames P((struct parse *, FILE *)); -static void setdebug P((struct parse *, FILE *)); -static void quit P((struct parse *, FILE *)); -static void version P((struct parse *, FILE *)); -static void warning P((char *, char *, char *)); -static void error P((char *, char *, char *)); -static u_long getkeyid P((char *)); - - -/* - * Built-in commands we understand - */ -static struct xcmd builtins[] = { - { "?", help, { OPT|NTP_STR, NO, NO, NO }, - { "command", "", "", "" }, - "tell the use and syntax of commands" }, - { "help", help, { OPT|NTP_STR, NO, NO, NO }, - { "command", "", "", "" }, - "tell the use and syntax of commands" }, - { "timeout", timeout, { OPT|UINT, NO, NO, NO }, - { "msec", "", "", "" }, - "set the primary receive time out" }, - { "delay", delay, { OPT|INT, NO, NO, NO }, - { "msec", "", "", "" }, - "set the delay added to encryption time stamps" }, - { "host", host, { OPT|NTP_STR, NO, NO, NO }, - { "hostname", "", "", "" }, - "specify the host whose NTP server we talk to" }, - { "passwd", passwd, { OPT|NTP_STR, NO, NO, NO }, - { "", "", "", "" }, - "specify a password to use for authenticated requests"}, - { "hostnames", hostnames, { OPT|NTP_STR, NO, NO, NO }, - { "yes|no", "", "", "" }, - "specify whether hostnames or net numbers are printed"}, - { "debug", setdebug, { OPT|NTP_STR, NO, NO, NO }, - { "no|more|less", "", "", "" }, - "set/change debugging level" }, - { "quit", quit, { NO, NO, NO, NO }, - { "", "", "", "" }, - "exit xntpdc" }, - { "keyid", keyid, { OPT|UINT, NO, NO, NO }, - { "key#", "", "", "" }, - "set keyid to use for authenticated requests" }, - { "keytype", keytype, { NTP_STR, NO, NO, NO }, - { "key type (md5|des)", "", "", "" }, - "set key type to use for authenticated requests (des|md5)" }, - { "version", version, { NO, NO, NO, NO }, - { "", "", "", "" }, - "print version number" }, - { 0, 0, { NO, NO, NO, NO }, - { "", "", "", "" }, "" } -}; - - -/* - * Default values we use. - */ -#define DEFTIMEOUT (5) /* 5 second time out */ -#define DEFSTIMEOUT (2) /* 2 second time out after first */ -#define DEFDELAY 0x51EB852 /* 20 milliseconds, l_fp fraction */ -#define DEFHOST "localhost" /* default host name */ -#define LENHOSTNAME 256 /* host name is 256 characters long */ -#define MAXCMDS 100 /* maximum commands on cmd line */ -#define MAXHOSTS 100 /* maximum hosts on cmd line */ -#define MAXLINE 512 /* maximum line length */ -#define MAXTOKENS (1+MAXARGS+2) /* maximum number of usable tokens */ - -/* - * Some variables used and manipulated locally - */ -static struct timeval tvout = { DEFTIMEOUT, 0 }; /* time out for reads */ -static struct timeval tvsout = { DEFSTIMEOUT, 0 }; /* secondary time out */ -static l_fp delay_time; /* delay time */ -static char currenthost[LENHOSTNAME]; /* current host name */ -static struct sockaddr_in hostaddr = { 0 }; /* host address */ -static int showhostnames = 1; /* show host names by default */ - -static int sockfd; /* fd socket is openned on */ -static int havehost = 0; /* set to 1 when host open */ - struct servent *server_entry = NULL; /* server entry for ntp */ - -/* - * Holds data returned from queries. We allocate INITDATASIZE - * octets to begin with, increasing this as we need to. - */ -#define INITDATASIZE (sizeof(struct resp_pkt) * 16) -#define INCDATASIZE (sizeof(struct resp_pkt) * 8) - -static char *pktdata; -static int pktdatasize; - -/* - * For commands typed on the command line (with the -c option) - */ -static int numcmds = 0; -static char *ccmds[MAXCMDS]; -#define ADDCMD(cp) if (numcmds < MAXCMDS) ccmds[numcmds++] = (cp) - -/* - * When multiple hosts are specified. - */ -static int numhosts = 0; -static char *chosts[MAXHOSTS]; -#define ADDHOST(cp) if (numhosts < MAXHOSTS) chosts[numhosts++] = (cp) - -/* - * Error codes for internal use - */ -#define ERR_INCOMPLETE 16 -#define ERR_TIMEOUT 17 - -/* - * Macro definitions we use - */ -#define ISSPACE(c) ((c) == ' ' || (c) == '\t') -#define ISEOL(c) ((c) == '\n' || (c) == '\r' || (c) == '\0') -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - -/* - * For converting time stamps to dates - */ -#define JAN_1970 2208988800 /* 1970 - 1900 in seconds */ - -/* - * Jump buffer for longjumping back to the command level - */ -static jmp_buf interrupt_buf; -static int jump = 0; - -/* - * Pointer to current output unit - */ -static FILE *current_output; - -/* - * Command table imported from ntpdc_ops.c - */ -extern struct xcmd opcmds[]; - -char *progname; -int debug; - -/* - * main - parse arguments and handle options - */ -int -main(argc, argv) -int argc; -char *argv[]; -{ - int c; - int errflg = 0; - extern int ntp_optind; - extern char *ntp_optarg; - - delay_time.l_ui = 0; - delay_time.l_uf = DEFDELAY; - - progname = argv[0]; - while ((c = ntp_getopt(argc, argv, "c:dilnps")) != EOF) - switch (c) { - case 'c': - ADDCMD(ntp_optarg); - break; - case 'd': - ++debug; - break; - case 'i': - interactive = 1; - break; - case 'l': - ADDCMD("listpeers"); - break; - case 'n': - showhostnames = 0; - break; - case 'p': - ADDCMD("peers"); - break; - case 's': - ADDCMD("dmpeers"); - break; - default: - errflg++; - break; - } - if (errflg) { - (void) fprintf(stderr, - "usage: %s [-dilnps] [-c cmd] host ...\n", - progname); - exit(2); - } - if (ntp_optind == argc) { - ADDHOST(DEFHOST); - } else { - for (; ntp_optind < argc; ntp_optind++) - ADDHOST(argv[ntp_optind]); - } - - if (numcmds == 0 && interactive == 0 - && isatty(fileno(stdin)) && isatty(fileno(stderr))) { - interactive = 1; - } - - if (interactive) - (void) signal_no_reset(SIGINT, abortcmd); - - /* - * Initialize the packet data buffer - */ - pktdata = (char *)malloc(INITDATASIZE); - if (pktdata == NULL) { - (void) fprintf(stderr, "%s: malloc() failed!\n", progname); - exit(1); - } - pktdatasize = INITDATASIZE; - - if (numcmds == 0) { - (void) openhost(chosts[0]); - getcmds(); - } else { - int ihost; - int icmd; - - for (ihost = 0; ihost < numhosts; ihost++) { - if (openhost(chosts[ihost])) - for (icmd = 0; icmd < numcmds; icmd++) { - if (numhosts > 1) - printf ("--- %s ---\n",chosts[ihost]); - docmd(ccmds[icmd]); - } - } - } - exit(0); -} - - -/* - * openhost - open a socket to a host - */ -static int -openhost(hname) - char *hname; -{ - u_long netnum; - char temphost[LENHOSTNAME]; - - if (server_entry == NULL) { - server_entry = getservbyname("ntp", "udp"); - if (server_entry == NULL) { - (void) fprintf(stderr, "%s: ntp/udp: unknown service\n", - progname); - exit(1); - } - if (debug > 2) - printf("Got ntp/udp service entry\n"); - } - - if (!getnetnum(hname, &netnum, temphost)) - return 0; - - if (debug > 2) - printf("Opening host %s\n", temphost); - - if (havehost == 1) { - if (debug > 2) - printf("Closing old host %s\n", currenthost); - (void) close(sockfd); - havehost = 0; - } - (void) strcpy(currenthost, temphost); - - hostaddr.sin_family = AF_INET; - hostaddr.sin_port = server_entry->s_port; - hostaddr.sin_addr.s_addr = netnum; - - sockfd = socket(AF_INET, SOCK_DGRAM, 0); - if (sockfd == -1) - error("socket", "", ""); - -#if defined(SYS_HPUX) && (SYS_HPUX < 8) -#ifdef SO_RCVBUF - { int rbufsize = INITDATASIZE + 2048; /* 2K for slop */ - if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, - &rbufsize, sizeof(int)) == -1) - error("setsockopt", "", ""); - } -#endif -#endif - - if (connect(sockfd, (struct sockaddr *)&hostaddr, - sizeof(hostaddr)) == -1) - error("connect", "", ""); - - havehost = 1; - return 1; -} - - -/* XXX ELIMINATE sendpkt similar in ntpq.c, ntpdc.c, ntp_io.c, ntptrace.c */ -/* - * sendpkt - send a packet to the remote host - */ -static int -sendpkt(xdata, xdatalen) - char *xdata; - int xdatalen; -{ - if (write(sockfd, xdata, xdatalen) == -1) { - warning("write to %s failed", currenthost, ""); - return -1; - } - - return 0; -} - - -/* - * growpktdata - grow the packet data area - */ -static void -growpktdata() -{ - pktdatasize += INCDATASIZE; - pktdata = (char *)realloc(pktdata, pktdatasize); - if (pktdata == 0) { - (void) fprintf(stderr, "%s: realloc() failed!\n", progname); - exit(1); - } -} - - -/* - * getresponse - get a (series of) response packet(s) and return the data - */ -static int -getresponse(implcode, reqcode, ritems, rsize, rdata) - int implcode; - int reqcode; - int *ritems; - int *rsize; - char **rdata; -{ - struct resp_pkt rpkt; - struct timeval tvo; - int items; - int size; - int datasize; - char *datap; - char haveseq[MAXSEQ+1]; - int firstpkt; - int lastseq; - int numrecv; - int seq; - fd_set fds; - int n; - - /* - * This is pretty tricky. We may get between 1 and many packets - * back in response to the request. We peel the data out of - * each packet and collect it in one long block. When the last - * packet in the sequence is received we'll know how many we - * should have had. Note we use one long time out, should reconsider. - */ - *ritems = 0; - *rsize = 0; - firstpkt = 1; - numrecv = 0; - *rdata = datap = pktdata; - lastseq = 999; /* too big to be a sequence number */ - memset(haveseq, 0, sizeof(haveseq)); - FD_ZERO(&fds); - -again: - if (firstpkt) - tvo = tvout; - else - tvo = tvsout; - - FD_SET(sockfd, &fds); - n = select(sockfd+1, &fds, (fd_set *)0, (fd_set *)0, &tvo); - - if (n == -1) { - warning("select fails", "", ""); - return -1; - } - if (n == 0) { - /* - * Timed out. Return what we have - */ - if (firstpkt) { - (void) fprintf(stderr, - "%s: timed out, nothing received\n", currenthost); - return ERR_TIMEOUT; - } else { - (void) fprintf(stderr, - "%s: timed out with incomplete data\n", - currenthost); - if (debug) { - printf("Received sequence numbers"); - for (n = 0; n <= MAXSEQ; n++) - if (haveseq[n]) - printf(" %d,", n); - if (lastseq != 999) - printf(" last frame received\n"); - else - printf(" last frame not received\n"); - } - return ERR_INCOMPLETE; - } - } - - n = read(sockfd, (char *)&rpkt, sizeof(rpkt)); - if (n == -1) { - warning("read", "", ""); - return -1; - } - - - /* - * Check for format errors. Bug proofing. - */ - if (n < RESP_HEADER_SIZE) { - if (debug) - printf("Short (%d byte) packet received\n", n); - goto again; - } - if (INFO_VERSION(rpkt.rm_vn_mode) != NTP_VERSION) { - if (debug) - printf("Packet received with version %d\n", - INFO_VERSION(rpkt.rm_vn_mode)); - goto again; - } - if (INFO_MODE(rpkt.rm_vn_mode) != MODE_PRIVATE) { - if (debug) - printf("Packet received with mode %d\n", - INFO_MODE(rpkt.rm_vn_mode)); - goto again; - } - if (INFO_IS_AUTH(rpkt.auth_seq)) { - if (debug) - printf("Encrypted packet received\n"); - goto again; - } - if (!ISRESPONSE(rpkt.rm_vn_mode)) { - if (debug) - printf("Received request packet, wanted response\n"); - goto again; - } - if (INFO_MBZ(rpkt.mbz_itemsize) != 0) { - if (debug) - printf("Received packet with nonzero MBZ field!\n"); - goto again; - } - - /* - * Check implementation/request. Could be old data getting to us. - */ - if (rpkt.implementation != implcode || rpkt.request != reqcode) { - if (debug) - printf( - "Received implementation/request of %d/%d, wanted %d/%d", - rpkt.implementation, rpkt.request, - implcode, reqcode); - goto again; - } - - /* - * Check the error code. If non-zero, return it. - */ - if (INFO_ERR(rpkt.err_nitems) != INFO_OKAY) { - if (debug && ISMORE(rpkt.rm_vn_mode)) { - printf("Error code %d received on not-final packet\n", - INFO_ERR(rpkt.err_nitems)); - } - return (int)INFO_ERR(rpkt.err_nitems); - } - - - /* - * Collect items and size. Make sure they make sense. - */ - items = INFO_NITEMS(rpkt.err_nitems); - size = INFO_ITEMSIZE(rpkt.mbz_itemsize); - - if ((datasize = items*size) > (n-RESP_HEADER_SIZE)) { - if (debug) - printf( - "Received items %d, size %d (total %d), data in packet is %d\n", - items, size, datasize, n-RESP_HEADER_SIZE); - goto again; - } - - /* - * If this isn't our first packet, make sure the size matches - * the other ones. - */ - if (!firstpkt && size != *rsize) { - if (debug) - printf("Received itemsize %d, previous %d\n", - size, *rsize); - goto again; - } - - /* - * If we've received this before, toss it - */ - seq = INFO_SEQ(rpkt.auth_seq); - if (haveseq[seq]) { - if (debug) - printf("Received duplicate sequence number %d\n", seq); - goto again; - } - haveseq[seq] = 1; - - /* - * If this is the last in the sequence, record that. - */ - if (!ISMORE(rpkt.rm_vn_mode)) { - if (lastseq != 999) { - printf("Received second end sequence packet\n"); - goto again; - } - lastseq = seq; - } - - /* - * So far, so good. Copy this data into the output array. - */ - if ((datap + datasize) > (pktdata + pktdatasize)) { - int offset = datap - pktdata; - growpktdata(); - *rdata = pktdata; /* might have been realloced ! */ - datap = pktdata + offset; - } - memmove(datap, (char *)rpkt.data, datasize); - datap += datasize; - if (firstpkt) { - firstpkt = 0; - *rsize = size; - } - *ritems += items; - - /* - * Finally, check the count of received packets. If we've got them - * all, return - */ - ++numrecv; - if (numrecv <= lastseq) - goto again; - return INFO_OKAY; -} - - -/* - * sendrequest - format and send a request packet - */ -static int -sendrequest(implcode, reqcode, auth, qitems, qsize, qdata) - int implcode; - int reqcode; - int auth; - int qitems; - int qsize; - char *qdata; -{ - struct req_pkt qpkt; - int datasize; - - memset((char *)&qpkt, 0, sizeof qpkt); - - qpkt.rm_vn_mode = RM_VN_MODE(0, 0); - qpkt.implementation = (u_char)implcode; - qpkt.request = (u_char)reqcode; - - datasize = qitems * qsize; - if (datasize != 0 && qdata != NULL) { - memmove((char *)qpkt.data, qdata, datasize); - qpkt.err_nitems = ERR_NITEMS(0, qitems); - qpkt.mbz_itemsize = MBZ_ITEMSIZE(qsize); - } else { - qpkt.err_nitems = ERR_NITEMS(0, 0); - qpkt.mbz_itemsize = MBZ_ITEMSIZE(0); - } - - if (!auth) { - qpkt.auth_seq = AUTH_SEQ(0, 0); - return sendpkt((char *)&qpkt, REQ_LEN_NOMAC); - } else { - l_fp ts; - char *pass; - - if (info_auth_keyid == 0) { - info_auth_keyid = getkeyid("Keyid: "); - if (info_auth_keyid == 0) { - (void) fprintf(stderr, - "Keyid must be defined, request not sent\n"); - return 1; - } - } - if (!auth_havekey(info_auth_keyid)) { - pass = getpass("Password: "); - if (*pass != '\0') - authusekey(info_auth_keyid, info_auth_keytype, - pass); - } - if (auth_havekey(info_auth_keyid)) { - int maclen; - - qpkt.auth_seq = AUTH_SEQ(1, 0); - qpkt.keyid = htonl(info_auth_keyid); - auth1crypt(info_auth_keyid, (U_LONG *)&qpkt, - REQ_LEN_NOMAC); - gettstamp(&ts); - L_ADD(&ts, &delay_time); - HTONL_FP(&ts, &qpkt.tstamp); - maclen = auth2crypt(info_auth_keyid, (U_LONG *)&qpkt, - REQ_LEN_NOMAC); - return sendpkt((char *)&qpkt, REQ_LEN_NOMAC+maclen); - } else { - (void) fprintf(stderr, - "No password, request not sent\n"); - return 1; - } - } - /*NOTREACHED*/ -} - - -/* - * doquery - send a request and process the response - */ -int -doquery(implcode, reqcode, auth, qitems, qsize, qdata, ritems, rsize, rdata, - quiet_mask) - int implcode; - int reqcode; - int auth; - int qitems; - int qsize; - char *qdata; - int *ritems; - int *rsize; - char **rdata; - int quiet_mask; -{ - int res; - char junk[512]; - fd_set fds; - struct timeval tvzero; - - /* - * Check to make sure host is open - */ - if (!havehost) { - (void) fprintf(stderr, "***No host open, use `host' command\n"); - return -1; - } - - /* - * Poll the socket and clear out any pending data - */ - do { - tvzero.tv_sec = tvzero.tv_usec = 0; - FD_ZERO(&fds); - FD_SET(sockfd, &fds); - res = select(sockfd+1, &fds, (fd_set *)0, (fd_set *)0, &tvzero); - - if (res == -1) { - warning("polling select", "", ""); - return -1; - } else if (res > 0) - (void) read(sockfd, junk, sizeof junk); - } while (res > 0); - - - /* - * send a request - */ - res = sendrequest(implcode, reqcode, auth, qitems, qsize, qdata); - if (res != 0) - return res; - - /* - * Get the response. If we got a standard error, print a message - */ - res = getresponse(implcode, reqcode, ritems, rsize, rdata); - - /* log error message if not told to be quiet */ - if ((res > 0) && (((1 << res) & quiet_mask) == 0)) { - switch(res) { - case INFO_ERR_IMPL: - (void) fprintf(stderr, - "***Server implementation incompatable with our own\n"); - break; - case INFO_ERR_REQ: - (void) fprintf(stderr, - "***Server doesn't implement this request\n"); - break; - case INFO_ERR_FMT: - (void) fprintf(stderr, -"***Server reports a format error in the received packet (shouldn't happen)\n"); - break; - case INFO_ERR_NODATA: - (void) fprintf(stderr, - "***Server reports data not found\n"); - break; - case INFO_ERR_AUTH: - (void) fprintf(stderr, "***Permission denied\n"); - break; - case ERR_TIMEOUT: - (void) fprintf(stderr, "***Request timed out\n"); - break; - case ERR_INCOMPLETE: - (void) fprintf(stderr, - "***Response from server was incomplete\n"); - break; - default: - (void) fprintf(stderr, - "***Server returns unknown error code %d\n", res); - break; - } - } - return res; -} - -const char * -xntpdc_prompt() -{ - return (prompt); -} - -/* - * getcmds - read commands from the standard input and execute them - */ -static void -getcmds() -{ - static EditLine *el = NULL; - static History *hist = NULL; - char line[MAXLINE]; - int num = 0; - int len; - const char *bp = NULL; - - for (;;) { - if (interactive) { - if (!el) { - el = el_init("xntpdc", stdin, stdout); - hist = history_init(); - history(hist, H_EVENT, 100); - el_set(el, EL_HIST, history, hist); - el_set(el, EL_EDITOR, "emacs"); - el_set(el, EL_PROMPT, xntpdc_prompt); - el_set(el, EL_SIGNAL, 1); - el_source(el, NULL); - } - if ((bp = el_gets(el, &num)) == NULL || num == 0) - return; - - len = (num > MAXLINE) ? MAXLINE : num; - memcpy(line, bp, len); - line[len] = 0; - history(hist, H_ENTER, bp); - - } else { - if (fgets(line, sizeof line, stdin) == NULL) - return; - } - - docmd(line); - } -} - - -/* - * abortcmd - catch interrupts and abort the current command - */ -static RETSIGTYPE -abortcmd(sig) -int sig; -{ - if (current_output == stdout) - (void) fflush(stdout); - putc('\n', stderr); - (void) fflush(stderr); - if (jump) longjmp(interrupt_buf, 1); -} - - -/* - * docmd - decode the command line and execute a command - */ -static void -docmd(cmdline) - char *cmdline; -{ - char *tokens[1+MAXARGS+2]; - struct parse pcmd; - int ntok; - static int i; - struct xcmd *xcmd; - - /* - * Tokenize the command line. If nothing on it, return. - */ - tokenize(cmdline, tokens, &ntok); - if (ntok == 0) - return; - - /* - * Find the appropriate command description. - */ - i = findcmd(tokens[0], builtins, opcmds, &xcmd); - if (i == 0) { - (void) fprintf(stderr, "***Command `%s' unknown\n", - tokens[0]); - return; - } else if (i >= 2) { - (void) fprintf(stderr, "***Command `%s' ambiguous\n", - tokens[0]); - return; - } - - /* - * Save the keyword, then walk through the arguments, interpreting - * as we go. - */ - pcmd.keyword = tokens[0]; - pcmd.nargs = 0; - for (i = 0; i < MAXARGS && xcmd->arg[i] != NO; i++) { - if ((i+1) >= ntok) { - if (!(xcmd->arg[i] & OPT)) { - printusage(xcmd, stderr); - return; - } - break; - } - if ((xcmd->arg[i] & OPT) && (*tokens[i+1] == '>')) - break; - if (!getarg(tokens[i+1], (int)xcmd->arg[i], &pcmd.argval[i])) - return; - pcmd.nargs++; - } - - i++; - if (i < ntok && *tokens[i] == '>') { - char *fname; - - if (*(tokens[i]+1) != '\0') - fname = tokens[i]+1; - else if ((i+1) < ntok) - fname = tokens[i+1]; - else { - (void) fprintf(stderr, "***No file for redirect\n"); - return; - } - - current_output = fopen(fname, "w"); - if (current_output == NULL) { - (void) fprintf(stderr, "***Error opening %s: ", fname); - perror(""); - return; - } - i = 1; /* flag we need a close */ - } else { - current_output = stdout; - i = 0; /* flag no close */ - } - - if (interactive && setjmp(interrupt_buf)) { - return; - } else { - jump = 1; - (xcmd->handler)(&pcmd, current_output); - jump = 0; - if (i) (void) fclose(current_output); - } -} - - -/* - * tokenize - turn a command line into tokens - */ -static void -tokenize(line, tokens, ntok) - char *line; - char **tokens; - int *ntok; -{ - register char *cp; - register char *sp; - static char tspace[MAXLINE]; - - sp = tspace; - cp = line; - for (*ntok = 0; *ntok < MAXTOKENS; (*ntok)++) { - tokens[*ntok] = sp; - while (ISSPACE(*cp)) - cp++; - if (ISEOL(*cp)) - break; - do { - *sp++ = *cp++; - } while (!ISSPACE(*cp) && !ISEOL(*cp)); - - *sp++ = '\0'; - } -} - - - -/* - * findcmd - find a command in a command description table - */ -static int -findcmd(str, clist1, clist2, cmd) - register char *str; - struct xcmd *clist1; - struct xcmd *clist2; - struct xcmd **cmd; -{ - register struct xcmd *cl; - register int clen; - int nmatch; - struct xcmd *nearmatch = NULL; - struct xcmd *clist; - - clen = strlen(str); - nmatch = 0; - if (clist1 != 0) - clist = clist1; - else if (clist2 != 0) - clist = clist2; - else - return 0; - -again: - for (cl = clist; cl->keyword != 0; cl++) { - /* do a first character check, for efficiency */ - if (*str != *(cl->keyword)) - continue; - if (strncmp(str, cl->keyword, clen) == 0) { - /* - * Could be extact match, could be approximate. - * Is exact if the length of the keyword is the - * same as the str. - */ - if (*((cl->keyword) + clen) == '\0') { - *cmd = cl; - return 1; - } - nmatch++; - nearmatch = cl; - } - } - - /* - * See if there is more to do. If so, go again. Sorry about the - * goto, too much looking at BSD sources... - */ - if (clist == clist1 && clist2 != 0) { - clist = clist2; - goto again; - } - - /* - * If we got extactly 1 near match, use it, else return number - * of matches. - */ - if (nmatch == 1) { - *cmd = nearmatch; - return 1; - } - return nmatch; -} - - -/* - * getarg - interpret an argument token - */ -static int -getarg(str, code, argp) - char *str; - int code; - arg_v *argp; -{ - int isneg; - char *cp, *np; - static char *digits = "0123456789"; - - switch (code & ~OPT) { - case NTP_STR: - argp->string = str; - break; - case ADD: - if (!getnetnum(str, &(argp->netnum), (char *)0)) { - return 0; - } - break; - case INT: - case UINT: - isneg = 0; - np = str; - if (*np == '-') { - np++; - isneg = 1; - } - - argp->uval = 0; - do { - cp = strchr(digits, *np); - if (cp == NULL) { - (void) fprintf(stderr, - "***Illegal integer value %s\n", str); - return 0; - } - argp->uval *= 10; - argp->uval += (cp - digits); - } while (*(++np) != '\0'); - - if (isneg) { - if ((code & ~OPT) == UINT) { - (void) fprintf(stderr, - "***Value %s should be unsigned\n", str); - return 0; - } - argp->ival = -argp->ival; - } - break; - } - - return 1; -} - - -/* - * getnetnum - given a host name, return its net number - * and (optional) full name - */ -static int -getnetnum(host, num, fullhost) - char *host; - u_long *num; - char *fullhost; -{ - struct hostent *hp; - - if (decodenetnum(host, num)) { - if (fullhost != 0) { - (void) sprintf(fullhost, - "%u.%u.%u.%u", (u_int)((htonl(*num)>>24)&0xff), - (u_int)((htonl(*num)>>16)&0xff), (u_int)((htonl(*num)>>8)&0xff), - (u_int)(htonl(*num)&0xff)); - } - return 1; - } else if ((hp = gethostbyname(host)) != 0) { - memmove((char *)num, hp->h_addr, sizeof(u_long)); - if (fullhost != 0) - (void) strcpy(fullhost, hp->h_name); - return 1; - } else { - (void) fprintf(stderr, "***Can't find host %s\n", host); - return 0; - } - /*NOTREACHED*/ -} - -/* - * nntohost - convert network number to host name. This routine enforces - * the showhostnames setting. - */ -char * -nntohost(netnum) - u_long netnum; -{ - if (!showhostnames) - return numtoa(netnum); - if ((ntohl(netnum) & REFCLOCK_MASK) == REFCLOCK_ADDR) - return refnumtoa(netnum); - return numtohost(netnum); -} - - -/* - * Finally, the built in command handlers - */ - -/* - * help - tell about commands, or details of a particular command - */ -static void -help(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - int i; - int n; - struct xcmd *xcp; - char *cmd; - char *cmdsort[100]; - int length[100]; - int maxlength; - int numperline; - static char *spaces = " "; /* 20 spaces */ - - if (pcmd->nargs == 0) { - n = 0; - for (xcp = builtins; xcp->keyword != 0; xcp++) { - if (*(xcp->keyword) != '?') - cmdsort[n++] = xcp->keyword; - } - for (xcp = opcmds; xcp->keyword != 0; xcp++) - cmdsort[n++] = xcp->keyword; - -#if defined(sgi) || defined(SYS_BSDI) || defined(__STDC__) - qsort((void *)cmdsort, n, sizeof(char *), helpsort); -#else - qsort((char *)cmdsort, n, sizeof(char *), helpsort); -#endif /* sgi */ - - maxlength = 0; - for (i = 0; i < n; i++) { - length[i] = strlen(cmdsort[i]); - if (length[i] > maxlength) - maxlength = length[i]; - } - maxlength++; - numperline = 76 / maxlength; - - (void) fprintf(fp, "Commands available:\n"); - for (i = 0; i < n; i++) { - if ((i % numperline) == (numperline-1) - || i == (n-1)) - (void) fprintf(fp, "%s\n", cmdsort[i]); - else - (void) fprintf(fp, "%s%s", cmdsort[i], - spaces+20-maxlength+length[i]); - } - } else { - cmd = pcmd->argval[0].string; - n = findcmd(cmd, builtins, opcmds, &xcp); - if (n == 0) { - (void) fprintf(stderr, - "Command `%s' is unknown\n", cmd); - return; - } else if (n >= 2) { - (void) fprintf(stderr, - "Command `%s' is ambiguous\n", cmd); - return; - } - (void) fprintf(fp, "function: %s\n", xcp->comment); - printusage(xcp, fp); - } -} - - -/* - * helpsort - do hostname qsort comparisons - */ -static int -#if defined(sgi) || defined(SYS_BSDI) || defined(__STDC__) -helpsort(t1, t2) - const void *t1; - const void *t2; -{ - const char **name1 = (const char **)t1; - const char **name2 = (const char **)t2; -#else -helpsort(name1, name2) - char **name1; - char **name2; -{ -#endif /* sgi || bsdi */ - return strcmp(*name1, *name2); -} - - -/* - * printusage - print usage information for a command - */ -static void -printusage(xcp, fp) - struct xcmd *xcp; - FILE *fp; -{ - register int i; - - (void) fprintf(fp, "usage: %s", xcp->keyword); - for (i = 0; i < MAXARGS && xcp->arg[i] != NO; i++) { - if (xcp->arg[i] & OPT) - (void) fprintf(fp, " [ %s ]", xcp->desc[i]); - else - (void) fprintf(fp, " %s", xcp->desc[i]); - } - (void) fprintf(fp, "\n"); -} - - -/* - * timeout - set time out time - */ -static void -timeout(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - int val; - - if (pcmd->nargs == 0) { - val = tvout.tv_sec * 1000 + tvout.tv_usec / 1000; - (void) fprintf(fp, "primary timeout %d ms\n", val); - } else { - tvout.tv_sec = pcmd->argval[0].uval / 1000; - tvout.tv_usec = (pcmd->argval[0].uval - (tvout.tv_sec * 1000)) - * 1000; - } -} - - -/* - * delay - set delay for auth requests - */ -static void -delay(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - int isneg; - u_long val; - - if (pcmd->nargs == 0) { - val = delay_time.l_ui * 1000 + delay_time.l_uf / 4294967; - (void) fprintf(fp, "delay %lu ms\n", val); - } else { - if (pcmd->argval[0].ival < 0) { - isneg = 1; - val = (u_long)(-pcmd->argval[0].ival); - } else { - isneg = 0; - val = (u_long)pcmd->argval[0].ival; - } - - delay_time.l_ui = val / 1000; - val %= 1000; - delay_time.l_uf = val * 4294967; /* 2**32/1000 */ - - if (isneg) - L_NEG(&delay_time); - } -} - - -/* - * host - set the host we are dealing with. - */ -static void -host(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (pcmd->nargs == 0) { - if (havehost) - (void) fprintf(fp, "current host is %s\n", currenthost); - else - (void) fprintf(fp, "no current host\n"); - } else if (openhost(pcmd->argval[0].string)) { - (void) fprintf(fp, "current host set to %s\n", currenthost); - } else { - if (havehost) - (void) fprintf(fp, - "current host remains %s\n", currenthost); - else - (void) fprintf(fp, "still no current host\n"); - } -} - - -/* - * keyid - get a keyid to use for authenticating requests - */ -static void -keyid(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (pcmd->nargs == 0) { - if (info_auth_keyid == 0) - (void) fprintf(fp, "no keyid defined\n"); - else - (void) fprintf(fp, "keyid is %lu\n", info_auth_keyid); - } else { - info_auth_keyid = pcmd->argval[0].uval; - } -} - - -/* - * keytype - get type of key to use for authenticating requests - */ -static void -keytype(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (pcmd->nargs == 0) - fprintf(fp, "keytype is %s", - (info_auth_keytype == KEY_TYPE_MD5) ? "md5" : "des"); - else - switch (*(pcmd->argval[0].string)) { - case 'm': - case 'M': - info_auth_keytype = KEY_TYPE_MD5; - break; - - case 'd': - case 'D': - info_auth_keytype = KEY_TYPE_DES; - break; - - default: - fprintf(fp, "keytype must be 'md5' or 'des'\n"); - } -} - - - -/* - * passwd - get an authentication key - */ -/*ARGSUSED*/ -static void -passwd(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - char *pass; - - if (info_auth_keyid == 0) { - info_auth_keyid = getkeyid("Keyid: "); - if (info_auth_keyid == 0) { - (void)fprintf(fp, "Keyid must be defined\n"); - return; - } - } - if (!interactive) { - authusekey(info_auth_keyid, info_auth_keytype, - pcmd->argval[0].string); - } else { - pass = getpass("Password: "); - if (*pass == '\0') - (void) fprintf(fp, "Password unchanged\n"); - else - authusekey(info_auth_keyid, info_auth_keytype, pass); - } -} - - -/* - * hostnames - set the showhostnames flag - */ -static void -hostnames(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (pcmd->nargs == 0) { - if (showhostnames) - (void) fprintf(fp, "hostnames being shown\n"); - else - (void) fprintf(fp, "hostnames not being shown\n"); - } else { - if (STREQ(pcmd->argval[0].string, "yes")) - showhostnames = 1; - else if (STREQ(pcmd->argval[0].string, "no")) - showhostnames = 0; - else - (void)fprintf(stderr, "What?\n"); - } -} - - -/* - * setdebug - set/change debugging level - */ -static void -setdebug(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (pcmd->nargs == 0) { - (void) fprintf(fp, "debug level is %d\n", debug); - return; - } else if (STREQ(pcmd->argval[0].string, "no")) { - debug = 0; - } else if (STREQ(pcmd->argval[0].string, "more")) { - debug++; - } else if (STREQ(pcmd->argval[0].string, "less")) { - debug--; - } else { - (void) fprintf(fp, "What?\n"); - return; - } - (void) fprintf(fp, "debug level set to %d\n", debug); -} - - -/* - * quit - stop this nonsense - */ -/*ARGSUSED*/ -static void -quit(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - if (havehost) - (void) close(sockfd); /* cleanliness next to godliness */ - exit(0); -} - - -/* - * version - print the current version number - */ -/*ARGSUSED*/ -static void -version(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - extern char *Version; - - (void) fprintf(fp, "%s\n", Version); -} - - -/* - * warning - print a warning message - */ -static void -warning(fmt, st1, st2) - char *fmt; - char *st1; - char *st2; -{ - (void) fprintf(stderr, "%s: ", progname); - (void) fprintf(stderr, fmt, st1, st2); - (void) fprintf(stderr, ": "); - perror(""); -} - - -/* - * error - print a message and exit - */ -static void -error(fmt, st1, st2) - char *fmt; - char *st1; - char *st2; -{ - warning(fmt, st1, st2); - exit(1); -} - -/* - * getkeyid - prompt the user for a keyid to use - */ -static u_long -getkeyid(prompt) -char *prompt; -{ - register char *p; - register c; - FILE *fi; - char pbuf[20]; - - if ((fi = fdopen(open("/dev/tty", 2), "r")) == NULL) - fi = stdin; - else - setbuf(fi, (char *)NULL); - fprintf(stderr, "%s", prompt); fflush(stderr); - for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) { - if (p < &pbuf[18]) - *p++ = c; - } - *p = '\0'; - if (fi != stdin) - fclose(fi); - return (u_long)atoi(pbuf); -} diff --git a/usr.sbin/xntpd/xntpdc/ntpdc.h b/usr.sbin/xntpd/xntpdc/ntpdc.h deleted file mode 100644 index bb2302428216..000000000000 --- a/usr.sbin/xntpd/xntpdc/ntpdc.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * ntpdc.h - definitions of interest to xntpdc - */ -#include "ntp_fp.h" -#include "ntp.h" -#include "ntp_request.h" -#include "ntp_string.h" -#include "ntp_malloc.h" - -/* - * Maximum number of arguments - */ -#define MAXARGS 4 - -/* - * Flags for forming descriptors. - */ -#define OPT 0x80 /* this argument is optional, or'd with type */ - -#define NO 0x0 -#define NTP_STR 0x1 /* string argument */ -#define UINT 0x2 /* unsigned integer */ -#define INT 0x3 /* signed integer */ -#define ADD 0x4 /* IP network address */ - -/* - * Arguments are returned in a union - */ -typedef union { - char *string; - long ival; - u_long uval; - u_long netnum; -} arg_v; - -/* - * Structure for passing parsed command line - */ -struct parse { - char *keyword; - arg_v argval[MAXARGS]; - int nargs; -}; - -/* - * xntpdc includes a command parser which could charitably be called - * crude. The following structure is used to define the command - * syntax. - */ -struct xcmd { - char *keyword; /* command key word */ - void (*handler) P((struct parse *, FILE *)); /* command handler */ - u_char arg[MAXARGS]; /* descriptors for arguments */ - char *desc[MAXARGS]; /* descriptions for arguments */ - char *comment; -}; - -extern int doquery P((int, int, int, int, int, char *, int *, int *, char **, int)); -extern char * nntohost P((u_long)); diff --git a/usr.sbin/xntpd/xntpdc/ntpdc_ops.c b/usr.sbin/xntpd/xntpdc/ntpdc_ops.c deleted file mode 100644 index 600d5c97f8e1..000000000000 --- a/usr.sbin/xntpd/xntpdc/ntpdc_ops.c +++ /dev/null @@ -1,2441 +0,0 @@ -/* - * ntpdc_ops.c - subroutines which are called to perform operations by xntpdc - */ -#include <stdio.h> -#include <ctype.h> -#include <sys/types.h> -#include <sys/time.h> -#include <netdb.h> -#ifndef __bsdi__ -#include <netinet/in.h> -#endif -#include <arpa/inet.h> - -#include "ntpdc.h" -#include "ntp_control.h" -#include "ntp_refclock.h" -#include "ntp_stdlib.h" - -/* - * Declarations for command handlers in here - */ -static int checkitems P((int, FILE *)); -static int checkitemsize P((int, int)); -static int check1item P((int, FILE *)); -static void peerlist P((struct parse *, FILE *)); -static void peers P((struct parse *, FILE *)); -static void dmpeers P((struct parse *, FILE *)); -static void dopeers P((struct parse *, FILE *, int)); -static void printpeer P((struct info_peer *, FILE *)); -static void showpeer P((struct parse *, FILE *)); -static void peerstats P((struct parse *, FILE *)); -static void loopinfo P((struct parse *, FILE *)); -static void sysinfo P((struct parse *, FILE *)); -static void sysstats P((struct parse *, FILE *)); -static void iostats P((struct parse *, FILE *)); -static void memstats P((struct parse *, FILE *)); -static void timerstats P((struct parse *, FILE *)); -static void addpeer P((struct parse *, FILE *)); -static void addserver P((struct parse *, FILE *)); -static void broadcast P((struct parse *, FILE *)); -static void doconfig P((struct parse *, FILE *, int)); -static void unconfig P((struct parse *, FILE *)); -static void set P((struct parse *, FILE *)); -static void sys_clear P((struct parse *, FILE *)); -static void doset P((struct parse *, FILE *, int)); -static void reslist P((struct parse *, FILE *)); -static void restrict P((struct parse *, FILE *)); -static void unrestrict P((struct parse *, FILE *)); -static void delrestrict P((struct parse *, FILE *)); -static void do_restrict P((struct parse *, FILE *, int)); -static void monlist P((struct parse *, FILE *)); -static void monitor P((struct parse *, FILE *)); -static void reset P((struct parse *, FILE *)); -static void preset P((struct parse *, FILE *)); -static void readkeys P((struct parse *, FILE *)); -static void trustkey P((struct parse *, FILE *)); -static void untrustkey P((struct parse *, FILE *)); -static void do_trustkey P((struct parse *, FILE *, int)); -static void authinfo P((struct parse *, FILE *)); -static void traps P((struct parse *, FILE *)); -static void addtrap P((struct parse *, FILE *)); -static void clrtrap P((struct parse *, FILE *)); -static void do_addclr_trap P((struct parse *, FILE *, int)); -static void requestkey P((struct parse *, FILE *)); -static void controlkey P((struct parse *, FILE *)); -static void do_changekey P((struct parse *, FILE *, int)); -static void ctlstats P((struct parse *, FILE *)); -static void leapinfo P((struct parse *, FILE *)); -static void clockstat P((struct parse *, FILE *)); -static void fudge P((struct parse *, FILE *)); -static void clkbug P((struct parse *, FILE *)); -static void setprecision P((struct parse *, FILE *)); -static void kerninfo P((struct parse *, FILE *)); - -/* - * Commands we understand. Ntpdc imports this. - */ -struct xcmd opcmds[] = { - { "listpeers", peerlist, { NO, NO, NO, NO }, - { "", "", "", "" }, - "display list of peers the server knows about" }, - { "peers", peers, { NO, NO, NO, NO }, - { "", "", "", "" }, - "display peer summary information" }, - { "dmpeers", dmpeers, { NO, NO, NO, NO }, - { "", "", "", "" }, - "display peer summary info the way Dave Mills likes it" }, - { "showpeer", showpeer, { ADD, OPT|ADD, OPT|ADD, OPT|ADD }, - { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, - "display detailed information for one or more peers" }, - { "pstats", peerstats, { ADD, OPT|ADD, OPT|ADD, OPT|ADD }, - { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, - "display statistical information for one or more peers" }, - { "loopinfo", loopinfo, { OPT|NTP_STR, NO, NO, NO }, - { "oneline|multiline", "", "", "" }, - "display loop filter information" }, - { "sysinfo", sysinfo, { NO, NO, NO, NO }, - { "", "", "", "" }, - "display local server information" }, - { "sysstats", sysstats, { NO, NO, NO, NO }, - { "", "", "", "" }, - "display local server statistics" }, - { "memstats", memstats, { NO, NO, NO, NO }, - { "", "", "", "" }, - "display peer memory usage statistics" }, - { "iostats", iostats, { NO, NO, NO, NO }, - { "", "", "", "" }, - "display I/O subsystem statistics" }, - { "timerstats", timerstats, { NO, NO, NO, NO }, - { "", "", "", "" }, - "display event timer subsystem statistics" }, - { "addpeer", addpeer, { ADD, OPT|UINT, OPT|UINT, OPT|NTP_STR }, - { "addr", "keyid", "version", "minpoll|prefer" }, - "configure a new peer association" }, - { "addserver", addserver, { ADD, OPT|UINT, OPT|UINT, OPT|NTP_STR }, - { "addr", "keyid", "version", "minpoll|prefer" }, - "configure a new server" }, - { "broadcast", broadcast, { ADD, OPT|UINT, OPT|UINT, OPT|NTP_STR }, - { "addr", "keyid", "version", "minpoll" }, - "configure broadcasting time service" }, - { "unconfig", unconfig, { ADD, OPT|ADD, OPT|ADD, OPT|ADD }, - { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, - "unconfigure existing peer assocations" }, - { "enable", set, { NTP_STR, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR }, - { "auth|bclient|pll|pps|monitor|stats", "...", "...", "..." }, - "set a system flag (auth, bclient, pll, pps, monitor, stats)" }, - { "disable", sys_clear, { NTP_STR, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR }, - { "auth|bclient|pll|pps|monitor|stats", "...", "...", "..." }, - "clear a system flag (auth, bclient, pll, pps, monitor, stats)" }, - { "reslist", reslist, { NO, NO, NO, NO }, - { "", "", "", "" }, - "display the server's restrict list" }, - { "restrict", restrict, { ADD, ADD, NTP_STR, OPT|NTP_STR }, - { "address", "mask", - "ntpport|ignore|noserve|notrust|noquery|nomodify|nopeer", - "..." }, - "create restrict entry/add flags to entry" }, - { "unrestrict", unrestrict, { ADD, ADD, NTP_STR, OPT|NTP_STR }, - { "address", "mask", - "ntpport|ignore|noserve|notrust|noquery|nomodify|nopeer", - "..." }, - "remove flags from a restrict entry" }, - { "delrestrict", delrestrict, { ADD, ADD, OPT|NTP_STR, NO }, - { "address", "mask", "ntpport", "" }, - "delete a restrict entry" }, - { "monlist", monlist, { OPT|INT, NO, NO, NO }, - { "version", "", "", "" }, - "display data the server's monitor routines have collected" }, - { "monitor", monitor, { NTP_STR, NO, NO, NO }, - { "on|off", "", "", "" }, - "turn the server's monitoring facility on or off" }, - { "reset", reset, { NTP_STR, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR }, - { "io|sys|mem|timer|auth|allpeers", "...", "...", "..." }, - "reset various subsystem statistics counters" }, - { "preset", preset, { ADD, OPT|ADD, OPT|ADD, OPT|ADD }, - { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, - "reset stat counters associated with particular peer(s)" }, - { "readkeys", readkeys, { NO, NO, NO, NO }, - { "", "", "", "" }, - "request a reread of the keys file and re-init of system keys" }, - { "trustkey", trustkey, { UINT, OPT|UINT, OPT|UINT, OPT|UINT }, - { "keyid", "keyid", "keyid", "keyid" }, - "add one or more key ID's to the trusted list" }, - { "untrustkey", untrustkey, { UINT, OPT|UINT, OPT|UINT, OPT|UINT }, - { "keyid", "keyid", "keyid", "keyid" }, - "remove one or more key ID's from the trusted list" }, - { "authinfo", authinfo, { NO, NO, NO, NO }, - { "", "", "", "" }, - "display the state of the authentication code" }, - { "traps", traps, { NO, NO, NO, NO }, - { "", "", "", "" }, - "display the traps set in the server" }, - { "addtrap", addtrap, { ADD, OPT|UINT, OPT|ADD, NO }, - { "address", "port", "interface", "" }, - "configure a trap in the server" }, - { "clrtrap", clrtrap, { ADD, OPT|UINT, OPT|ADD, NO }, - { "address", "port", "interface", "" }, - "remove a trap (configured or otherwise) from the server" }, - { "requestkey", requestkey, { UINT, NO, NO, NO }, - { "keyid", "", "", "" }, - "change the keyid the server uses to authenticate requests" }, - { "controlkey", controlkey, { UINT, NO, NO, NO }, - { "keyid", "", "", "" }, - "change the keyid the server uses to authenticate control messages" }, - { "ctlstats", ctlstats, { NO, NO, NO, NO }, - { "", "", "", "" }, - "display packet count statistics from the control module" }, - { "leapinfo", leapinfo, { NO, NO, NO, NO }, - { "", "", "", "" }, - "display the current leap second state" }, - { "clockstat", clockstat, { ADD, OPT|ADD, OPT|ADD, OPT|ADD }, - { "address", "address", "address", "address" }, - "display clock status information" }, - { "fudge", fudge, { ADD, NTP_STR, NTP_STR, NO }, - { "address", "time1|time2|val1|val2|flags", "value", "" }, - "set/change one of a clock's fudge factors" }, - { "clkbug", clkbug, { ADD, OPT|ADD, OPT|ADD, OPT|ADD }, - { "address", "address", "address", "address" }, - "display clock debugging information" }, - { "setprecision", setprecision, { INT, NO, NO, NO }, - { "sys_precision", "", "", "" }, - "set the server's advertised precision" }, - { "kerninfo", kerninfo, { NO, NO, NO, NO }, - { "", "", "", "" }, - "display the kernel pll/pps variables" }, - - { 0, 0, { NO, NO, NO, NO }, - { "", "", "", "" }, "" } -}; - - -/* - * Imported from ntpdc.c - */ -extern int showhostnames; -extern int debug; -extern struct servent *server_entry; - -/* - * For quick string comparisons - */ -#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) - - -/* - * checkitems - utility to print a message if no items were returned - */ -static int -checkitems(items, fp) - int items; - FILE *fp; -{ - if (items == 0) { - (void) fprintf(fp, "No data returned in response to query\n"); - return 0; - } - return 1; -} - - -/* - * checkitemsize - utility to print a message if the item size is wrong - */ -static int -checkitemsize(itemsize, expected) - int itemsize; - int expected; -{ - if (itemsize != expected) { - (void) fprintf(stderr, - "***Incorrect item size returned by remote host (%d should be %d)\n", - itemsize, expected); - return 0; - } - return 1; -} - - -/* - * check1item - check to make sure we have exactly one item - */ -static int -check1item(items, fp) - int items; - FILE *fp; -{ - if (items == 0) { - (void) fprintf(fp, "No data returned in response to query\n"); - return 0; - } - if (items > 1) { - (void) fprintf(fp, "Expected one item in response, got %d\n", - items); - return 0; - } - return 1; -} - - - -/* - * peerlist - get a short list of peers - */ -/*ARGSUSED*/ -static void -peerlist(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct info_peer_list *plist; - int items; - int itemsize; - int res; - - res = doquery(IMPL_XNTPD, REQ_PEER_LIST, 0, 0, 0, (char *)NULL, &items, - &itemsize, (char **)&plist, 0); - - if (res != 0 && items == 0) - return; - - if (!checkitems(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_peer_list))) - return; - - while (items > 0) { - (void) fprintf(fp, "%-9s %s\n", modetoa(plist->hmode), - nntohost(plist->address)); - plist++; - items--; - } -} - - -/* - * peers - show peer summary - */ -static void -peers(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - dopeers(pcmd, fp, 0); -} - -/* - * dmpeers - show peer summary, Dave Mills style - */ -static void -dmpeers(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - dopeers(pcmd, fp, 1); -} - - -/* - * peers - show peer summary - */ -/*ARGSUSED*/ -static void -dopeers(pcmd, fp, dmstyle) - struct parse *pcmd; - FILE *fp; - int dmstyle; -{ - struct info_peer_summary *plist; - int items; - int itemsize; - int ntp_poll; - int res; - int c; - l_fp tempts; - - res = doquery(IMPL_XNTPD, REQ_PEER_LIST_SUM, 0, 0, 0, (char *)NULL, - &items, &itemsize, (char **)&plist, 0); - - if (res != 0 && items == 0) - return; - - if (!checkitems(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_peer_summary))) - return; - - (void) fprintf(fp, - " remote local st poll reach delay offset disp\n"); - (void) fprintf(fp, - "=======================================================================\n"); - while (items > 0) { - if (!dmstyle) { - if (plist->flags & INFO_FLAG_SYSPEER) - c = '*'; - else if (plist->hmode == MODE_ACTIVE) - c = '+'; - else if (plist->hmode == MODE_PASSIVE) - c = '-'; - else if (plist->hmode == MODE_CLIENT) - c = '='; - else if (plist->hmode == MODE_BROADCAST) - c = '^'; - else if (plist->hmode == MODE_BCLIENT) - c = '~'; - else - c = ' '; - } else { - if (plist->flags & INFO_FLAG_SYSPEER) - c = '*'; - else if (plist->flags & INFO_FLAG_SHORTLIST) - c = '+'; - else if (plist->flags & INFO_FLAG_SEL_CANDIDATE) - c = '.'; - else - c = ' '; - } - NTOHL_FP(&(plist->offset), &tempts); - ntp_poll = 1<<max(min3(plist->ppoll, plist->hpoll, NTP_MAXPOLL), - NTP_MINPOLL); - (void) fprintf(fp, - "%c%-15.15s %-15.15s %2d %4d %3o %7.7s %9.9s %7.7s\n", - c, nntohost(plist->srcadr), - numtoa(plist->dstadr), - plist->stratum, ntp_poll, plist->reach, - fptoa(NTOHS_FP(plist->delay), 5), - lfptoa(&tempts, 6), - ufptoa(NTOHS_FP(plist->dispersion), 5)); - - plist++; - items--; - } -} - -/* Convert a refid & stratum (in host order) to a string */ -static char* -refid_string(refid, stratum) - u_long refid; - int stratum; -{ - if (stratum <= 1) { - static char junk[5]; - junk[4] = 0; - memmove(junk, (char *)&refid, 4); - return junk; - } - - return numtoa(refid); -} - -/* - * printpeer - print detail information for a peer - */ -static void -printpeer(pp, fp) - register struct info_peer *pp; - FILE *fp; -{ - register int i; - char *str; - l_fp tempts; - - (void) fprintf(fp, "remote %s, local %s\n", - numtoa(pp->srcadr), numtoa(pp->dstadr)); - - (void) fprintf(fp, "hmode %s, pmode %s, stratum %d, precision %d\n", - modetoa(pp->hmode), modetoa(pp->pmode), - pp->stratum, pp->precision); - - (void) fprintf(fp, - "leap %c%c, refid [%s], rootdistance %s, rootdispersion %s\n", - pp->leap & 0x2 ? '1' : '0', - pp->leap & 0x1 ? '1' : '0', - refid_string(pp->refid, pp->stratum), fptoa(NTOHS_FP(pp->rootdelay), 5), - ufptoa(NTOHS_FP(pp->rootdispersion), 5)); - - (void) fprintf(fp, - "ppoll %d, hpoll %d, keyid %lu, version %d, association %u\n", - pp->ppoll, pp->hpoll, (u_long)pp->keyid, pp->version, ntohs(pp->associd)); - - (void) fprintf(fp, - "valid %d, reach %03o, unreach %d, flash %03o, ", - pp->valid, pp->reach, pp->unreach, pp->flash); - - (void) fprintf(fp, "boffset %s, ttl %d\n", - fptoa(NTOHS_FP(pp->estbdelay), 5), pp->ttl); - - (void) fprintf(fp, "timer %lds, flags", (long)ntohl(pp->timer)); - if (pp->flags == 0) { - (void) fprintf(fp, " none\n"); - } else { - str = ""; - if (pp->flags & INFO_FLAG_SYSPEER) { - (void) fprintf(fp, " system_peer"); - str = ","; - } - if (pp->flags & INFO_FLAG_CONFIG) { - (void) fprintf(fp, "%s config", str); - str = ","; - } - if (pp->flags & INFO_FLAG_REFCLOCK) { - (void) fprintf(fp, "%s refclock", str); - str = ","; - } - if (pp->flags & INFO_FLAG_AUTHENABLE) { - (void) fprintf(fp, "%s auth", str); - str = ","; - } - if (pp->flags & INFO_FLAG_BCLIENT) { - (void) fprintf(fp, "%s bclient", str); - str = ","; - } - if (pp->flags & INFO_FLAG_PREFER) { - (void) fprintf(fp, "%s prefer", str); - } - (void) fprintf(fp, "\n"); - } - - NTOHL_FP(&pp->reftime, &tempts); - (void) fprintf(fp, "reference time: %s\n", - prettydate(&tempts)); - NTOHL_FP(&pp->org, &tempts); - (void) fprintf(fp, "originate timestamp: %s\n", - prettydate(&tempts)); - NTOHL_FP(&pp->rec, &tempts); - (void) fprintf(fp, "receive timestamp: %s\n", - prettydate(&tempts)); - NTOHL_FP(&pp->xmt, &tempts); - (void) fprintf(fp, "transmit timestamp: %s\n", - prettydate(&tempts)); - - (void) fprintf(fp, "filter delay: "); - for (i = 0; i < NTP_SHIFT; i++) { - (void) fprintf(fp, " %-8.8s", - fptoa(NTOHS_FP(pp->filtdelay[i]), 5)); - if (i == (NTP_SHIFT>>1)-1) - (void) fprintf(fp, "\n "); - } - (void) fprintf(fp, "\n"); - - (void) fprintf(fp, "filter offset:"); - for (i = 0; i < NTP_SHIFT; i++) { - NTOHL_FP(&pp->filtoffset[i], &tempts); - (void) fprintf(fp, " %-8.8s", lfptoa(&tempts, 6)); - if (i == (NTP_SHIFT>>1)-1) - (void) fprintf(fp, "\n "); - } - (void) fprintf(fp, "\n"); - - (void) fprintf(fp, "filter order: "); - for (i = 0; i < NTP_SHIFT; i++) { - (void) fprintf(fp, " %-8d", pp->order[i]); - if (i == (NTP_SHIFT>>1)-1) - (void) fprintf(fp, "\n "); - } - (void) fprintf(fp, "\n"); - - - NTOHL_FP(&pp->offset, &tempts); - (void) fprintf(fp, - "offset %s, delay %s, dispersion %s, selectdisp %s\n", - lfptoa(&tempts, 6), fptoa(NTOHS_FP(pp->delay), 5), - ufptoa(NTOHS_FP(pp->dispersion), 5), - ufptoa(NTOHS_FP(pp->selectdisp), 5)); -} - - -/* - * showpeer - show detailed information for a peer - */ -static void -showpeer(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct info_peer *pp; - /* 4 is the maximum number of peers which will fit in a packet */ - struct info_peer_list plist[min(MAXARGS, 4)]; - int qitems; - int items; - int itemsize; - int res; - - for (qitems = 0; qitems < min(pcmd->nargs, 4); qitems++) { - plist[qitems].address = pcmd->argval[qitems].netnum; - plist[qitems].port = server_entry->s_port; - plist[qitems].hmode = plist[qitems].flags = 0; - } - - res = doquery(IMPL_XNTPD, REQ_PEER_INFO, 0, qitems, - sizeof(struct info_peer_list), (char *)plist, &items, - &itemsize, (char **)&pp, 0); - - if (res != 0 && items == 0) - return; - - if (!checkitems(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_peer))) - return; - - while (items-- > 0) { - printpeer(pp, fp); - if (items > 0) - (void) fprintf(fp, "\n"); - pp++; - } -} - - -/* - * peerstats - return statistics for a peer - */ -static void -peerstats(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct info_peer_stats *pp; - /* 4 is the maximum number of peers which will fit in a packet */ - struct info_peer_list plist[min(MAXARGS, 4)]; - int qitems; - int items; - int itemsize; - int res; - - for (qitems = 0; qitems < min(pcmd->nargs, 4); qitems++) { - plist[qitems].address = pcmd->argval[qitems].netnum; - plist[qitems].port = server_entry->s_port; - plist[qitems].hmode = plist[qitems].flags = 0; - } - - res = doquery(IMPL_XNTPD, REQ_PEER_STATS, 0, qitems, - sizeof(struct info_peer_list), (char *)plist, &items, - &itemsize, (char **)&pp, 0); - - if (res != 0 && items == 0) - return; - - if (!checkitems(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_peer_stats))) - return; - - while (items-- > 0) { - (void) fprintf(fp, "remote host: %s\n", - nntohost(pp->srcadr)); - (void) fprintf(fp, "local interface: %s\n", - numtoa(pp->dstadr)); - (void) fprintf(fp, "time last received: %lds\n", - (long)ntohl(pp->timereceived)); - (void) fprintf(fp, "time until next send: %lds\n", - (long)ntohl(pp->timetosend)); - (void) fprintf(fp, "reachability change: %lds\n", - (long)ntohl(pp->timereachable)); - (void) fprintf(fp, "packets sent: %ld\n", - (long)ntohl(pp->sent)); - (void) fprintf(fp, "packets received: %ld\n", - (long)ntohl(pp->processed)); - (void) fprintf(fp, "bad authentication: %ld\n", - (long)ntohl(pp->badauth)); - (void) fprintf(fp, "bogus origin: %ld\n", - (long)ntohl(pp->bogusorg)); - (void) fprintf(fp, "duplicate: %ld\n", - (long)ntohl(pp->oldpkt)); - (void) fprintf(fp, "bad dispersion: %ld\n", - (long)ntohl(pp->seldisp)); - (void) fprintf(fp, "bad reference time: %ld\n", - (long)ntohl(pp->selbroken)); - (void) fprintf(fp, "candidate order: %d\n", - (int)pp->candidate); - if (items > 0) - (void) fprintf(fp, "\n"); - pp++; - } -} - - -/* - * loopinfo - show loop filter information - */ -static void -loopinfo(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct info_loop *il; - int items; - int itemsize; - int oneline = 0; - int res; - l_fp tempts; - - if (pcmd->nargs > 0) { - if (STREQ(pcmd->argval[0].string, "oneline")) - oneline = 1; - else if (STREQ(pcmd->argval[0].string, "multiline")) - oneline = 0; - else { - (void) fprintf(stderr, "How many lines?\n"); - return; - } - } - - res = doquery(IMPL_XNTPD, REQ_LOOP_INFO, 0, 0, 0, (char *)NULL, - &items, &itemsize, (char **)&il, 0); - - if (res != 0 && items == 0) - return; - - if (!check1item(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_loop))) - return; - - if (oneline) { - l_fp temp2ts; - - NTOHL_FP(&il->last_offset, &tempts); - NTOHL_FP(&il->drift_comp, &temp2ts); - - (void) fprintf(fp, - "offset %s, frequency %s, time_const %ld, watchdog %ld\n", - lfptoa(&tempts, 6), - lfptoa(&temp2ts, 3), - (u_long)ntohl(il->compliance), - (u_long)ntohl(il->watchdog_timer)); - } else { - NTOHL_FP(&il->last_offset, &tempts); - (void) fprintf(fp, "offset: %s s\n", - lfptoa(&tempts, 6)); - NTOHL_FP(&il->drift_comp, &tempts); - (void) fprintf(fp, "frequency: %s ppm\n", - lfptoa(&tempts, 3)); - (void) fprintf(fp, "poll adjust: %ld\n", - (u_long)ntohl(il->compliance)); - (void) fprintf(fp, "watchdog timer: %ld s\n", - (u_long)ntohl(il->watchdog_timer)); - } -} - - -/* - * sysinfo - show current system state - */ -/*ARGSUSED*/ -static void -sysinfo(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct info_sys *is; - int items; - int itemsize; - int res; - l_fp tempts; - - res = doquery(IMPL_XNTPD, REQ_SYS_INFO, 0, 0, 0, (char *)NULL, - &items, &itemsize, (char **)&is, 0); - - if (res != 0 && items == 0) - return; - - if (!check1item(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_sys))) - return; - - (void) fprintf(fp, "system peer: %s\n", nntohost(is->peer)); - (void) fprintf(fp, "system peer mode: %s\n", modetoa(is->peer_mode)); - (void) fprintf(fp, "leap indicator: %c%c\n", - is->leap & 0x2 ? '1' : '0', - is->leap & 0x1 ? '1' : '0'); - (void) fprintf(fp, "stratum: %d\n", (int)is->stratum); - (void) fprintf(fp, "precision: %d\n", (int)is->precision); - (void) fprintf(fp, "root distance: %s s\n", - fptoa(NTOHS_FP(is->rootdelay), 5)); - (void) fprintf(fp, "root dispersion: %s s\n", - ufptoa(NTOHS_FP(is->rootdispersion), 5)); - (void) fprintf(fp, "reference ID: [%s]\n", - refid_string(is->refid, is->stratum)); - NTOHL_FP(&is->reftime, &tempts); - (void) fprintf(fp, "reference time: %s\n", prettydate(&tempts)); - - (void) fprintf(fp, "system flags: "); - if ((is->flags & (INFO_FLAG_BCLIENT | INFO_FLAG_AUTHENABLE | - INFO_FLAG_PLL | INFO_FLAG_PPS | INFO_FLAG_PLL_SYNC | - INFO_FLAG_PPS_SYNC | INFO_FLAG_MONITOR | INFO_FLAG_FILEGEN)) == 0) { - (void) fprintf(fp, "none\n"); - } else { - if (is->flags & INFO_FLAG_BCLIENT) - (void) fprintf(fp, "bclient "); - if (is->flags & INFO_FLAG_AUTHENABLE) - (void) fprintf(fp, "auth "); - if (is->flags & INFO_FLAG_PLL) - (void) fprintf(fp, "pll "); - if (is->flags & INFO_FLAG_PPS) - (void) fprintf(fp, "pps "); - if (is->flags & INFO_FLAG_PLL_SYNC) - (void) fprintf(fp, "kernel_sync "); - if (is->flags & INFO_FLAG_PPS_SYNC) - (void) fprintf(fp, "pps_sync "); - if (is->flags & INFO_FLAG_MONITOR) - (void) fprintf(fp, "monitor "); - if (is->flags & INFO_FLAG_FILEGEN) - (void) fprintf(fp, "stats "); - (void) fprintf(fp, "\n"); - } - (void) fprintf(fp, "frequency: %s ppm\n", - fptoa(ntohl(is->frequency), 3)); - (void) fprintf(fp, "stability: %s ppm\n", - ufptoa(ntohl(is->stability), 3)); - (void) fprintf(fp, "broadcastdelay: %s s\n", - fptoa(NTOHS_FP(is->bdelay), 6)); - NTOHL_FP(&is->authdelay, &tempts); - (void) fprintf(fp, "authdelay: %s s\n", lfptoa(&tempts, 6)); -} - - -/* - * sysstats - print system statistics - */ -/*ARGSUSED*/ -static void -sysstats(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct info_sys_stats *ss; - int items; - int itemsize; - int res; - - res = doquery(IMPL_XNTPD, REQ_SYS_STATS, 0, 0, 0, (char *)NULL, - &items, &itemsize, (char **)&ss, 0); - - if (res != 0 && items == 0) - return; - - if (!check1item(items, fp)) - return; - - if (itemsize != sizeof(struct info_sys_stats) && - itemsize != sizeof(struct old_info_sys_stats)) { - /* issue warning according to new structure size */ - checkitemsize(itemsize, sizeof(struct info_sys_stats)); - return; - } - - (void) fprintf(fp, "system uptime: %ld\n", - (u_long)ntohl(ss->timeup)); - (void) fprintf(fp, "time since reset: %ld\n", - (u_long)ntohl(ss->timereset)); - (void) fprintf(fp, "bad stratum in packet: %ld\n", - (u_long)ntohl(ss->badstratum)); - (void) fprintf(fp, "old version packets: %ld\n", - (u_long)ntohl(ss->oldversionpkt)); - (void) fprintf(fp, "new version packets: %ld\n", - (u_long)ntohl(ss->newversionpkt)); - (void) fprintf(fp, "unknown version number: %ld\n", - (u_long)ntohl(ss->unknownversion)); - (void) fprintf(fp, "bad packet length: %ld\n", - (u_long)ntohl(ss->badlength)); - (void) fprintf(fp, "packets processed: %ld\n", - (u_long)ntohl(ss->processed)); - (void) fprintf(fp, "bad authentication: %ld\n", - (u_long)ntohl(ss->badauth)); - if (itemsize != sizeof(struct info_sys_stats)) - return; - - (void) fprintf(fp, "limitation rejects: %ld\n", - (u_long)ntohl(ss->limitrejected)); -} - - - -/* - * iostats - print I/O statistics - */ -/*ARGSUSED*/ -static void -iostats(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct info_io_stats *io; - int items; - int itemsize; - int res; - - res = doquery(IMPL_XNTPD, REQ_IO_STATS, 0, 0, 0, (char *)NULL, - &items, &itemsize, (char **)&io, 0); - - if (res != 0 && items == 0) - return; - - if (!check1item(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_io_stats))) - return; - - (void) fprintf(fp, "time since reset: %ld\n", - (u_long)ntohl(io->timereset)); - (void) fprintf(fp, "receive buffers: %d\n", - ntohs(io->totalrecvbufs)); - (void) fprintf(fp, "free receive buffers: %d\n", - ntohs(io->freerecvbufs)); - (void) fprintf(fp, "used receive buffers: %d\n", - ntohs(io->fullrecvbufs)); - (void) fprintf(fp, "low water refills: %d\n", - ntohs(io->lowwater)); - (void) fprintf(fp, "dropped packets: %ld\n", - (u_long)ntohl(io->dropped)); - (void) fprintf(fp, "ignored packets: %ld\n", - (u_long)ntohl(io->ignored)); - (void) fprintf(fp, "received packets: %ld\n", - (u_long)ntohl(io->received)); - (void) fprintf(fp, "packets sent: %ld\n", - (u_long)ntohl(io->sent)); - (void) fprintf(fp, "packets not sent: %ld\n", - (u_long)ntohl(io->notsent)); - (void) fprintf(fp, "interrupts handled: %ld\n", - (u_long)ntohl(io->interrupts)); - (void) fprintf(fp, "received by int: %ld\n", - (u_long)ntohl(io->int_received)); -} - - -/* - * memstats - print peer memory statistics - */ -/*ARGSUSED*/ -static void -memstats(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct info_mem_stats *mem; - int i; - int items; - int itemsize; - int res; - - res = doquery(IMPL_XNTPD, REQ_MEM_STATS, 0, 0, 0, (char *)NULL, - &items, &itemsize, (char **)&mem, 0); - - if (res != 0 && items == 0) - return; - - if (!check1item(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_mem_stats))) - return; - - (void) fprintf(fp, "time since reset: %ld\n", - (u_long)ntohl(mem->timereset)); - (void) fprintf(fp, "total peer memory: %d\n", - ntohs(mem->totalpeermem)); - (void) fprintf(fp, "free peer memory: %d\n", - ntohs(mem->freepeermem)); - (void) fprintf(fp, "calls to findpeer: %ld\n", - (u_long)ntohl(mem->findpeer_calls)); - (void) fprintf(fp, "new peer allocations: %ld\n", - (u_long)ntohl(mem->allocations)); - (void) fprintf(fp, "peer demobilizations: %ld\n", - (u_long)ntohl(mem->demobilizations)); - - (void) fprintf(fp, "hash table counts: "); - for (i = 0; i < HASH_SIZE; i++) { - (void) fprintf(fp, "%4d", (int)mem->hashcount[i]); - if ((i % 8) == 7 && i != (HASH_SIZE-1)) { - (void) fprintf(fp, "\n "); - } - } - (void) fprintf(fp, "\n"); -} - - - -/* - * timerstats - print timer statistics - */ -/*ARGSUSED*/ -static void -timerstats(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct info_timer_stats *tim; - int items; - int itemsize; - int res; - - res = doquery(IMPL_XNTPD, REQ_TIMER_STATS, 0, 0, 0, (char *)NULL, - &items, &itemsize, (char **)&tim, 0); - - if (res != 0 && items == 0) - return; - - if (!check1item(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_timer_stats))) - return; - - (void) fprintf(fp, "time since reset: %ld\n", - (u_long)ntohl(tim->timereset)); - (void) fprintf(fp, "alarms handled: %ld\n", - (u_long)ntohl(tim->alarms)); - (void) fprintf(fp, "alarm overruns: %ld\n", - (u_long)ntohl(tim->overflows)); - (void) fprintf(fp, "calls to transmit: %ld\n", - (u_long)ntohl(tim->xmtcalls)); -} - - -/* - * addpeer - configure an active mode association - */ -static void -addpeer(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - doconfig(pcmd, fp, MODE_ACTIVE); -} - - -/* - * addserver - configure a client mode association - */ -static void -addserver(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - doconfig(pcmd, fp, MODE_CLIENT); -} - -/* - * broadcast - configure a broadcast mode association - */ -static void -broadcast(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - doconfig(pcmd, fp, MODE_BROADCAST); -} - - -/* - * config - configure a new peer association - */ -static void -doconfig(pcmd, fp, mode) - struct parse *pcmd; - FILE *fp; - int mode; -{ - struct conf_peer cpeer; - int items; - int itemsize; - char *dummy; - u_long keyid; - u_int version; - u_int flags; - int res; - - keyid = 0; - version = NTP_VERSION; - flags = 0; - res = 0; - if (pcmd->nargs > 1) { - keyid = pcmd->argval[1].uval; - if (keyid > 0) { - flags |= CONF_FLAG_AUTHENABLE; - } - if (pcmd->nargs > 2) { - version = (u_int)pcmd->argval[2].uval; - if (version > NTP_VERSION - || version < NTP_OLDVERSION) { - (void) fprintf(fp, - "funny version number %u specified\n", - version); - res++; - } - - items = 3; - while (pcmd->nargs > items) { - if (STREQ(pcmd->argval[items].string, - "prefer")) - flags |= CONF_FLAG_PREFER; - else { - (void) fprintf(fp, - "%s not understood\n", - pcmd->argval[3].string); - res++; - break; - } - items++; - } - } - } - - if (res) - return; - - cpeer.peeraddr = pcmd->argval[0].netnum; - cpeer.hmode = (u_char) mode; - cpeer.keyid = keyid; - cpeer.version = (u_char) version; - cpeer.minpoll = NTP_MINDPOLL; - cpeer.maxpoll = NTP_MAXPOLL; - cpeer.flags = (u_char)flags; - - res = doquery(IMPL_XNTPD, REQ_CONFIG, 1, 1, - sizeof(struct conf_peer), (char *)&cpeer, &items, - &itemsize, &dummy, 0); - - if (res == 0) - (void) fprintf(fp, "done!\n"); - return; -} - - -/* - * unconfig - unconfigure some associations - */ -static void -unconfig(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - /* 8 is the maximum number of peers which will fit in a packet */ - struct conf_unpeer plist[min(MAXARGS, 8)]; - int qitems; - int items; - int itemsize; - char *dummy; - int res; - - for (qitems = 0; qitems < min(pcmd->nargs, 8); qitems++) { - plist[qitems].peeraddr = pcmd->argval[qitems].netnum; - } - - res = doquery(IMPL_XNTPD, REQ_UNCONFIG, 1, qitems, - sizeof(struct conf_unpeer), (char *)plist, &items, - &itemsize, &dummy, 0); - - if (res == 0) - (void) fprintf(fp, "done!\n"); -} - - -/* - * set - set some system flags - */ -static void -set(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - doset(pcmd, fp, REQ_SET_SYS_FLAG); -} - - -/* - * clear - clear some system flags - */ -static void -sys_clear(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - doset(pcmd, fp, REQ_CLR_SYS_FLAG); -} - - -/* - * doset - set/clear system flags - */ -static void -doset(pcmd, fp, req) - struct parse *pcmd; - FILE *fp; - int req; -{ - /* 8 is the maximum number of peers which will fit in a packet */ - struct conf_sys_flags sys; - int items; - int itemsize; - char *dummy; - int res; - - sys.flags = 0; - res = 0; - for (items = 0; items < pcmd->nargs; items++) { - if (STREQ(pcmd->argval[items].string, "bclient")) - sys.flags |= SYS_FLAG_BCLIENT; - else if (STREQ(pcmd->argval[items].string, "auth")) - sys.flags |= SYS_FLAG_AUTHENTICATE; - else if (STREQ(pcmd->argval[items].string, "pll")) - sys.flags |= SYS_FLAG_PLL; - else if (STREQ(pcmd->argval[items].string, "pps")) - sys.flags |= SYS_FLAG_PPS; - else if (STREQ(pcmd->argval[items].string, "monitor")) - sys.flags |= SYS_FLAG_MONITOR; - else if (STREQ(pcmd->argval[items].string, "stats")) - sys.flags |= SYS_FLAG_FILEGEN; - else { - (void) fprintf(fp, "Unknown flag %s\n", - pcmd->argval[items].string); - res = 1; - } - } - - if (res || sys.flags == 0) - return; - - res = doquery(IMPL_XNTPD, req, 1, 1, - sizeof(struct conf_sys_flags), (char *)&sys, &items, - &itemsize, &dummy, 0); - - if (res == 0) - (void) fprintf(fp, "done!\n"); -} - - -/* - * data for printing/interrpreting the restrict flags - */ -struct resflags { - char *str; - int bit; -}; - -static struct resflags resflags[] = { - { "ignore", RES_IGNORE }, - { "noserve", RES_DONTSERVE }, - { "notrust", RES_DONTTRUST }, - { "noquery", RES_NOQUERY }, - { "nomodify", RES_NOMODIFY }, - { "nopeer", RES_NOPEER }, - { "notrap", RES_NOTRAP }, - { "lptrap", RES_LPTRAP }, - { "limited", RES_LIMITED }, - { "", 0 } -}; - -static struct resflags resmflags[] = { - { "ntpport", RESM_NTPONLY }, - { "interface", RESM_INTERFACE }, - { "", 0 } -}; - - -/* - * reslist - obtain and print the server's restrict list - */ -/*ARGSUSED*/ -static void -reslist(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct info_restrict *rl; - int items; - int itemsize; - int res; - char *addr; - char *mask; - struct resflags *rf; - u_long count; - u_short flags; - u_short mflags; - char flagstr[300]; - static char *comma = ", "; - - res = doquery(IMPL_XNTPD, REQ_GET_RESTRICT, 0, 0, 0, (char *)NULL, - &items, &itemsize, (char **)&rl, 0); - - if (res != 0 && items == 0) - return; - - if (!checkitems(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_restrict))) - return; - - (void) fprintf(fp, - " address mask count flags\n"); - (void) fprintf(fp, - "=====================================================================\n"); - while (items > 0) { - if ((rl->mask == (U_LONG)0xffffffff)) - addr = numtohost(rl->addr); - else - addr = numtoa( rl->addr ); - mask = numtoa(rl->mask); - count = ntohl(rl->count); - flags = ntohs(rl->flags); - mflags = ntohs(rl->mflags); - flagstr[0] = '\0'; - - res = 1; - rf = &resmflags[0]; - while (rf->bit != 0) { - if (mflags & rf->bit) { - if (!res) - (void) strcat(flagstr, comma); - res = 0; - (void) strcat(flagstr, rf->str); - } - rf++; - } - - rf = &resflags[0]; - while (rf->bit != 0) { - if (flags & rf->bit) { - if (!res) - (void) strcat(flagstr, comma); - res = 0; - (void) strcat(flagstr, rf->str); - } - rf++; - } - - if (flagstr[0] == '\0') - (void) strcpy(flagstr, "none"); - - (void) fprintf(fp, "%-15.15s %-15.15s %9ld %s\n", - addr, mask, count, flagstr); - rl++; - items--; - } -} - - - -/* - * restrict - create/add a set of restrictions - */ -static void -restrict(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - do_restrict(pcmd, fp, REQ_RESADDFLAGS); -} - - -/* - * unrestrict - remove restriction flags from existing entry - */ -static void -unrestrict(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - do_restrict(pcmd, fp, REQ_RESSUBFLAGS); -} - - -/* - * delrestrict - delete an existing restriction - */ -static void -delrestrict(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - do_restrict(pcmd, fp, REQ_UNRESTRICT); -} - - -/* - * do_restrict - decode commandline restrictions and make the request - */ -static void -do_restrict(pcmd, fp, req_code) - struct parse *pcmd; - FILE *fp; - int req_code; -{ - struct conf_restrict cres; - int items; - int itemsize; - char *dummy; - u_long num; - u_long bit; - int i; - int res; - int err; - - cres.addr = pcmd->argval[0].netnum; - cres.mask = pcmd->argval[1].netnum; - cres.flags = 0; - cres.mflags = 0; - err = 0; - for (res = 2; res < pcmd->nargs; res++) { - if (STREQ(pcmd->argval[res].string, "ntpport")) { - cres.mflags |= RESM_NTPONLY; - } else { - for (i = 0; resflags[i].bit != 0; i++) { - if (STREQ(pcmd->argval[res].string, - resflags[i].str)) - break; - } - if (resflags[i].bit != 0) { - cres.flags |= resflags[i].bit; - if (req_code == REQ_UNRESTRICT) { - (void) fprintf(fp, - "Flag %s inappropriate\n", - resflags[i].str); - err++; - } - } else { - (void) fprintf(fp, "Unknown flag %s\n", - pcmd->argval[res].string); - err++; - } - } - } - - /* - * Make sure mask for default address is zero. Otherwise, - * make sure mask bits are contiguous. - */ - if (cres.addr == 0) { - cres.mask = 0; - } else { - num = ntohl(cres.mask); - for (bit = 0x80000000; bit != 0; bit >>= 1) - if ((num & bit) == 0) - break; - for ( ; bit != 0; bit >>= 1) - if ((num & bit) != 0) - break; - if (bit != 0) { - (void) fprintf(fp, "Invalid mask %s\n", - numtoa(cres.mask)); - err++; - } - } - - if (err) - return; - - res = doquery(IMPL_XNTPD, req_code, 1, 1, - sizeof(struct conf_restrict), (char *)&cres, &items, - &itemsize, &dummy, 0); - - if (res == 0) - (void) fprintf(fp, "done!\n"); - return; -} - - -/* - * monlist - obtain and print the server's monitor data - */ -/*ARGSUSED*/ -static void -monlist(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - char *struct_star; - struct in_addr addr; - int items; - int itemsize; - int res; - int version = -1; - - if (pcmd->nargs > 0) { - version = pcmd->argval[0].ival; - } - - res = doquery(IMPL_XNTPD, - (version == 1 || version == -1) ? REQ_MON_GETLIST_1 : - REQ_MON_GETLIST, 0, 0, 0, (char *)NULL, - &items, &itemsize, &struct_star, - (version < 0) ? (1 << INFO_ERR_REQ) : 0); - - if (res == INFO_ERR_REQ && version < 0) - res = doquery(IMPL_XNTPD, REQ_MON_GETLIST, 0, 0, 0, (char *)NULL, - &items, &itemsize, &struct_star, 0); - - if (res != 0 && items == 0) - return; - - if (!checkitems(items, fp)) - return; - - if (itemsize == sizeof(struct info_monitor_1)) { - struct info_monitor_1 *ml = (struct info_monitor_1 *) struct_star; - - (void) fprintf(fp, - "remote address port local address count m ver drop last first\n"); - (void) fprintf(fp, - "===============================================================================\n"); - while (items > 0) { - addr.s_addr = ml->daddr; - (void) fprintf(fp, - "%-22.22s %5d %-15s %8ld %1d %1d %6lu %6lu %7lu\n", - nntohost(ml->addr), - ntohs(ml->port), - inet_ntoa(addr), - (u_long)ntohl(ml->count), - ml->mode, - ml->version, - (u_long)ntohl(ml->lastdrop), - (u_long)ntohl(ml->lasttime), - (u_long)ntohl(ml->firsttime)); - ml++; - items--; - } - } else if (itemsize == sizeof(struct info_monitor)) { - struct info_monitor *ml = (struct info_monitor *) struct_star; - - (void) fprintf(fp, - " address port count mode ver lastdrop lasttime firsttime\n"); - (void) fprintf(fp, - "===============================================================================\n"); - while (items > 0) { - addr.s_addr = ml->lastdrop; - (void) fprintf(fp, - "%-25.25s %5d %9ld %4d %2d %9lu %9lu %9lu\n", - nntohost(ml->addr), - ntohs(ml->port), - (u_long)ntohl(ml->count), - ml->mode, - ml->version, - (u_long)ntohl(ml->lastdrop), - (u_long)ntohl(ml->lasttime), - (u_long)ntohl(ml->firsttime)); - ml++; - items--; - } - } else if (itemsize == sizeof(struct old_info_monitor)) { - struct old_info_monitor *oml = (struct old_info_monitor *)struct_star; - (void) fprintf(fp, - " address port count mode version lasttime firsttime\n"); - (void) fprintf(fp, - "======================================================================\n"); - while (items > 0) { - (void) fprintf(fp, "%-20.20s %5d %9ld %4d %3d %9lu %9lu\n", - nntohost(oml->addr), - ntohs(oml->port), - (u_long)ntohl(oml->count), - oml->mode, - oml->version, - (u_long)ntohl(oml->lasttime), - (u_long)ntohl(oml->firsttime)); - oml++; - items--; - } - } else { - /* issue warning according to new info_monitor size */ - checkitemsize(itemsize, sizeof(struct info_monitor)); - } -} - - -/* - * monitor - turn the server's monitor facility on or off - */ -static void -monitor(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - int items; - int itemsize; - char *dummy; - int req_code; - int res; - - if (STREQ(pcmd->argval[0].string, "on")) - req_code = REQ_MONITOR; - else if (STREQ(pcmd->argval[0].string, "off")) - req_code = REQ_NOMONITOR; - else { - (void) fprintf(fp, "monitor what?\n"); - return; - } - - res = doquery(IMPL_XNTPD, req_code, 1, 0, 0, (char *)0, - &items, &itemsize, &dummy, 0); - - if (res == 0) - (void) fprintf(fp, "done!\n"); - return; -} - - - -/* - * Mapping between command line strings and stat reset flags - */ -struct statreset { - char *str; - int flag; -} sreset[] = { - { "io", RESET_FLAG_IO }, - { "sys", RESET_FLAG_SYS }, - { "mem", RESET_FLAG_MEM }, - { "timer", RESET_FLAG_TIMER }, - { "auth", RESET_FLAG_AUTH }, - { "allpeers", RESET_FLAG_ALLPEERS }, - { "", 0 } -}; - -/* - * reset - reset statistic counters - */ -static void -reset(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct reset_flags rflags; - int items; - int itemsize; - char *dummy; - int i; - int res; - int err; - - err = 0; - rflags.flags = 0; - for (res = 0; res < pcmd->nargs; res++) { - for (i = 0; sreset[i].flag != 0; i++) { - if (STREQ(pcmd->argval[res].string, sreset[i].str)) - break; - } - if (sreset[i].flag == 0) { - (void) fprintf(fp, "Flag %s unknown\n", - pcmd->argval[res].string); - err++; - } else { - rflags.flags |= sreset[i].flag; - } - } - - if (err) { - (void) fprintf(fp, "Not done due to errors\n"); - return; - } - - res = doquery(IMPL_XNTPD, REQ_RESET_STATS, 1, 1, - sizeof(struct reset_flags), (char *)&rflags, &items, - &itemsize, &dummy, 0); - - if (res == 0) - (void) fprintf(fp, "done!\n"); - return; -} - - - -/* - * preset - reset stat counters for particular peers - */ -static void -preset(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - /* 8 is the maximum number of peers which will fit in a packet */ - struct conf_unpeer plist[min(MAXARGS, 8)]; - int qitems; - int items; - int itemsize; - char *dummy; - int res; - - for (qitems = 0; qitems < min(pcmd->nargs, 8); qitems++) { - plist[qitems].peeraddr = pcmd->argval[qitems].netnum; - } - - res = doquery(IMPL_XNTPD, REQ_RESET_PEER, 1, qitems, - sizeof(struct conf_unpeer), (char *)plist, &items, - &itemsize, &dummy, 0); - - if (res == 0) - (void) fprintf(fp, "done!\n"); -} - - -/* - * readkeys - request the server to reread the keys file - */ -/*ARGSUSED*/ -static void -readkeys(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - int items; - int itemsize; - char *dummy; - int res; - - res = doquery(IMPL_XNTPD, REQ_REREAD_KEYS, 1, 0, 0, (char *)0, - &items, &itemsize, &dummy, 0); - - if (res == 0) - (void) fprintf(fp, "done!\n"); - return; -} - - -/* - * trustkey - add some keys to the trusted key list - */ -static void -trustkey(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - do_trustkey(pcmd, fp, REQ_TRUSTKEY); -} - - -/* - * untrustkey - remove some keys from the trusted key list - */ -static void -untrustkey(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - do_trustkey(pcmd, fp, REQ_UNTRUSTKEY); -} - - -/* - * do_trustkey - do grunge work of adding/deleting keys - */ -static void -do_trustkey(pcmd, fp, req) - struct parse *pcmd; - FILE *fp; - int req; -{ - u_long keyids[MAXARGS]; - int i; - int items; - int itemsize; - char *dummy; - int ritems; - int res; - - ritems = 0; - for (i = 0; i < pcmd->nargs; i++) { - keyids[ritems++] = pcmd->argval[i].uval; - } - - res = doquery(IMPL_XNTPD, req, 1, ritems, sizeof(u_long), - (char *)keyids, &items, &itemsize, &dummy, 0); - - if (res == 0) - (void) fprintf(fp, "done!\n"); - return; -} - - - -/* - * authinfo - obtain and print info about authentication - */ -/*ARGSUSED*/ -static void -authinfo(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct info_auth *ia; - int items; - int itemsize; - int res; - - res = doquery(IMPL_XNTPD, REQ_AUTHINFO, 0, 0, 0, (char *)NULL, - &items, &itemsize, (char **)&ia, 0); - - if (res != 0 && items == 0) - return; - - if (!check1item(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_auth))) - return; - - (void) fprintf(fp, "time since reset: %ld\n", - (u_long)ntohl(ia->timereset)); - (void) fprintf(fp, "key lookups: %ld\n", - (u_long)ntohl(ia->keylookups)); - (void) fprintf(fp, "keys not found: %ld\n", - (u_long)ntohl(ia->keynotfound)); - (void) fprintf(fp, "uncached keys: %ld\n", - (u_long)ntohl(ia->keyuncached)); - (void) fprintf(fp, "encryptions: %ld\n", - (u_long)ntohl(ia->encryptions)); - (void) fprintf(fp, "decryptions: %ld\n", - (u_long)ntohl(ia->decryptions)); -} - - - -/* - * traps - obtain and print a list of traps - */ -/*ARGSUSED*/ -static void -traps(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - int i; - struct info_trap *it; - int items; - int itemsize; - int res; - - res = doquery(IMPL_XNTPD, REQ_TRAPS, 0, 0, 0, (char *)NULL, - &items, &itemsize, (char **)&it, 0); - - if (res != 0 && items == 0) - return; - - if (!checkitems(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_trap))) - return; - - for (i = 0; i < items; i++ ) { - if (i != 0) - (void) fprintf(fp, "\n"); - (void) fprintf(fp, "address %s, port %d\n", - numtoa(it->trap_address), ntohs(it->trap_port)); - (void) fprintf(fp, "interface: %s, ", - it->local_address==0?"wildcard":numtoa(it->local_address)); - - if (htonl(it->flags) & TRAP_CONFIGURED) - (void) fprintf(fp, "configured\n"); - else if (it->flags & TRAP_NONPRIO) - (void) fprintf(fp, "low priority\n"); - else - (void) fprintf(fp, "normal priority\n"); - - (void) fprintf(fp, "set for %ld secs, last set %ld secs ago\n", - (long)it->origtime, (long)it->settime); - (void) fprintf(fp, "sequence %d, number of resets %ld\n", - it->sequence, (long)it->resets); - } -} - - -/* - * addtrap - configure a trap - */ -static void -addtrap(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - do_addclr_trap(pcmd, fp, REQ_ADD_TRAP); -} - - -/* - * clrtrap - clear a trap from the server - */ -static void -clrtrap(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - do_addclr_trap(pcmd, fp, REQ_CLR_TRAP); -} - - -/* - * do_addclr_trap - do grunge work of adding/deleting traps - */ -static void -do_addclr_trap(pcmd, fp, req) - struct parse *pcmd; - FILE *fp; - int req; -{ - struct conf_trap ctrap; - int items; - int itemsize; - char *dummy; - int res; - - ctrap.trap_address = pcmd->argval[0].netnum; - ctrap.local_address = 0; - ctrap.trap_port = htons(TRAPPORT); - ctrap.unused = 0; - - if (pcmd->nargs > 1) { - ctrap.trap_port - = htons((u_short)(pcmd->argval[1].uval & 0xffff)); - if (pcmd->nargs > 2) - ctrap.local_address = pcmd->argval[2].netnum; - } - - res = doquery(IMPL_XNTPD, req, 1, 1, sizeof(struct conf_trap), - (char *)&ctrap, &items, &itemsize, &dummy, 0); - - if (res == 0) - (void) fprintf(fp, "done!\n"); - return; -} - - - -/* - * requestkey - change the server's request key (a dangerous request) - */ -static void -requestkey(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - do_changekey(pcmd, fp, REQ_REQUEST_KEY); -} - - -/* - * controlkey - change the server's control key - */ -static void -controlkey(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - do_changekey(pcmd, fp, REQ_CONTROL_KEY); -} - - - -/* - * do_changekey - do grunge work of changing keys - */ -static void -do_changekey(pcmd, fp, req) - struct parse *pcmd; - FILE *fp; - int req; -{ - u_long key; - int items; - int itemsize; - char *dummy; - int res; - - - key = htonl(pcmd->argval[0].uval); - - res = doquery(IMPL_XNTPD, req, 1, 1, sizeof(u_long), - (char *)&key, &items, &itemsize, &dummy, 0); - - if (res == 0) - (void) fprintf(fp, "done!\n"); - return; -} - - - -/* - * ctlstats - obtain and print info about authentication - */ -/*ARGSUSED*/ -static void -ctlstats(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct info_control *ic; - int items; - int itemsize; - int res; - - res = doquery(IMPL_XNTPD, REQ_GET_CTLSTATS, 0, 0, 0, (char *)NULL, - &items, &itemsize, (char **)&ic, 0); - - if (res != 0 && items == 0) - return; - - if (!check1item(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_control))) - return; - - (void) fprintf(fp, "time since reset: %ld\n", - (u_long)ntohl(ic->ctltimereset)); - (void) fprintf(fp, "requests received: %ld\n", - (u_long)ntohl(ic->numctlreq)); - (void) fprintf(fp, "responses sent: %ld\n", - (u_long)ntohl(ic->numctlresponses)); - (void) fprintf(fp, "fragments sent: %ld\n", - (u_long)ntohl(ic->numctlfrags)); - (void) fprintf(fp, "async messages sent: %ld\n", - (u_long)ntohl(ic->numasyncmsgs)); - (void) fprintf(fp, "error msgs sent: %ld\n", - (u_long)ntohl(ic->numctlerrors)); - (void) fprintf(fp, "total bad pkts: %ld\n", - (u_long)ntohl(ic->numctlbadpkts)); - (void) fprintf(fp, "packet too short: %ld\n", - (u_long)ntohl(ic->numctltooshort)); - (void) fprintf(fp, "response on input: %ld\n", - (u_long)ntohl(ic->numctlinputresp)); - (void) fprintf(fp, "fragment on input: %ld\n", - (u_long)ntohl(ic->numctlinputfrag)); - (void) fprintf(fp, "error set on input: %ld\n", - (u_long)ntohl(ic->numctlinputerr)); - (void) fprintf(fp, "bad offset on input: %ld\n", - (u_long)ntohl(ic->numctlbadoffset)); - (void) fprintf(fp, "bad version packets: %ld\n", - (u_long)ntohl(ic->numctlbadversion)); - (void) fprintf(fp, "data in pkt too short: %ld\n", - (u_long)ntohl(ic->numctldatatooshort)); - (void) fprintf(fp, "unknown op codes: %ld\n", - (u_long)ntohl(ic->numctlbadop)); -} - - - -/* - * Table for human printing leap bits - */ -char *leapbittab[] = { - "00 (no leap second scheduled)", - "01 (second to be added at end of month)", - "10 (second to be deleted at end of month)", - "11 (clock out of sync)" -}; - -char *controlleapbittab[] = { - "00 (leap controlled by lower stratum)", - "01 (second to be added at end of month)", - "10 (second to be deleted at end of month)", - "11 (lower stratum leap information ignored - no leap)" -}; - -/* - * leapinfo - obtain information about the state of the leap second support - */ -/*ARGSUSED*/ -static void -leapinfo(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct info_leap *il; - int items; - int itemsize; - int res; - l_fp ts; - - res = doquery(IMPL_XNTPD, REQ_GET_LEAPINFO, 0, 0, 0, (char *)NULL, - &items, &itemsize, (char **)&il, 0); - - if (res != 0 && items == 0) - return; - - if (!check1item(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_leap))) - return; - - (void) fprintf(fp, "sys.leap: %s\n", - leapbittab[il->sys_leap & INFO_LEAP_MASK]); - (void) fprintf(fp, "leap.indicator: %s\n", - controlleapbittab[il->leap_indicator & INFO_LEAP_MASK]); - (void) fprintf(fp, "leap.warning: %s\n", - controlleapbittab[il->leap_warning & INFO_LEAP_MASK]); - (void) fprintf(fp, "leap.bits: %s\n", - leapbittab[il->leap_bits & INFO_LEAP_MASK]); - if (il->leap_bits & INFO_LEAP_OVERRIDE) - (void) fprintf(fp, "Leap overide option in effect\n"); - if (il->leap_bits & INFO_LEAP_SEENSTRATUM1) - (void) fprintf(fp, "Stratum 1 restrictions in effect\n"); - (void) fprintf(fp, "time to next leap interrupt: %ld s\n", - (u_long)ntohl(il->leap_timer)); - gettstamp(&ts); - (void) fprintf(fp, "date of next leap interrupt: %s\n", - humandate(ts.l_ui + ntohl(il->leap_timer))); - (void) fprintf(fp, "calls to leap process: %lu\n", - (u_long)ntohl(il->leap_processcalls)); - (void) fprintf(fp, "leap more than month away: %lu\n", - (u_long)ntohl(il->leap_notclose)); - (void) fprintf(fp, "leap less than month away: %lu\n", - (u_long)ntohl(il->leap_monthofleap)); - (void) fprintf(fp, "leap less than day away: %lu\n", - (u_long)ntohl(il->leap_dayofleap)); - (void) fprintf(fp, "leap in less than 2 hours: %lu\n", - (u_long)ntohl(il->leap_hoursfromleap)); - (void) fprintf(fp, "leap happened: %lu\n", - (u_long)ntohl(il->leap_happened)); -} - - -/* - * clockstat - get and print clock status information - */ -static void -clockstat(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - extern struct clktype clktypes[]; - struct info_clock *cl; - /* 8 is the maximum number of clocks which will fit in a packet */ - u_long clist[min(MAXARGS, 8)]; - int qitems; - int items; - int itemsize; - int res; - l_fp ts; - struct clktype *clk; - u_long ltemp; - - for (qitems = 0; qitems < min(pcmd->nargs, 8); qitems++) - clist[qitems] = pcmd->argval[qitems].netnum; - - res = doquery(IMPL_XNTPD, REQ_GET_CLOCKINFO, 0, qitems, - sizeof(U_LONG), (char *)clist, &items, - &itemsize, (char **)&cl, 0); - - if (res != 0 && items == 0) - return; - - if (!checkitems(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_clock))) - return; - - while (items-- > 0) { - (void) fprintf(fp, "clock address: %s\n", - numtoa(cl->clockadr)); - for (clk = clktypes; clk->code >= 0; clk++) - if (clk->code == cl->type) - break; - if (clk->code >= 0) - (void) fprintf(fp, "clock type: %s\n", - clk->clocktype); - else - (void) fprintf(fp, "clock type: unknown type (%d)\n", - cl->type); - (void) fprintf(fp, "last event: %d\n", - cl->lastevent); - (void) fprintf(fp, "current status: %d\n", - cl->currentstatus); - (void) fprintf(fp, "number of polls: %lu\n", - (u_long)ntohl(cl->polls)); - (void) fprintf(fp, "no response to poll: %lu\n", - (u_long)ntohl(cl->noresponse)); - (void) fprintf(fp, "bad format responses: %lu\n", - (u_long)ntohl(cl->badformat)); - (void) fprintf(fp, "bad data responses: %lu\n", - (u_long)ntohl(cl->baddata)); - (void) fprintf(fp, "running time: %lu\n", - (u_long)ntohl(cl->timestarted)); - NTOHL_FP(&cl->fudgetime1, &ts); - (void) fprintf(fp, "fudge time 1: %s\n", - lfptoa(&ts, 6)); - NTOHL_FP(&cl->fudgetime2, &ts); - (void) fprintf(fp, "fudge time 2: %s\n", - lfptoa(&ts, 6)); - (void) fprintf(fp, "stratum: %ld\n", - (u_long)ntohl(cl->fudgeval1)); - ltemp = ntohl(cl->fudgeval2); - (void) fprintf(fp, "reference ID: %s\n", - (char *)<emp); - (void) fprintf(fp, "fudge flags: 0x%x\n", - cl->flags); - - if (items > 0) - (void) fprintf(fp, "\n"); - cl++; - } -} - - -/* - * fudge - set clock fudge factors - */ -static void -fudge(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct conf_fudge fudgedata; - int items; - int itemsize; - char *dummy; - l_fp ts; - int res; - long val; - int err; - - - err = 0; - memset((char *)&fudgedata, 0, sizeof fudgedata); - fudgedata.clockadr = pcmd->argval[0].netnum; - - if (STREQ(pcmd->argval[1].string, "time1")) { - fudgedata.which = htonl(FUDGE_TIME1); - if (!atolfp(pcmd->argval[2].string, &ts)) - err = 1; - else - NTOHL_FP(&ts, &fudgedata.fudgetime); - } else if (STREQ(pcmd->argval[1].string, "time2")) { - fudgedata.which = htonl(FUDGE_TIME2); - if (!atolfp(pcmd->argval[2].string, &ts)) - err = 1; - else - NTOHL_FP(&ts, &fudgedata.fudgetime); - } else if (STREQ(pcmd->argval[1].string, "val1")) { - fudgedata.which = htonl(FUDGE_VAL1); - if (!atoint(pcmd->argval[2].string, &val)) - err = 1; - else - fudgedata.fudgeval_flags = htonl(val); - } else if (STREQ(pcmd->argval[1].string, "val2")) { - fudgedata.which = htonl(FUDGE_VAL2); - if (!atoint(pcmd->argval[2].string, &val)) - err = 1; - else - fudgedata.fudgeval_flags = htonl(val); - } else if (STREQ(pcmd->argval[1].string, "flags")) { - fudgedata.which = htonl(FUDGE_FLAGS); - if (!atoint(pcmd->argval[2].string, &val)) - err = 1; - else - fudgedata.fudgeval_flags = htonl(val & 0xf); - } else { - (void) fprintf(stderr, "What fudge is %s?\n", - pcmd->argval[1].string); - return; - } - - if (err) { - (void) fprintf(stderr, "Unknown fudge parameter %s\n", - pcmd->argval[2].string); - return; - } - - - res = doquery(IMPL_XNTPD, REQ_SET_CLKFUDGE, 1, 1, - sizeof(struct conf_fudge), (char *)&fudgedata, &items, - &itemsize, &dummy, 0); - - if (res == 0) - (void) fprintf(fp, "done!\n"); - return; -} - -/* - * clkbug - get and print clock debugging information - */ -static void -clkbug(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - register int i; - register int n; - register u_long s; - struct info_clkbug *cl; - /* 8 is the maximum number of clocks which will fit in a packet */ - u_long clist[min(MAXARGS, 8)]; - u_long ltemp; - int qitems; - int items; - int itemsize; - int res; - l_fp ts; - - for (qitems = 0; qitems < min(pcmd->nargs, 8); qitems++) - clist[qitems] = pcmd->argval[qitems].netnum; - - res = doquery(IMPL_XNTPD, REQ_GET_CLKBUGINFO, 0, qitems, - sizeof(U_LONG), (char *)clist, &items, - &itemsize, (char **)&cl, 0); - - if (res != 0 && items == 0) - return; - - if (!checkitems(items, fp)) - return; - - if (!checkitemsize(itemsize, sizeof(struct info_clkbug))) - return; - - while (items-- > 0) { - (void) fprintf(fp, "clock address: %s\n", - numtoa(cl->clockadr)); - n = (int)cl->nvalues; - (void) fprintf(fp, "values: %d", n); - s = ntohs(cl->svalues); - if (n > NUMCBUGVALUES) - n = NUMCBUGVALUES; - for (i = 0; i < n; i++) { - ltemp = (u_long)ntohl(cl->values[i]); - ltemp &= 0xffffffff; - if ((i & 0x3) == 0) - (void) fprintf(fp, "\n"); - if (s & (1 << i)) - (void) fprintf(fp, "%12ld", ltemp); - else - (void) fprintf(fp, "%12lu", ltemp); - } - (void) fprintf(fp, "\n"); - - n = (int)cl->ntimes; - (void) fprintf(fp, "times: %d", n); - s = ntohl(cl->stimes); - if (n > NUMCBUGTIMES) - n = NUMCBUGTIMES; - for (i = 0; i < n; i++) { - int needsp = 0; - if ((i & 0x1) == 0) - (void) fprintf(fp, "\n"); - else { - for (;needsp > 0; needsp--) - putc(' ', fp); - } - NTOHL_FP(&cl->times[i], &ts); - if (s & (1 << i)) { - (void) fprintf(fp, "%17s", - lfptoa(&ts, 6)); - needsp = 22; - } else { - (void) fprintf(fp, "%37s", - uglydate(&ts)); - needsp = 2; - } - } - (void) fprintf(fp, "\n"); - if (items > 0) { - cl++; - (void) fprintf(fp, "\n"); - } - } -} - - -/* - * setprecision - set the server's value of sys.precision - */ -static void -setprecision(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - long precision; - int items; - int itemsize; - char *dummy; - int res; - - precision = htonl(pcmd->argval[0].ival); - - res = doquery(IMPL_XNTPD, REQ_SET_PRECISION, 1, 1, sizeof(long), - (char *)&precision, &items, &itemsize, &dummy, 0); - - if (res == 0) - (void) fprintf(fp, "done!\n"); - return; -} - - -/* - * kerninfo - display the kernel pll/pps variables - */ -static void -kerninfo(pcmd, fp) - struct parse *pcmd; - FILE *fp; -{ - struct info_kernel *ik; - int items; - int itemsize; - int res; - - res = doquery(IMPL_XNTPD, REQ_GET_KERNEL, 0, 0, 0, (char *)NULL, - &items, &itemsize, (char **)&ik, 0); - if (res != 0 && items == 0) - return; - if (!check1item(items, fp)) - return; - if (!checkitemsize(itemsize, sizeof(struct info_kernel))) - return; - - /* - * pll variables - */ - (void)fprintf(fp, "pll offset: %ld us\n", - (long)(int32_t)ntohl(ik->offset)); - (void)fprintf(fp, "pll frequency: %s ppm\n", - fptoa((s_fp)ntohl(ik->freq), 3)); - (void)fprintf(fp, "maximum error: %ld us\n", - (u_long)ntohl(ik->maxerror)); - (void)fprintf(fp, "estimated error: %ld us\n", - (u_long)ntohl(ik->esterror)); - (void)fprintf(fp, "status: %04x\n", - ntohs(ik->status & 0xffff)); - (void)fprintf(fp, "pll time constant: %ld\n", - (u_long)ntohl(ik->constant)); - (void)fprintf(fp, "precision: %ld us\n", - (u_long)ntohl(ik->precision)); - (void)fprintf(fp, "frequency tolerance: %s ppm\n", - fptoa((s_fp)ntohl(ik->tolerance), 0)); - - /* - * For backwards compatibility (ugh), we find the pps variables - * only if the shift member is nonzero. - */ - if (!ik->shift) - return; - - /* - * pps variables - */ - (void)fprintf(fp, "pps frequency: %s ppm\n", - fptoa((s_fp)ntohl(ik->ppsfreq), 3)); - (void)fprintf(fp, "pps stability: %s ppm\n", - fptoa((s_fp)ntohl(ik->stabil), 3)); - (void)fprintf(fp, "pps jitter: %ld us\n", - (u_long)ntohl(ik->jitter)); - (void)fprintf(fp, "calibration interval: %d s\n", - 1 << ntohs(ik->shift)); - (void)fprintf(fp, "calibration cycles: %ld\n", - (u_long)ntohl(ik->calcnt)); - (void)fprintf(fp, "jitter exceeded: %ld\n", - (u_long)ntohl(ik->jitcnt)); - (void)fprintf(fp, "stability exceeded: %ld\n", - (u_long)ntohl(ik->stbcnt)); - (void)fprintf(fp, "calibration errors: %ld\n", - (u_long)ntohl(ik->errcnt)); -} |