summaryrefslogtreecommitdiffstats
path: root/usr.sbin/xntpd/patches/patch.10
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/xntpd/patches/patch.10')
-rw-r--r--usr.sbin/xntpd/patches/patch.101925
1 files changed, 0 insertions, 1925 deletions
diff --git a/usr.sbin/xntpd/patches/patch.10 b/usr.sbin/xntpd/patches/patch.10
deleted file mode 100644
index 1771b5f..0000000
--- a/usr.sbin/xntpd/patches/patch.10
+++ /dev/null
@@ -1,1925 +0,0 @@
-diff -c COPYRIGHT:1.1.1.16 COPYRIGHT:1.21
-*** COPYRIGHT:1.1.1.16 Wed Feb 2 18:09:17 1994
---- COPYRIGHT Wed Feb 2 18:09:18 1994
-***************
-*** 1,6 ****
- /******************************************************************************
- * *
-! * 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 *
---- 1,6 ----
- /******************************************************************************
- * *
-! * 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 *
-***************
-*** 55,58 ****
- * 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)
-! */
---- 55,58 ----
- * 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)
-! */
-diff -c doc/xntpd.8:1.1.1.12 doc/xntpd.8:3.24
-*** doc/xntpd.8:1.1.1.12 Wed Feb 2 18:10:44 1994
---- doc/xntpd.8 Wed Feb 2 18:10:45 1994
-***************
-*** 446,451 ****
---- 446,467 ----
- .Ip notrust 10
- Treat these hosts normally in other respects, but never use them as
- synchronization sources.
-+ .Ip limited 10
-+ 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 \*(L"client_limit\*(R" hosts
-+ that have shown up at the server and that have been active during the
-+ last \*(L"client_limit_period\*(R" seconds are accepted. Requests from
-+ other clients from the same net are rejected. Only time request
-+ packets are taken into account. \*(L"Private\*(R", \*(L"control\*(R",
-+ and \*(L"broadcast\*(R" 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
-+ .IR xntpd .
-+ Thus, monitoring is active as long as there is a restriction entry
-+ with the \*(L"limited\*(R" flag. The default value for
-+ \*(L"client_limit\*(R" is 3. The default value for
-+ \*(L"client_limit_period\*(R" is 3600 seconds.
- .Ip ntpport 10
- This is actually a match algorithm modifier, rather than a restriction
- flag. Its presence causes the restriction entry to be matched only if
-***************
-*** 469,474 ****
---- 485,505 ----
- considered an alternative to the standard NTP authentication facility. Source
- address based restrictions are easily circumvented by a determined cracker.
- .PP
-+ .B clientlimit
-+ .I limit
-+ .PP
-+ Sets \*(L"client_limit\*(R" to \*(L"limit\*(R", allows configuration
-+ of client limitation policy. This variable defines the number of
-+ clients from the same network that are allowed to use the server.
-+ .PP
-+ .B clientperiod
-+ .I period
-+ .PP
-+ Sets \*(L"client_limit_period\*(R", allows 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.
-+ .PP
- .B trap
- .I host_address
- [
-diff -c doc/xntpdc.8:1.1.1.2 doc/xntpdc.8:3.4
-*** doc/xntpdc.8:1.1.1.2 Wed Feb 2 18:10:46 1994
---- doc/xntpdc.8 Wed Feb 2 18:10:47 1994
-***************
-*** 539,544 ****
---- 539,555 ----
- Ignore all NTP mode 7 packets which attempt to modify the state of the
- server (i.e. run time reconfiguration). Queries which return information
- are permitted.
-+ .Ip notrap 10
-+ 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.
-+ .Ip lowpriotrap 10
-+ 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.
- .Ip noserve 10
- Ignore NTP packets whose mode is other than 7. In effect, time service is
- denied, though queries may still be permitted.
-***************
-*** 549,554 ****
---- 560,582 ----
- .Ip notrust 10
- Treat these hosts normally in other respects, but never use them as
- synchronization sources.
-+ .Ip limited 10
-+ 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 \*(L"client_limit\*(R" hosts
-+ that have shown up at the server and that have been active during the
-+ last \*(L"client_limit_period\*(R" seconds are accepted. Requests from
-+ other clients from the same net are rejected. Only time request
-+ packets are taken into account. \*(L"Private\*(R", \*(L"control\*(R",
-+ and \*(L"broadcast\*(R" 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
-+ .IR xntpd.
-+ Thus, monitoring is active as long as there is a restriction entry
-+ with the \*(L"limited\*(R" flag. The default value for
-+ \*(L"client_limit\*(R" is 3. The default value for
-+ \*(L"client_limit_period\*(R" is 3600 seconds. Currently both
-+ variables are not runtime configurable.
- .Ip ntpport 10
- This is actually a match algorithm modifier, rather than a restriction
- flag. Its presence causes the restriction entry to be matched only if
-diff -c hints/linux:1.1.1.1 hints/linux:1.2
-*** hints/linux:1.1.1.1 Wed Feb 2 18:10:58 1994
---- hints/linux Wed Feb 2 18:10:59 1994
-***************
-*** 1,29 ****
-
-! Requirements: kernel 0.99.14 or newer, libc 4.5 or newer
- ------------
-
-! With this configuration, xntp should build an run right out of the
-! box (see generic hints for how-to), with one big limitation: tickadj doesn't
-! work yet. This is especially painful since PCs are usually equipped with
-! untuned, badly-drifting quartzes, values up to 200 ppm being no exception.
-! Because the loop filter algorithms are limited to compensating no more than
-! 100 ppm, currently only one workaround is possible:
-! Compile your own kernel and adjust linux/include/linux/timex.h,
-! line 67 (in pl14):
-!
-! #define CLOCK_TICK_RATE 1193180 /* Underlying HZ */
-!
-! Since this is surely not true for your hardware, adjust the hundreds
-! to match your quartz. Adding 100 compensates for a drift of -83.8 ppm
-! (1/CLOCK_TICK_RATE). The number gets rounded to the nearest 100 so don't
-! bother to tune any finer.
-!
-! Fixing tickadj is already in my work queue, so the previous comment should be
-! obsolete RSN. If you really need to run xntp on any earlier versions of the
-! kernel or libc, or have any other question not covered in the READMEs / hint
-! files (sorry, necessary comment in the Linux community ;-) feel free to ask
-! me (duwe@informatik.uni-erlangen.de)
-!
-! xntp3.3b of 1993/12/06 : remember to change #define ntp_adjtime adjtimex to
-! __adjtimex in the Linux section (line 316). This is hopefully done if you
-! (don't :-) see this paragraph in the xntp3.x distribution.
---- 1,9 ----
-
-! Requirements: kernel 0.99.14y or newer, libc 4.5.8 or newer
- ------------
-
-! With this configuration, xntp should build an run right out of the box
-! (see generic hints for how-to). If you really need to run xntp on any earlier
-! versions of the kernel or libc, or have any other question not covered in the
-! READMEs / hint files (sorry, necessary comment in the Linux community ;-) feel
-! free to ask me (duwe@informatik.uni-erlangen.de)
-diff -c include/ntp.h:1.1.1.17 include/ntp.h:3.23
-*** include/ntp.h:1.1.1.17 Wed Feb 2 18:11:18 1994
---- include/ntp.h Wed Feb 2 18:11:18 1994
-***************
-*** 612,617 ****
---- 612,620 ----
- struct mon_data *hash_prev; /* previous 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 */
-***************
-*** 621,627 ****
- u_char version; /* version of incoming packet */
- };
-
-!
- /*
- * Structure used for restrictlist entries
- */
---- 624,635 ----
- u_char version; /* version of incoming 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
- */
-***************
-*** 645,654 ****
- #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_ALLFLAGS \
- (RES_IGNORE|RES_DONTSERVE|RES_DONTTRUST|RES_NOQUERY\
-! |RES_NOMODIFY|RES_NOPEER|RES_NOTRAP|RES_LPTRAP)
-
- /*
- * Match flags
---- 653,663 ----
- #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
-diff -c include/ntp_request.h:1.1.1.7 include/ntp_request.h:3.7
-*** include/ntp_request.h:1.1.1.7 Wed Feb 2 18:11:27 1994
---- include/ntp_request.h Wed Feb 2 18:11:28 1994
-***************
-*** 429,438 ****
---- 429,456 ----
- U_LONG processed; /* packets processed */
- U_LONG badauth; /* packets dropped because of authorization */
- U_LONG wanderhold;
-+ 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 {
-***************
-*** 546,551 ****
---- 564,570 ----
- 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 */
-***************
-*** 553,558 ****
---- 572,589 ----
- 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
-diff -c include/ntp_stdlib.h:1.1.1.7 include/ntp_stdlib.h:1.2
-*** include/ntp_stdlib.h:1.1.1.7 Wed Feb 2 18:11:31 1994
---- include/ntp_stdlib.h Wed Feb 2 18:11:31 1994
-***************
-*** 79,84 ****
---- 79,85 ----
- 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_LONG netof P((U_LONG));
- extern char * numtoa P((U_LONG));
- extern char * numtohost P((U_LONG));
- extern int octtoint P((const char *, U_LONG *));
-diff -c include/ntpd.h:1.1.1.7 include/ntpd.h:1.6
-*** include/ntpd.h:1.1.1.7 Wed Feb 2 18:11:38 1994
---- include/ntpd.h Wed Feb 2 18:11:38 1994
-***************
-*** 93,100 ****
-
- /* ntp_monitor.c */
- extern void init_mon P((void));
-! extern void mon_start P((void));
-! extern void mon_stop P((void));
- extern void monitor P((struct recvbuf *));
-
- /* ntp_peer.c */
---- 93,100 ----
-
- /* 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 */
-diff -c lib/Makefile.tmpl:1.1.1.14 lib/Makefile.tmpl:3.25
-*** lib/Makefile.tmpl:1.1.1.14 Wed Feb 2 18:12:06 1994
---- lib/Makefile.tmpl Wed Feb 2 18:12:07 1994
-***************
-*** 31,37 ****
- uglydate.c uinttoa.c utvtoa.c machines.c clocktypes.c \
- md5.c a_md5encrypt.c a_md5decrypt.c \
- a_md512crypt.c decodenetnum.c systime.c msyslog.c syssignal.c \
-! findconfig.c
-
- OBJS= atoint.o atolfp.o atouint.o auth12crypt.o authdecrypt.o authdes.o \
- authencrypt.o authkeys.o authparity.o authreadkeys.o authusekey.o \
---- 31,37 ----
- uglydate.c uinttoa.c utvtoa.c machines.c clocktypes.c \
- md5.c a_md5encrypt.c a_md5decrypt.c \
- a_md512crypt.c decodenetnum.c systime.c msyslog.c syssignal.c \
-! findconfig.c netof.c
-
- OBJS= atoint.o atolfp.o atouint.o auth12crypt.o authdecrypt.o authdes.o \
- authencrypt.o authkeys.o authparity.o authreadkeys.o authusekey.o \
-***************
-*** 44,50 ****
- uglydate.o uinttoa.o utvtoa.o machines.o clocktypes.o \
- md5.o a_md5encrypt.o a_md5decrypt.o \
- a_md512crypt.o decodenetnum.o systime.o msyslog.o syssignal.o \
-! findconfig.o
-
- $(LIBNAME).a: $(OBJS)
- ar rv $@ $?
---- 44,50 ----
- uglydate.o uinttoa.o utvtoa.o machines.o clocktypes.o \
- md5.o a_md5encrypt.o a_md5decrypt.o \
- a_md512crypt.o decodenetnum.o systime.o msyslog.o syssignal.o \
-! findconfig.o netof.o
-
- $(LIBNAME).a: $(OBJS)
- ar rv $@ $?
-diff -c /dev/null lib/netof.c:3.1
-*** /dev/null Wed Feb 2 18:13:07 1994
---- lib/netof.c Wed Feb 2 18:13:07 1994
-***************
-*** 0 ****
---- 1,25 ----
-+ /*
-+ * 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_LONG
-+ netof(num)
-+ U_LONG num;
-+ {
-+ register U_LONG netnum;
-+
-+ netnum = num;
-+
-+ if(IN_CLASSC(netnum))
-+ netnum &= IN_CLASSC_NET;
-+ else if (IN_CLASSB(netnum))
-+ netnum &= IN_CLASSB_NET;
-+ else /* treat als other like class A */
-+ netnum &= IN_CLASSA_NET;
-+ return netnum;
-+ }
-diff -c /dev/null parse/README.new_clocks:3.2
-*** /dev/null Wed Feb 2 18:14:30 1994
---- parse/README.new_clocks Wed Feb 2 18:14:30 1994
-***************
-*** 0 ****
---- 1,203 ----
-+ Here is an attempt to scetch out what you need to do in order to
-+ add another clock to the parse driver:
-+
-+ Prerequsites:
-+ - 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 */
-+ 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 the 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_LEAP LEAP 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)
-+
-+ 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 field 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
-+ {
-+ unsigned LONG (*convert)();
-+ /* conversion routine - your routine - cvt_<yourclock> */
-+ void (*syncevt)();
-+ /* routine for handling RS232 sync events (time stamps) - usually sync_simple */
-+ unsigned LONG (*syncpps)();
-+ /* PPS input routine - usually pps_simple */
-+ unsigned 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 */
-+ unsigned 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 referenc 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
-+ (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 closet to your and tweak that
-+ code.
-+ Two sorts of clocks are used with parse. Clocks that automatically sent
-+ thier time code (once a second) do not nee entries in the poll routines because
-+ they sent the data all the time. The second sort are the clocks that need a
-+ command sent to then 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 -c /dev/null parse/README.parse_clocks:3.1
-*** /dev/null Wed Feb 2 18:14:33 1994
---- parse/README.parse_clocks Wed Feb 2 18:14:33 1994
-***************
-*** 0 ****
---- 1,263 ----
-+ The parse driver currently supports several clock 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 210ms)
-+ 127.127.8.24-27 (FAU 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 -c parse/parsesolaris.c:1.1.1.5 parse/parsesolaris.c:3.11
-*** parse/parsesolaris.c:1.1.1.5 Wed Feb 2 18:14:49 1994
---- parse/parsesolaris.c Wed Feb 2 18:14:49 1994
-***************
-*** 65,71 ****
- {
- "parse", /* module name */
- &parseinfo, /* module information */
-! 0, /* not clean yet */
- /* lock ptr */
- };
-
---- 65,71 ----
- {
- "parse", /* module name */
- &parseinfo, /* module information */
-! D_NEW, /* not clean yet */
- /* lock ptr */
- };
-
-diff -c scripts/support/bin/monl:1.1.1.1 scripts/support/bin/monl:1.2
-*** scripts/support/bin/monl:1.1.1.1 Wed Feb 2 18:16:01 1994
---- scripts/support/bin/monl Wed Feb 2 18:16:01 1994
-***************
-*** 143,149 ****
- {
- chop;
- split;
-! ($host, $count, $mode, $version, $lasttime, $firsttime) = (@_[$[, $[+2 .. $[+6]);
-
- $Seen{$host, $mode} = 1;
-
---- 143,150 ----
- {
- chop;
- split;
-! ($host, $count, $mode, $version, $lasttime, $firsttime) =
-! (@_[$[, $[+2 .. $[+4, $#_-1,$#_]);
-
- $Seen{$host, $mode} = 1;
-
-diff -c util/tickadj.c:1.1.1.16 util/tickadj.c:3.17
-*** util/tickadj.c:1.1.1.16 Wed Feb 2 18:16:23 1994
---- util/tickadj.c Wed Feb 2 18:16:23 1994
-***************
-*** 1,4 ****
-! /* tickadj.c,v 3.1 1993/07/06 01:11:05 jbj Exp
- * 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
---- 1,4 ----
-! /*
- * 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
-***************
-*** 6,11 ****
---- 6,46 ----
- * mastered this yet.
- */
- #include <stdio.h>
-+
-+ #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 <sys/types.h>
- #include <sys/file.h>
- #include <sys/stat.h>
-***************
-*** 513,515 ****
---- 548,551 ----
- exit(1);
- }
- }
-+ #endif /* not Linux */
-diff -c xntpd/ntp_config.c:1.1.1.19 xntpd/ntp_config.c:3.24
-*** xntpd/ntp_config.c:1.1.1.19 Wed Feb 2 18:16:36 1994
---- xntpd/ntp_config.c Wed Feb 2 18:16:37 1994
-***************
-*** 58,63 ****
---- 58,64 ----
- * statsdir /var/NTP/
- * filegen peerstats [ file peerstats ] [ type day ] [ link ]
- * resolver /path/progname
-+ * netlimit integer
- *
- * And then some. See the manual page.
- */
-***************
-*** 94,99 ****
---- 95,102 ----
- #define CONFIG_PIDFILE 25
- #define CONFIG_LOGFILE 26
- #define CONFIG_SETVAR 27
-+ #define CONFIG_CLIENTLIMIT 28
-+ #define CONFIG_CLIENTPERIOD 29
-
- #define CONF_MOD_VERSION 1
- #define CONF_MOD_KEY 2
-***************
-*** 114,119 ****
---- 117,123 ----
- #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
-***************
-*** 179,184 ****
---- 183,190 ----
- { "pidfile", CONFIG_PIDFILE },
- { "logfile", CONFIG_LOGFILE },
- { "setvar", CONFIG_SETVAR },
-+ { "clientlimit", CONFIG_CLIENTLIMIT },
-+ { "clientperiod", CONFIG_CLIENTPERIOD },
- { "", CONFIG_UNKNOWN }
- };
-
-***************
-*** 217,222 ****
---- 223,229 ----
- { "notrap", CONF_RES_NOTRAP },
- { "lowpriotrap", CONF_RES_LPTRAP },
- { "ntpport", CONF_RES_NTPPORT },
-+ { "limited", CONF_RES_LIMITED },
- { "", CONFIG_UNKNOWN }
- };
-
-***************
-*** 817,825 ****
- errflg = 0;
- if (ntokens >= 2) {
- if (STREQ(tokens[1], "yes"))
-! mon_start();
- else if (STREQ(tokens[1], "no"))
-! mon_stop();
- else
- errflg++;
- } else {
---- 824,832 ----
- 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 {
-***************
-*** 965,970 ****
---- 972,981 ----
- peerkey |= RESM_NTPONLY;
- break;
-
-+ case CONF_RES_LIMITED:
-+ peerversion |= RES_LIMITED;
-+ break;
-+
- case CONFIG_UNKNOWN:
- errflg++;
- break;
-***************
-*** 1413,1418 ****
---- 1424,1483 ----
- 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];
-+
-+ sprintf(bp, "client_limit=%d", i);
-+ 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=%d", i);
-+ set_sys_var(bp, strlen(bp)+1, RO);
-+
-+ client_limit_period = i;
-+ }
-+ }
- break;
- }
- }
-diff -c xntpd/ntp_monitor.c:1.1.1.10 xntpd/ntp_monitor.c:3.9
-*** xntpd/ntp_monitor.c:1.1.1.10 Wed Feb 2 18:16:48 1994
---- xntpd/ntp_monitor.c Wed Feb 2 18:16:48 1994
-***************
-*** 58,64 ****
- static struct mon_data *mon_hash; /* Pointer to array of hash buckets */
- static int *mon_hash_count; /* Point to hash count stats keeper */
- struct mon_data mon_mru_list;
-!
- /*
- * List of free structures structures, and counters of free and total
- * structures. The free structures are linked with the hash_next field.
---- 58,64 ----
- static struct mon_data *mon_hash; /* Pointer to array of hash buckets */
- static int *mon_hash_count; /* Point to hash count stats keeper */
- 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.
-***************
-*** 93,99 ****
- * Don't do much of anything here. We don't allocate memory
- * until someone explicitly starts us.
- */
-! mon_enabled = 0;
- mon_have_memory = 0;
-
- mon_free_mem = 0;
---- 93,99 ----
- * 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_free_mem = 0;
-***************
-*** 103,108 ****
---- 103,109 ----
- mon_hash = 0;
- mon_hash_count = 0;
- memset((char *)&mon_mru_list, 0, sizeof mon_mru_list);
-+ memset((char *)&mon_fifo_list, 0, sizeof mon_fifo_list);
- }
-
-
-***************
-*** 110,122 ****
- * mon_start - start up the monitoring software
- */
- void
-! mon_start()
- {
- register struct mon_data *md;
- register int i;
-
-! if (mon_enabled)
- return;
-
- if (!mon_have_memory) {
- mon_hash = (struct mon_data *)
---- 111,128 ----
- * mon_start - start up the monitoring software
- */
- void
-! mon_start(mode)
-! int mode;
- {
- register struct mon_data *md;
- register int i;
-
-! if (mon_enabled != MON_OFF) {
-! mon_enabled |= mode;
- return;
-+ }
-+ if (mode == MON_OFF)
-+ return; /* Ooops.. */
-
- if (!mon_have_memory) {
- mon_hash = (struct mon_data *)
-***************
-*** 142,148 ****
- mon_mru_list.mru_next = &mon_mru_list;
- mon_mru_list.mru_prev = &mon_mru_list;
-
-! mon_enabled = 1;
- }
-
-
---- 148,157 ----
- 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;
- }
-
-
-***************
-*** 150,161 ****
- * mon_stop - stop the monitoring software
- */
- void
-! mon_stop()
- {
- register struct mon_data *md;
- register int i;
-
-! if (!mon_enabled)
- return;
-
- /*
---- 159,177 ----
- * mon_stop - stop the monitoring software
- */
- void
-! mon_stop(mode)
-! int mode;
- {
- register struct mon_data *md;
- 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;
-
- /*
-***************
-*** 176,182 ****
- mon_mru_list.mru_next = &mon_mru_list;
- mon_mru_list.mru_prev = &mon_mru_list;
-
-! mon_enabled = 0;
- }
-
-
---- 192,199 ----
- 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;
- }
-
-
-***************
-*** 194,200 ****
- register int mode;
- register struct mon_data *mdhash;
-
-! if (!mon_enabled)
- return;
-
- pkt = &rbufp->recv_pkt;
---- 211,217 ----
- register int mode;
- register struct mon_data *mdhash;
-
-! if (mon_enabled == MON_OFF)
- return;
-
- pkt = &rbufp->recv_pkt;
-***************
-*** 220,225 ****
---- 237,243 ----
- 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;
-***************
-*** 240,245 ****
---- 258,269 ----
- md->hash_next->hash_prev = md->hash_prev;
- md->hash_prev->hash_next = md->hash_next;
- *(mon_hash_count + MON_HASH(md->rmtadr)) -= 1;
-+ /*
-+ * 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_mem == 0)
- mon_getmoremem();
-***************
-*** 252,257 ****
---- 276,282 ----
- * 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);
-***************
-*** 260,266 ****
-
- /*
- * Shuffle him into the hash table, inserting him at the
-! * end. Also put him on top of the MRU list.
- */
- mdhash = mon_hash + MON_HASH(netnum);
- md->hash_next = mdhash;
---- 285,292 ----
-
- /*
- * Shuffle him into the hash table, inserting him at the
-! * end. Also put him on top of the MRU list
-! * and at bottom of FIFO list
- */
- mdhash = mon_hash + MON_HASH(netnum);
- md->hash_next = mdhash;
-***************
-*** 273,278 ****
---- 299,309 ----
- 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;
- }
-
-
-diff -c xntpd/ntp_proto.c:1.1.1.19 xntpd/ntp_proto.c:3.21
-*** xntpd/ntp_proto.c:1.1.1.19 Wed Feb 2 18:16:51 1994
---- xntpd/ntp_proto.c Wed Feb 2 18:16:52 1994
-***************
-*** 49,54 ****
---- 49,55 ----
- U_LONG sys_processed; /* packets processed */
- U_LONG sys_badauth; /* packets dropped because of authorization */
- U_LONG sys_wanderhold; /* sys_peer held to prevent wandering */
-+ U_LONG sys_limitrejected; /* pkts rejected due toclient count per net */
-
- /*
- * Imported from ntp_timer.c
-***************
-*** 373,378 ****
---- 374,394 ----
- 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.
- */
-***************
-*** 2165,2168 ****
---- 2181,2185 ----
- sys_badauth = 0;
- sys_wanderhold = 0;
- sys_stattime = current_time;
-+ sys_limitrejected = 0;
- }
-diff -c xntpd/ntp_request.c:1.1.1.14 xntpd/ntp_request.c:3.15
-*** xntpd/ntp_request.c:1.1.1.14 Wed Feb 2 18:16:55 1994
---- xntpd/ntp_request.c Wed Feb 2 18:16:55 1994
-***************
-*** 916,921 ****
---- 916,922 ----
- extern U_LONG sys_processed;
- extern U_LONG sys_badauth;
- extern U_LONG sys_wanderhold;
-+ extern U_LONG sys_limitrejected;
-
- ss = (struct info_sys_stats *)prepare_pkt(srcadr, inter, inpkt,
- sizeof(struct info_sys_stats));
-***************
-*** 930,936 ****
- ss->processed = htonl(sys_processed);
- ss->badauth = htonl(sys_badauth);
- ss->wanderhold = htonl(sys_wanderhold);
-!
- (void) more_pkt();
- flush_pkt();
- }
---- 931,937 ----
- ss->processed = htonl(sys_processed);
- ss->badauth = htonl(sys_badauth);
- ss->wanderhold = htonl(sys_wanderhold);
-! ss->limitrejected = htonl(sys_limitrejected);
- (void) more_pkt();
- flush_pkt();
- }
-***************
-*** 1311,1317 ****
- struct interface *inter;
- struct req_pkt *inpkt;
- {
-! mon_start();
- req_ack(srcadr, inter, inpkt, INFO_OKAY);
- }
-
---- 1312,1318 ----
- struct interface *inter;
- struct req_pkt *inpkt;
- {
-! mon_start(MON_ON);
- req_ack(srcadr, inter, inpkt, INFO_OKAY);
- }
-
-***************
-*** 1325,1331 ****
- struct interface *inter;
- struct req_pkt *inpkt;
- {
-! mon_stop();
- req_ack(srcadr, inter, inpkt, INFO_OKAY);
- }
-
---- 1326,1332 ----
- struct interface *inter;
- struct req_pkt *inpkt;
- {
-! mon_stop(MON_ON);
- req_ack(srcadr, inter, inpkt, INFO_OKAY);
- }
-
-***************
-*** 1497,1502 ****
---- 1498,1507 ----
- 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;
-diff -c xntpd/ntp_restrict.c:1.1.1.10 xntpd/ntp_restrict.c:3.10
-*** xntpd/ntp_restrict.c:1.1.1.10 Wed Feb 2 18:16:57 1994
---- xntpd/ntp_restrict.c Wed Feb 2 18:16:57 1994
-***************
-*** 1,4 ****
-! /* ntp_restrict.c,v 3.1 1993/07/06 01:11:28 jbj Exp
- * ntp_restrict.c - find out what restrictions this host is running under
- */
- #include <stdio.h>
---- 1,4 ----
-! /*
- * ntp_restrict.c - find out what restrictions this host is running under
- */
- #include <stdio.h>
-***************
-*** 60,65 ****
---- 60,80 ----
- 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];
-***************
-*** 70,81 ****
---- 85,102 ----
- 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
-***************
-*** 108,113 ****
---- 129,146 ----
- 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=%d", client_limit);
-+ set_sys_var(bp, strlen(bp)+1, RO);
-+ sprintf(bp, "client_limit_period=%d", client_limit_period);
-+ set_sys_var(bp, strlen(bp)+1, RO);
- }
-
-
-***************
-*** 150,155 ****
---- 183,302 ----
- 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: %d clients, period %d seconds, net is 0x%X\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: %d\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%X\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 %d: %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;
- }
-
-***************
-*** 257,262 ****
---- 404,413 ----
- 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;
-
-***************
-*** 265,272 ****
- * Remove some bits from the flags. If we didn't
- * find this one, just return.
- */
-! if (rl != 0)
- rl->flags &= (u_short)~flags;
- break;
-
- case RESTRICT_REMOVE:
---- 416,429 ----
- * 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:
-***************
-*** 280,285 ****
---- 437,447 ----
- && !(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;
-diff -c xntpd/ntp_unixclock.c:1.1.1.27 xntpd/ntp_unixclock.c:3.29
-*** xntpd/ntp_unixclock.c:1.1.1.27 Wed Feb 2 18:17:00 1994
---- xntpd/ntp_unixclock.c Wed Feb 2 18:17:01 1994
-***************
-*** 556,568 ****
- #endif /* SOLARIS */
-
- #ifdef SYS_LINUX
-! /* XXX should look this up somewhere ! */
- static void
- clock_parms(tickadj, tick)
- U_LONG *tickadj;
- U_LONG *tick;
- {
-! *tickadj = (U_LONG)1;
-! *tick = (U_LONG)10000;
- }
- #endif /* SYS_LINUX */
---- 556,573 ----
- #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 */
-diff -c xntpdc/ntpdc_ops.c:1.1.1.12 xntpdc/ntpdc_ops.c:3.16
-*** xntpdc/ntpdc_ops.c:1.1.1.12 Wed Feb 2 18:17:35 1994
---- xntpdc/ntpdc_ops.c Wed Feb 2 18:17:36 1994
-***************
-*** 846,853 ****
- if (!check1item(items, fp))
- return;
-
-! if (!checkitemsize(itemsize, sizeof(struct info_sys_stats)))
- return;
-
- (void) fprintf(fp, "system uptime: %d\n",
- ntohl(ss->timeup));
---- 846,857 ----
- 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: %d\n",
- ntohl(ss->timeup));
-***************
-*** 869,874 ****
---- 873,883 ----
- ntohl(ss->badauth));
- (void) fprintf(fp, "wander hold downs: %d\n",
- ntohl(ss->wanderhold));
-+ if (itemsize != sizeof(struct info_sys_stats))
-+ return;
-+
-+ (void) fprintf(fp, "limitation rejects: %d\n",
-+ ntohl(ss->limitrejected));
- }
-
-
-***************
-*** 1243,1248 ****
---- 1252,1258 ----
- { "nopeer", RES_NOPEER },
- { "notrap", RES_NOTRAP },
- { "lptrap", RES_LPTRAP },
-+ { "limited", RES_LIMITED },
- { "", 0 }
- };
-
-***************
-*** 1463,1468 ****
---- 1473,1479 ----
- FILE *fp;
- {
- struct info_monitor *ml;
-+ struct old_info_monitor *oml;
- int items;
- int itemsize;
- int res;
-***************
-*** 1476,1498 ****
- if (!checkitems(items, fp))
- return;
-
-! if (!checkitemsize(itemsize, sizeof(struct info_monitor)))
-! return;
-
-! (void) fprintf(fp,
-! " address port count mode version lasttime firsttime\n");
-! (void) fprintf(fp,
-! "=====================================================================\n");
-! while (items > 0) {
-! (void) fprintf(fp, "%-20.20s %5d %9d %4d %3d %9u %9u\n",
-! nntohost(ml->addr),
-! ntohs(ml->port),
-! ntohl(ml->count),
-! ml->mode, ml->version,
-! ntohl(ml->lasttime),
-! ntohl(ml->firsttime));
-! ml++;
-! items--;
- }
- }
-
---- 1487,1535 ----
- if (!checkitems(items, fp))
- return;
-
-! if (itemsize == sizeof(struct info_monitor)) {
-
-! (void) fprintf(fp,
-! " address port count mode version lastdrop lasttime firsttime\n");
-! (void) fprintf(fp,
-! "===============================================================================\n");
-! while (items > 0) {
-! (void) fprintf(fp, "%-20.20s %5d %9d %4d %3d %9u %9u %9u\n",
-! nntohost(ml->addr),
-! ntohs(ml->port),
-! ntohl(ml->count),
-! ml->mode,
-! ml->version,
-! ntohl(ml->lastdrop),
-! ntohl(ml->lasttime),
-! ntohl(ml->firsttime));
-! ml++;
-! items--;
-! }
-! } else {
-! if (itemsize != sizeof(struct old_info_monitor)) {
-! /* issue warning according to new info_monitor size */
-! checkitemsize(itemsize, sizeof(struct info_monitor));
-! return;
-! }
-!
-! oml = (struct old_info_monitor *)ml;
-! (void) fprintf(fp,
-! " address port count mode version lasttime firsttime\n");
-! (void) fprintf(fp,
-! "======================================================================\n");
-! while (items > 0) {
-! (void) fprintf(fp, "%-20.20s %5d %9d %4d %3d %9u %9u\n",
-! nntohost(oml->addr),
-! ntohs(oml->port),
-! ntohl(oml->count),
-! oml->mode,
-! oml->version,
-! ntohl(oml->lasttime),
-! ntohl(oml->firsttime));
-! oml++;
-! items--;
-! }
- }
- }
-
OpenPOWER on IntegriCloud