154359Sroberto/* 254359Sroberto * ntp.h - NTP definitions for the masses 354359Sroberto */ 454359Sroberto#ifndef NTP_H 554359Sroberto#define NTP_H 654359Sroberto 754359Sroberto#include "ntp_types.h" 854359Sroberto#include <math.h> 9132451Sroberto#ifdef OPENSSL 10132451Sroberto#include "ntp_crypto.h" 11132451Sroberto#endif /* OPENSSL */ 12182007Sroberto#include <ntp_random.h> 1354359Sroberto 14182007Sroberto#include <isc/boolean.h> 15182007Sroberto#include <isc/list.h> 16182007Sroberto 1782498Sroberto/* 1882498Sroberto * Calendar arithmetic - contributed by G. Healton 1982498Sroberto */ 2082498Sroberto#define YEAR_BREAK 500 /* years < this are tm_year values: 2182498Sroberto * Break < AnyFourDigitYear && Break > 2282498Sroberto * Anytm_yearYear */ 2354359Sroberto 2482498Sroberto#define YEAR_PIVOT 98 /* 97/98: years < this are year 2000+ 2582498Sroberto * FYI: official UNIX pivot year is 2682498Sroberto * 68/69 */ 2754359Sroberto 2882498Sroberto/* 2982498Sroberto * Number of Days since 1 BC Gregorian to 1 January of given year 3082498Sroberto */ 3182498Sroberto#define julian0(year) (((year) * 365 ) + ((year) > 0 ? (((year) + 3) \ 3282498Sroberto / 4 - ((year - 1) / 100) + ((year - 1) / \ 3382498Sroberto 400)) : 0)) 3454359Sroberto 3582498Sroberto/* 3682498Sroberto * Number of days since start of NTP time to 1 January of given year 3782498Sroberto */ 3882498Sroberto#define ntp0(year) (julian0(year) - julian0(1900)) 3954359Sroberto 4082498Sroberto/* 4182498Sroberto * Number of days since start of UNIX time to 1 January of given year 4282498Sroberto */ 4382498Sroberto#define unix0(year) (julian0(year) - julian0(1970)) 4454359Sroberto 4582498Sroberto/* 4682498Sroberto * LEAP YEAR test for full 4-digit years (e.g, 1999, 2010) 4782498Sroberto */ 4882498Sroberto#define isleap_4(y) ((y) % 4 == 0 && !((y) % 100 == 0 && !(y % \ 4982498Sroberto 400 == 0))) 5054359Sroberto 5182498Sroberto/* 5282498Sroberto * LEAP YEAR test for tm_year (struct tm) years (e.g, 99, 110) 5382498Sroberto */ 5482498Sroberto#define isleap_tm(y) ((y) % 4 == 0 && !((y) % 100 == 0 && !(((y) \ 5582498Sroberto + 1900) % 400 == 0))) 5654359Sroberto 5782498Sroberto/* 5882498Sroberto * to convert simple two-digit years to tm_year style years: 5982498Sroberto * 6082498Sroberto * if (year < YEAR_PIVOT) 6182498Sroberto * year += 100; 6282498Sroberto * 6382498Sroberto * to convert either two-digit OR tm_year years to four-digit years: 6482498Sroberto * 6582498Sroberto * if (year < YEAR_PIVOT) 6682498Sroberto * year += 100; 6782498Sroberto * 6882498Sroberto * if (year < YEAR_BREAK) 6982498Sroberto * year += 1900; 7082498Sroberto */ 7154359Sroberto 7254359Sroberto/* 7354359Sroberto * How to get signed characters. On machines where signed char works, 7482498Sroberto * use it. On machines where signed char doesn't work, char had better 7554359Sroberto * be signed. 7654359Sroberto */ 7754359Sroberto#ifdef NEED_S_CHAR_TYPEDEF 7854359Sroberto# if SIZEOF_SIGNED_CHAR 7954359Srobertotypedef signed char s_char; 8054359Sroberto# else 8154359Srobertotypedef char s_char; 8254359Sroberto# endif 8354359Sroberto /* XXX: Why is this sequent bit INSIDE this test? */ 8454359Sroberto# ifdef sequent 8554359Sroberto# undef SO_RCVBUF 8654359Sroberto# undef SO_SNDBUF 8754359Sroberto# endif 8854359Sroberto#endif 8954359Sroberto#ifndef TRUE 9054359Sroberto# define TRUE 1 9154359Sroberto#endif /* TRUE */ 9254359Sroberto#ifndef FALSE 9354359Sroberto# define FALSE 0 9454359Sroberto#endif /* FALSE */ 9554359Sroberto 9654359Sroberto/* 9754359Sroberto * NTP protocol parameters. See section 3.2.6 of the specification. 9854359Sroberto */ 9954359Sroberto#define NTP_VERSION ((u_char)4) /* current version number */ 10054359Sroberto#define NTP_OLDVERSION ((u_char)1) /* oldest credible version */ 101132451Sroberto#define NTP_PORT 123 /* included for non-unix machines */ 102132451Sroberto 103132451Sroberto/* 104132451Sroberto * Poll interval parameters 105132451Sroberto */ 106182007Sroberto#define NTP_UNREACH 24 /* poll unreach threshold */ 10754359Sroberto#define NTP_MINPOLL 4 /* log2 min poll interval (16 s) */ 108132451Sroberto#define NTP_MINDPOLL 6 /* log2 default min poll (64 s) */ 109132451Sroberto#define NTP_MAXDPOLL 10 /* log2 default max poll (~17 m) */ 110132451Sroberto#define NTP_MAXPOLL 17 /* log2 max poll interval (~36 h) */ 111132451Sroberto#define NTP_BURST 8 /* packets in burst */ 112132451Sroberto#define BURST_DELAY 2 /* interburst delay (s) */ 113132451Sroberto#define RESP_DELAY 1 /* crypto response delay (s) */ 114132451Sroberto 115132451Sroberto/* 116132451Sroberto * Clock filter algorithm tuning parameters 117132451Sroberto */ 118132451Sroberto#define MAXDISPERSE 16. /* max dispersion */ 119132451Sroberto#define NTP_SHIFT 8 /* clock filter stages */ 12054359Sroberto#define NTP_FWEIGHT .5 /* clock filter weight */ 121132451Sroberto 122132451Sroberto/* 123132451Sroberto * Selection algorithm tuning parameters 124132451Sroberto */ 125182007Sroberto#define NTP_MINCLOCK 3 /* min survivors */ 126182007Sroberto#define NTP_MAXCLOCK 10 /* max candidates */ 127182007Sroberto#define NTP_MAXASSOC 50 /* max associations */ 128182007Sroberto#define MINDISPERSE .005 /* min dispersion increment */ 129182007Sroberto#define MAXDISTANCE 1. /* max root distance (select threshold) */ 130132451Sroberto#define CLOCK_SGATE 3. /* popcorn spike gate */ 13182498Sroberto#define HUFFPUFF 900 /* huff-n'-puff sample interval (s) */ 132182007Sroberto#define MAXHOP 2 /* anti-clockhop threshold */ 133132451Sroberto#define MAX_TTL 8 /* max ttl mapping vector size */ 134182007Sroberto#define BEACON 7200 /* manycast beacon interval */ 135182007Sroberto#define NTP_MAXEXTEN 1024 /* max extension field size */ 13682498Sroberto 13754359Sroberto/* 138132451Sroberto * Miscellaneous stuff 139132451Sroberto */ 140182007Sroberto#define NTP_MAXKEY 65535 /* max authentication key number */ 141132451Sroberto 142132451Sroberto/* 143132451Sroberto * Limits of things 144132451Sroberto */ 145132451Sroberto#define MAXFILENAME 128 /* max length of file name */ 146132451Sroberto#define MAXHOSTNAME 512 /* max length of host/node name */ 147182007Sroberto#define NTP_MAXSTRLEN 256 /* max string length */ 148132451Sroberto 149132451Sroberto/* 15082498Sroberto * Operations for jitter calculations (these use doubles). 15182498Sroberto * 15282498Sroberto * Note that we carefully separate the jitter component from the 15382498Sroberto * dispersion component (frequency error plus precision). The frequency 15482498Sroberto * error component is computed as CLOCK_PHI times the difference between 15582498Sroberto * the epoch of the time measurement and the reference time. The 15682498Sroberto * precision componen is computed as the square root of the mean of the 15782498Sroberto * squares of a zero-mean, uniform distribution of unit maximum 15882498Sroberto * amplitude. Whether this makes statistical sense may be arguable. 15954359Sroberto */ 16054359Sroberto#define SQUARE(x) ((x) * (x)) 16154359Sroberto#define SQRT(x) (sqrt(x)) 16254359Sroberto#define DIFF(x, y) (SQUARE((x) - (y))) 16354359Sroberto#define LOGTOD(a) ((a) < 0 ? 1. / (1L << -(a)) : \ 16454359Sroberto 1L << (int)(a)) /* log2 to double */ 16554359Sroberto#define UNIVAR(x) (SQUARE(.28867513 * LOGTOD(x))) /* std uniform distr */ 16654359Sroberto#define ULOGTOD(a) (1L << (int)(a)) /* ulog2 to double */ 16754359Sroberto 16882498Sroberto#define EVENT_TIMEOUT 0 /* one second, that is */ 16982498Sroberto 17054359Sroberto/* 17154359Sroberto * The interface structure is used to hold the addresses and socket 17254359Sroberto * numbers of each of the interfaces we are using. 17354359Sroberto */ 17454359Srobertostruct interface { 175132451Sroberto SOCKET fd; /* socket this is opened on */ 176182007Sroberto SOCKET bfd; /* socket for receiving broadcasts */ 177132451Sroberto struct sockaddr_storage sin; /* interface address */ 178182007Sroberto struct sockaddr_storage bcast; /* broadcast address */ 179182007Sroberto struct sockaddr_storage mask; /* interface mask */ 180182007Sroberto char name[32]; /* name of interface */ 181182007Sroberto short family; /* Address family */ 182182007Sroberto int flags; /* interface flags */ 183182007Sroberto int last_ttl; /* last TTL specified */ 184182007Sroberto u_int32 addr_refid; /* IPv4 addr or IPv6 hash */ 185182007Sroberto int num_mcast; /* No. of IP addresses in multicast socket */ 186182007Sroberto u_long starttime; /* current_time as of creation of interface structure */ 187182007Sroberto volatile long received; /* number of incoming packets */ 188182007Sroberto long sent; /* number of outgoing packets */ 189182007Sroberto long notsent; /* number of send failures */ 190182007Sroberto u_int scopeid; /* Scope used for Multicasting */ 191182007Sroberto u_int ifindex; /* interface index */ 192182007Sroberto u_int ifnum; /* sequential interface instance count */ 193182007Sroberto u_char phase; /* phase in update cycle */ 194182007Sroberto isc_boolean_t ignore_packets; /* Specify whether the packet should be ignored */ 195182007Sroberto ISC_LIST(struct peer) peers; /* list of peers for the interface */ 196182007Sroberto u_int peercnt; /* number of peers referencinf this interface - informational only */ 197182007Sroberto ISC_LINK(struct interface) link; /* interface list */ 19854359Sroberto}; 19954359Sroberto 20054359Sroberto/* 20154359Sroberto * Flags for interfaces 20254359Sroberto */ 203182007Sroberto#define INT_UP 0x001 /* Interface is up */ 204182007Sroberto#define INT_PPP 0x002 /* Point-to-point interface */ 205182007Sroberto#define INT_LOOPBACK 0x004 /* the loopback interface */ 206182007Sroberto#define INT_BROADCAST 0x008 /* can broadcast out this interface */ 207182007Sroberto#define INT_MULTICAST 0x010 /* can multicast out this interface */ 208182007Sroberto#define INT_BCASTOPEN 0x020 /* broadcast socket is open */ 209182007Sroberto#define INT_MCASTOPEN 0x040 /* multicasting enabled */ 210182007Sroberto#define INT_WILDCARD 0x080 /* wildcard interface - usually skipped */ 211182007Sroberto#define INT_MCASTIF 0x100 /* bound directly to MCAST address */ 21254359Sroberto/* 21382498Sroberto * Define flasher bits (tests 1 through 11 in packet procedure) 21454359Sroberto * These reveal the state at the last grumble from the peer and are 21554359Sroberto * most handy for diagnosing problems, even if not strictly a state 21654359Sroberto * variable in the spec. These are recorded in the peer structure. 217182007Sroberto * 218182007Sroberto * Packet errors 21954359Sroberto */ 220182007Sroberto#define TEST1 0X0001 /* duplicate packet */ 221182007Sroberto#define TEST2 0x0002 /* bogus packet */ 22254359Sroberto#define TEST3 0x0004 /* protocol unsynchronized */ 22382498Sroberto#define TEST4 0x0008 /* access denied */ 224182007Sroberto#define TEST5 0x0010 /* authentication error */ 225182007Sroberto#define TEST6 0x0020 /* bad synch or stratum */ 226182007Sroberto#define TEST7 0x0040 /* bad header data */ 227182007Sroberto#define TEST8 0x0080 /* autokey error */ 228182007Sroberto#define TEST9 0x0100 /* crypto error */ 229182007Sroberto#define PKT_TEST_MASK (TEST1 | TEST2 | TEST3 | TEST4 | TEST5 |\ 230182007Sroberto TEST6 | TEST7 | TEST8 | TEST9) 231182007Sroberto/* 232182007Sroberto * Peer errors 233182007Sroberto */ 234182007Sroberto#define TEST10 0x0200 /* peer bad synch or stratum */ 235182007Sroberto#define TEST11 0x0400 /* peer distance exceeded */ 236182007Sroberto#define TEST12 0x0800 /* peer synchronization loop */ 237182007Sroberto#define TEST13 0x1000 /* peer unreacable */ 238182007Sroberto#define PEER_TEST_MASK (TEST10 | TEST11 | TEST12 | TEST13) 23954359Sroberto 24054359Sroberto/* 241182007Sroberto * Authentication codes 242182007Sroberto */ 243182007Sroberto#define AUTH_NONE 0 /* no authentication */ 244182007Sroberto#define AUTH_OK 1 /* authentication OK */ 245182007Sroberto#define AUTH_ERROR 2 /* authentication error */ 246182007Sroberto#define AUTH_CRYPTO 3 /* crypto-NAK */ 247182007Sroberto 248182007Sroberto/* 24982498Sroberto * The peer structure. Holds state information relating to the guys 25082498Sroberto * we are peering with. Most of this stuff is from section 3.2 of the 25154359Sroberto * spec. 25254359Sroberto */ 25354359Srobertostruct peer { 25482498Sroberto struct peer *next; /* pointer to next association */ 25582498Sroberto struct peer *ass_next; /* link pointer in associd hash */ 256132451Sroberto struct sockaddr_storage srcadr; /* address of remote host */ 25782498Sroberto struct interface *dstadr; /* pointer to address on local host */ 258182007Sroberto ISC_LINK(struct peer) ilink; /* interface link list */ 25982498Sroberto associd_t associd; /* association ID */ 26082498Sroberto u_char version; /* version number */ 26182498Sroberto u_char hmode; /* local association mode */ 26282498Sroberto u_char hpoll; /* local poll interval */ 26382498Sroberto u_char minpoll; /* min poll interval */ 26482498Sroberto u_char maxpoll; /* max poll interval */ 26582498Sroberto u_int flags; /* association flags */ 26682498Sroberto u_char cast_flags; /* additional flags */ 26782498Sroberto u_int flash; /* protocol error test tally bits */ 26882498Sroberto u_char last_event; /* last peer error code */ 26982498Sroberto u_char num_events; /* number of error events */ 270132451Sroberto u_char ttl; /* ttl/refclock mode */ 27154359Sroberto 27282498Sroberto /* 27382498Sroberto * Variables used by reference clock support 27482498Sroberto */ 275182007Sroberto#ifdef REFCLOCK 27682498Sroberto struct refclockproc *procptr; /* refclock structure pointer */ 27782498Sroberto u_char refclktype; /* reference clock type */ 27882498Sroberto u_char refclkunit; /* reference clock unit number */ 27982498Sroberto u_char sstclktype; /* clock type for system status word */ 280182007Sroberto#endif /* REFCLOCK */ 28154359Sroberto 28282498Sroberto /* 28382498Sroberto * Variables set by received packet 28482498Sroberto */ 28582498Sroberto u_char leap; /* local leap indicator */ 28682498Sroberto u_char pmode; /* remote association mode */ 28782498Sroberto u_char stratum; /* remote stratum */ 288182007Sroberto u_char ppoll; /* remote poll interval */ 28982498Sroberto s_char precision; /* remote clock precision */ 290182007Sroberto double rootdelay; /* roundtrip delay to primary clock */ 291182007Sroberto double rootdispersion; /* dispersion to primary clock */ 29282498Sroberto u_int32 refid; /* remote reference ID */ 29382498Sroberto l_fp reftime; /* update epoch */ 29482498Sroberto 29582498Sroberto /* 29682498Sroberto * Variables used by authenticated client 29782498Sroberto */ 29882498Sroberto keyid_t keyid; /* current key ID */ 299132451Sroberto#ifdef OPENSSL 30082498Sroberto#define clear_to_zero assoc 30182498Sroberto associd_t assoc; /* peer association ID */ 30282498Sroberto u_int32 crypto; /* peer status word */ 303132451Sroberto EVP_PKEY *pkey; /* public key */ 304132451Sroberto const EVP_MD *digest; /* message digest algorithm */ 305132451Sroberto char *subject; /* certificate subject name */ 306132451Sroberto char *issuer; /* certificate issuer name */ 30782498Sroberto keyid_t pkeyid; /* previous key ID */ 308132451Sroberto keyid_t pcookie; /* peer cookie */ 309132451Sroberto EVP_PKEY *ident_pkey; /* identity key */ 310132451Sroberto tstamp_t fstamp; /* identity filestamp */ 311132451Sroberto BIGNUM *iffval; /* IFF/GQ challenge */ 312132451Sroberto BIGNUM *grpkey; /* GQ group key */ 313132451Sroberto struct value cookval; /* cookie values */ 314132451Sroberto struct value recval; /* receive autokey values */ 315132451Sroberto struct exten *cmmd; /* extension pointer */ 316132451Sroberto 31782498Sroberto /* 31882498Sroberto * Variables used by authenticated server 31982498Sroberto */ 32082498Sroberto keyid_t *keylist; /* session key ID list */ 32182498Sroberto int keynumber; /* current key number */ 322132451Sroberto struct value encrypt; /* send encrypt values */ 323132451Sroberto struct value sndval; /* send autokey values */ 324182007Sroberto struct value tai_leap; /* send leapsecond table */ 325132451Sroberto#else /* OPENSSL */ 32682498Sroberto#define clear_to_zero status 327132451Sroberto#endif /* OPENSSL */ 32882498Sroberto 32982498Sroberto /* 33082498Sroberto * Ephemeral state variables 33182498Sroberto */ 33282498Sroberto u_char status; /* peer status */ 33382498Sroberto u_char reach; /* reachability register */ 33482498Sroberto u_long epoch; /* reference epoch */ 335182007Sroberto u_int burst; /* packets remaining in burst */ 336182007Sroberto u_int filter_nextpt; /* index into filter shift register */ 33782498Sroberto double filter_delay[NTP_SHIFT]; /* delay shift register */ 33882498Sroberto double filter_offset[NTP_SHIFT]; /* offset shift register */ 33982498Sroberto double filter_disp[NTP_SHIFT]; /* dispersion shift register */ 34082498Sroberto u_long filter_epoch[NTP_SHIFT]; /* epoch shift register */ 34182498Sroberto u_char filter_order[NTP_SHIFT]; /* filter sort index */ 34282498Sroberto l_fp org; /* originate time stamp */ 34382498Sroberto l_fp rec; /* receive time stamp */ 34482498Sroberto l_fp xmt; /* transmit time stamp */ 34582498Sroberto double offset; /* peer clock offset */ 34682498Sroberto double delay; /* peer roundtrip delay */ 34782498Sroberto double jitter; /* peer jitter (squares) */ 34882498Sroberto double disp; /* peer dispersion */ 34982498Sroberto double estbdelay; /* clock offset to broadcast server */ 35082498Sroberto 35182498Sroberto /* 35282498Sroberto * End of clear-to-zero area 35382498Sroberto */ 35482498Sroberto u_long update; /* receive epoch */ 355132451Sroberto u_int unreach; /* unreachable count */ 356182007Sroberto#define end_clear_to_zero unreach 35782498Sroberto u_long outdate; /* send time last packet */ 35882498Sroberto u_long nextdate; /* send time next packet */ 359182007Sroberto u_long nextaction; /* peer local activity timeout (refclocks) */ 360132451Sroberto void (*action) P((struct peer *)); /* action timeout function */ 361182007Sroberto 36254359Sroberto /* 36382498Sroberto * Statistic counters 36454359Sroberto */ 36582498Sroberto u_long timereset; /* time stat counters were reset */ 36682498Sroberto u_long timereceived; /* last packet received time */ 36782498Sroberto u_long timereachable; /* last reachable/unreachable time */ 36882498Sroberto 36982498Sroberto u_long sent; /* packets sent */ 37082498Sroberto u_long received; /* packets received */ 37182498Sroberto u_long processed; /* packets processed by the protocol */ 37282498Sroberto u_long badauth; /* packets cryptosum failed */ 37382498Sroberto u_long bogusorg; /* packets bogus origin */ 37482498Sroberto u_long oldpkt; /* packets duplicate packet */ 375182007Sroberto u_long seldisptoolarge; /* packets dispersion too large */ 37682498Sroberto u_long selbroken; /* not used */ 37754359Sroberto}; 37854359Sroberto 37954359Sroberto/* 38054359Sroberto * Values for peer.leap, sys_leap 38154359Sroberto */ 38254359Sroberto#define LEAP_NOWARNING 0x0 /* normal, no leap second warning */ 38354359Sroberto#define LEAP_ADDSECOND 0x1 /* last minute of day has 61 seconds */ 38454359Sroberto#define LEAP_DELSECOND 0x2 /* last minute of day has 59 seconds */ 38554359Sroberto#define LEAP_NOTINSYNC 0x3 /* overload, clock is free running */ 38654359Sroberto 38754359Sroberto/* 388182007Sroberto * Values for peer mode and packet mode. Only the modes through 389182007Sroberto * MODE_BROADCAST and MODE_BCLIENT appear in the transition 390182007Sroberto * function. MODE_CONTROL and MODE_PRIVATE can appear in packets, 391182007Sroberto * but those never survive to the transition function. 392182007Sroberto * is a 39354359Sroberto */ 394132451Sroberto#define MODE_UNSPEC 0 /* unspecified (old version) */ 395182007Sroberto#define MODE_ACTIVE 1 /* symmetric active mode */ 396182007Sroberto#define MODE_PASSIVE 2 /* symmetric passive mode */ 39754359Sroberto#define MODE_CLIENT 3 /* client mode */ 39854359Sroberto#define MODE_SERVER 4 /* server mode */ 39954359Sroberto#define MODE_BROADCAST 5 /* broadcast mode */ 400182007Sroberto/* 401182007Sroberto * These can appear in packets 402182007Sroberto */ 403182007Sroberto#define MODE_CONTROL 6 /* control mode */ 404182007Sroberto#define MODE_PRIVATE 7 /* private mode */ 405182007Sroberto/* 406182007Sroberto * This is a madeup mode for broadcast client. 407182007Sroberto */ 408182007Sroberto#define MODE_BCLIENT 6 /* broadcast client mode */ 40954359Sroberto 41054359Sroberto/* 41154359Sroberto * Values for peer.stratum, sys_stratum 41254359Sroberto */ 413132451Sroberto#define STRATUM_REFCLOCK ((u_char)0) /* default stratum */ 41454359Sroberto/* A stratum of 0 in the packet is mapped to 16 internally */ 41554359Sroberto#define STRATUM_PKT_UNSPEC ((u_char)0) /* unspecified in packet */ 41682498Sroberto#define STRATUM_UNSPEC ((u_char)16) /* unspecified */ 41754359Sroberto 41854359Sroberto/* 41954359Sroberto * Values for peer.flags 42054359Sroberto */ 42182498Sroberto#define FLAG_CONFIG 0x0001 /* association was configured */ 42282498Sroberto#define FLAG_AUTHENABLE 0x0002 /* authentication required */ 42382498Sroberto#define FLAG_AUTHENTIC 0x0004 /* last message was authentic */ 42482498Sroberto#define FLAG_SKEY 0x0008 /* autokey authentication */ 42582498Sroberto#define FLAG_MCAST 0x0010 /* multicast client mode */ 42682498Sroberto#define FLAG_REFCLOCK 0x0020 /* this is actually a reference clock */ 42782498Sroberto#define FLAG_SYSPEER 0x0040 /* this is one of the selected peers */ 42882498Sroberto#define FLAG_PREFER 0x0080 /* this is the preferred peer */ 42982498Sroberto#define FLAG_BURST 0x0100 /* burst mode */ 43082498Sroberto#define FLAG_IBURST 0x0200 /* initial burst mode */ 431182007Sroberto#define FLAG_NOSELECT 0x0400 /* never select */ 432132451Sroberto#define FLAG_ASSOC 0x0800 /* autokey request */ 433182007Sroberto#define FLAG_FIXPOLL 0x1000 /* stick at minpoll */ 434182007Sroberto#define FLAG_TRUE 0x2000 /* select truechimer */ 435182007Sroberto#define FLAG_PREEMPT 0x4000 /* preemptable association */ 43654359Sroberto 43754359Sroberto/* 43854359Sroberto * Definitions for the clear() routine. We use memset() to clear 43954359Sroberto * the parts of the peer structure which go to zero. These are 44054359Sroberto * used to calculate the start address and length of the area. 44154359Sroberto */ 44254359Sroberto#define CLEAR_TO_ZERO(p) ((char *)&((p)->clear_to_zero)) 44354359Sroberto#define END_CLEAR_TO_ZERO(p) ((char *)&((p)->end_clear_to_zero)) 44454359Sroberto#define LEN_CLEAR_TO_ZERO (END_CLEAR_TO_ZERO((struct peer *)0) \ 44554359Sroberto - CLEAR_TO_ZERO((struct peer *)0)) 446132451Sroberto#define CRYPTO_TO_ZERO(p) ((char *)&((p)->clear_to_zero)) 447132451Sroberto#define END_CRYPTO_TO_ZERO(p) ((char *)&((p)->end_clear_to_zero)) 448132451Sroberto#define LEN_CRYPTO_TO_ZERO (END_CRYPTO_TO_ZERO((struct peer *)0) \ 44982498Sroberto - CRYPTO_TO_ZERO((struct peer *)0)) 45082498Sroberto 45154359Sroberto/* 45254359Sroberto * Reference clock identifiers (for pps signal) 45354359Sroberto */ 45454359Sroberto#define PPSREFID (u_int32)"PPS " /* used when pps controls stratum>1 */ 45554359Sroberto 45654359Sroberto/* 45754359Sroberto * Reference clock types. Added as necessary. 45854359Sroberto */ 45954359Sroberto#define REFCLK_NONE 0 /* unknown or missing */ 46054359Sroberto#define REFCLK_LOCALCLOCK 1 /* external (e.g., lockclock) */ 46154359Sroberto#define REFCLK_GPS_TRAK 2 /* TRAK 8810 GPS Receiver */ 46254359Sroberto#define REFCLK_WWV_PST 3 /* PST/Traconex 1020 WWV/H */ 46356746Sroberto#define REFCLK_SPECTRACOM 4 /* Spectracom (generic) Receivers */ 46454359Sroberto#define REFCLK_TRUETIME 5 /* TrueTime (generic) Receivers */ 465132451Sroberto#define REFCLK_IRIG_AUDIO 6 /* IRIG-B/W audio decoder */ 46656746Sroberto#define REFCLK_CHU_AUDIO 7 /* CHU audio demodulator/decoder */ 46754359Sroberto#define REFCLK_PARSE 8 /* generic driver (usually DCF77,GPS,MSF) */ 46854359Sroberto#define REFCLK_GPS_MX4200 9 /* Magnavox MX4200 GPS */ 46954359Sroberto#define REFCLK_GPS_AS2201 10 /* Austron 2201A GPS */ 47054359Sroberto#define REFCLK_GPS_ARBITER 11 /* Arbiter 1088A/B/ GPS */ 47154359Sroberto#define REFCLK_IRIG_TPRO 12 /* KSI/Odetics TPRO-S IRIG */ 47254359Sroberto#define REFCLK_ATOM_LEITCH 13 /* Leitch CSD 5300 Master Clock */ 47354359Sroberto#define REFCLK_MSF_EES 14 /* EES M201 MSF Receiver */ 47454359Sroberto#define REFCLK_GPSTM_TRUE 15 /* OLD TrueTime GPS/TM-TMD Receiver */ 47554359Sroberto#define REFCLK_IRIG_BANCOMM 16 /* Bancomm GPS/IRIG Interface */ 47654359Sroberto#define REFCLK_GPS_DATUM 17 /* Datum Programmable Time System */ 477182007Sroberto#define REFCLK_ACTS 18 /* Generic Auto Computer Time Service */ 47854359Sroberto#define REFCLK_WWV_HEATH 19 /* Heath GC1000 WWV/WWVH Receiver */ 47954359Sroberto#define REFCLK_GPS_NMEA 20 /* NMEA based GPS clock */ 48054359Sroberto#define REFCLK_GPS_VME 21 /* TrueTime GPS-VME Interface */ 48154359Sroberto#define REFCLK_ATOM_PPS 22 /* 1-PPS Clock Discipline */ 482182007Sroberto#define REFCLK_PTB_ACTS 23 /* replaced by REFCLK_ACTS */ 483182007Sroberto#define REFCLK_USNO 24 /* replaced by REFCLK_ACTS */ 48454359Sroberto#define REFCLK_GPS_HP 26 /* HP 58503A Time/Frequency Receiver */ 485132451Sroberto#define REFCLK_ARCRON_MSF 27 /* ARCRON MSF radio clock. */ 48654359Sroberto#define REFCLK_SHM 28 /* clock attached thru shared memory */ 48754359Sroberto#define REFCLK_PALISADE 29 /* Trimble Navigation Palisade GPS */ 48854359Sroberto#define REFCLK_ONCORE 30 /* Motorola UT Oncore GPS */ 48954359Sroberto#define REFCLK_GPS_JUPITER 31 /* Rockwell Jupiter GPS receiver */ 490132451Sroberto#define REFCLK_CHRONOLOG 32 /* Chrono-log K WWVB receiver */ 491132451Sroberto#define REFCLK_DUMBCLOCK 33 /* Dumb localtime clock */ 492132451Sroberto#define REFCLK_ULINK 34 /* Ultralink M320 WWVB receiver */ 49356746Sroberto#define REFCLK_PCF 35 /* Conrad parallel port radio clock */ 49456746Sroberto#define REFCLK_WWV_AUDIO 36 /* WWV/H audio demodulator/decoder */ 49556746Sroberto#define REFCLK_FG 37 /* Forum Graphic GPS */ 496132451Sroberto#define REFCLK_HOPF_SERIAL 38 /* hopf DCF77/GPS serial receiver */ 49782498Sroberto#define REFCLK_HOPF_PCI 39 /* hopf DCF77/GPS PCI receiver */ 498106163Sroberto#define REFCLK_JJY 40 /* JJY receiver */ 499106424Sroberto#define REFCLK_TT560 41 /* TrueTime 560 IRIG-B decoder */ 500106424Sroberto#define REFCLK_ZYFER 42 /* Zyfer GPStarplus receiver */ 501106424Sroberto#define REFCLK_RIPENCC 43 /* RIPE NCC Trimble driver */ 502132451Sroberto#define REFCLK_NEOCLOCK4X 44 /* NeoClock4X DCF77 or TDF receiver */ 503132451Sroberto#define REFCLK_MAX 44 /* NeoClock4X DCF77 or TDF receiver */ 50454359Sroberto 505132451Sroberto /* 506132451Sroberto * Macro for sockaddr_storage structures operations 507132451Sroberto */ 508132451Sroberto#define SOCKCMP(sock1, sock2) \ 509132451Sroberto (((struct sockaddr_storage *)sock1)->ss_family \ 510132451Sroberto == ((struct sockaddr_storage *)sock2)->ss_family ? \ 511132451Sroberto ((struct sockaddr_storage *)sock1)->ss_family == AF_INET ? \ 512132451Sroberto memcmp(&((struct sockaddr_in *)sock1)->sin_addr, \ 513132451Sroberto &((struct sockaddr_in *)sock2)->sin_addr, \ 514132451Sroberto sizeof(struct in_addr)) == 0 : \ 515132451Sroberto memcmp(&((struct sockaddr_in6 *)sock1)->sin6_addr, \ 516132451Sroberto &((struct sockaddr_in6 *)sock2)->sin6_addr, \ 517132451Sroberto sizeof(struct in6_addr)) == 0 : \ 518132451Sroberto 0) 519132451Sroberto 520132451Sroberto#define SOCKNUL(sock1) \ 521132451Sroberto (((struct sockaddr_storage *)sock1)->ss_family == AF_INET ? \ 522132451Sroberto (((struct sockaddr_in *)sock1)->sin_addr.s_addr == 0) : \ 523132451Sroberto (IN6_IS_ADDR_UNSPECIFIED(&((struct sockaddr_in6 *)sock1)->sin6_addr))) 524132451Sroberto 525132451Sroberto#define SOCKLEN(sock) \ 526132451Sroberto (((struct sockaddr_storage *)sock)->ss_family == AF_INET ? \ 527132451Sroberto (sizeof(struct sockaddr_in)) : (sizeof(struct sockaddr_in6))) 528132451Sroberto 529132451Sroberto#define ANYSOCK(sock) \ 530182007Sroberto memset(((struct sockaddr_storage *)sock), 0, \ 531132451Sroberto sizeof(struct sockaddr_storage)) 532132451Sroberto 533132451Sroberto#define ANY_INTERFACE_CHOOSE(sock) \ 534132451Sroberto (((struct sockaddr_storage *)sock)->ss_family == AF_INET ? \ 535132451Sroberto any_interface : any6_interface) 536132451Sroberto 53754359Sroberto/* 53854359Sroberto * We tell reference clocks from real peers by giving the reference 53954359Sroberto * clocks an address of the form 127.127.t.u, where t is the type and 54054359Sroberto * u is the unit number. We define some of this here since we will need 54154359Sroberto * some sanity checks to make sure this address isn't interpretted as 54254359Sroberto * that of a normal peer. 54354359Sroberto */ 54454359Sroberto#define REFCLOCK_ADDR 0x7f7f0000 /* 127.127.0.0 */ 54554359Sroberto#define REFCLOCK_MASK 0xffff0000 /* 255.255.0.0 */ 54654359Sroberto 54754359Sroberto#define ISREFCLOCKADR(srcadr) ((SRCADR(srcadr) & REFCLOCK_MASK) \ 54854359Sroberto == REFCLOCK_ADDR) 54954359Sroberto 55054359Sroberto/* 55154359Sroberto * Macro for checking for invalid addresses. This is really, really 55254359Sroberto * gross, but is needed so no one configures a host on net 127 now that 55354359Sroberto * we're encouraging it the the configuration file. 55454359Sroberto */ 55554359Sroberto#define LOOPBACKADR 0x7f000001 55654359Sroberto#define LOOPNETMASK 0xff000000 55754359Sroberto 55854359Sroberto#define ISBADADR(srcadr) (((SRCADR(srcadr) & LOOPNETMASK) \ 55954359Sroberto == (LOOPBACKADR & LOOPNETMASK)) \ 56054359Sroberto && (SRCADR(srcadr) != LOOPBACKADR)) 56154359Sroberto 56254359Sroberto/* 56354359Sroberto * Utilities for manipulating addresses and port numbers 56454359Sroberto */ 565132451Sroberto#define NSRCADR(src) (((struct sockaddr_in *)src)->sin_addr.s_addr) /* address in net byte order */ 566132451Sroberto#define NSRCPORT(src) (((struct sockaddr_in *)src)->sin_port) /* port in net byte order */ 56754359Sroberto#define SRCADR(src) (ntohl(NSRCADR((src)))) /* address in host byte order */ 56854359Sroberto#define SRCPORT(src) (ntohs(NSRCPORT((src)))) /* host port */ 56954359Sroberto 570132451Sroberto#define CAST_V4(src) ((struct sockaddr_in *)&(src)) 571132451Sroberto#define CAST_V6(src) ((struct sockaddr_in6 *)&(src)) 572132451Sroberto#define GET_INADDR(src) (CAST_V4(src)->sin_addr.s_addr) 573132451Sroberto#define GET_INADDR6(src) (CAST_V6(src)->sin6_addr) 574132451Sroberto 575132451Sroberto#define SET_HOSTMASK(addr, family) \ 576132451Sroberto do { \ 577132451Sroberto memset((char *)(addr), 0, sizeof(struct sockaddr_storage)); \ 578132451Sroberto (addr)->ss_family = (family); \ 579132451Sroberto if ((family) == AF_INET) \ 580132451Sroberto GET_INADDR(*(addr)) = 0xffffffff; \ 581132451Sroberto else \ 582132451Sroberto memset(&GET_INADDR6(*(addr)), 0xff, \ 583132451Sroberto sizeof(struct in6_addr)); \ 584132451Sroberto } while(0) 585132451Sroberto 58654359Sroberto/* 58754359Sroberto * NTP packet format. The mac field is optional. It isn't really 58854359Sroberto * an l_fp either, but for now declaring it that way is convenient. 58954359Sroberto * See Appendix A in the specification. 59054359Sroberto * 59154359Sroberto * Note that all u_fp and l_fp values arrive in network byte order 59254359Sroberto * and must be converted (except the mac, which isn't, really). 59354359Sroberto */ 59454359Srobertostruct pkt { 59582498Sroberto u_char li_vn_mode; /* leap indicator, version and mode */ 59682498Sroberto u_char stratum; /* peer stratum */ 59782498Sroberto u_char ppoll; /* peer poll interval */ 59882498Sroberto s_char precision; /* peer clock precision */ 59982498Sroberto u_fp rootdelay; /* distance to primary clock */ 60082498Sroberto u_fp rootdispersion; /* clock dispersion */ 60182498Sroberto u_int32 refid; /* reference clock ID */ 60282498Sroberto l_fp reftime; /* time peer clock was last updated */ 60382498Sroberto l_fp org; /* originate time stamp */ 60482498Sroberto l_fp rec; /* receive time stamp */ 60582498Sroberto l_fp xmt; /* transmit time stamp */ 60654359Sroberto 60782498Sroberto#define LEN_PKT_NOMAC 12 * sizeof(u_int32) /* min header length */ 60882498Sroberto#define LEN_PKT_MAC LEN_PKT_NOMAC + sizeof(u_int32) 60982498Sroberto#define MIN_MAC_LEN 3 * sizeof(u_int32) /* DES */ 61082498Sroberto#define MAX_MAC_LEN 5 * sizeof(u_int32) /* MD5 */ 61154359Sroberto 61254359Sroberto /* 61354359Sroberto * The length of the packet less MAC must be a multiple of 64 61482498Sroberto * with an RSA modulus and Diffie-Hellman prime of 64 octets 61582498Sroberto * and maximum host name of 128 octets, the maximum autokey 61682498Sroberto * command is 152 octets and maximum autokey response is 460 61782498Sroberto * octets. A packet can contain no more than one command and one 61882498Sroberto * response, so the maximum total extension field length is 672 61982498Sroberto * octets. But, to handle humungus certificates, the bank must 62082498Sroberto * be broke. 62154359Sroberto */ 622132451Sroberto#ifdef OPENSSL 623132451Sroberto u_int32 exten[NTP_MAXEXTEN / 4]; /* max extension field */ 624132451Sroberto#else /* OPENSSL */ 62582498Sroberto u_int32 exten[1]; /* misused */ 626132451Sroberto#endif /* OPENSSL */ 62782498Sroberto u_char mac[MAX_MAC_LEN]; /* mac */ 62854359Sroberto}; 62954359Sroberto 63054359Sroberto/* 63154359Sroberto * Stuff for extracting things from li_vn_mode 63254359Sroberto */ 63354359Sroberto#define PKT_MODE(li_vn_mode) ((u_char)((li_vn_mode) & 0x7)) 63454359Sroberto#define PKT_VERSION(li_vn_mode) ((u_char)(((li_vn_mode) >> 3) & 0x7)) 63554359Sroberto#define PKT_LEAP(li_vn_mode) ((u_char)(((li_vn_mode) >> 6) & 0x3)) 63654359Sroberto 63754359Sroberto/* 63854359Sroberto * Stuff for putting things back into li_vn_mode 63954359Sroberto */ 64054359Sroberto#define PKT_LI_VN_MODE(li, vn, md) \ 64154359Sroberto ((u_char)((((li) << 6) & 0xc0) | (((vn) << 3) & 0x38) | ((md) & 0x7))) 64254359Sroberto 64354359Sroberto 64454359Sroberto/* 64554359Sroberto * Dealing with stratum. 0 gets mapped to 16 incoming, and back to 0 64654359Sroberto * on output. 64754359Sroberto */ 64854359Sroberto#define PKT_TO_STRATUM(s) ((u_char)(((s) == (STRATUM_PKT_UNSPEC)) ?\ 64954359Sroberto (STRATUM_UNSPEC) : (s))) 65054359Sroberto 65154359Sroberto#define STRATUM_TO_PKT(s) ((u_char)(((s) == (STRATUM_UNSPEC)) ?\ 65254359Sroberto (STRATUM_PKT_UNSPEC) : (s))) 65354359Sroberto 65482498Sroberto/* 65582498Sroberto * Event codes. Used for reporting errors/events to the control module 65682498Sroberto */ 657132451Sroberto#define PEER_EVENT 0x080 /* this is a peer event */ 658132451Sroberto#define CRPT_EVENT 0x100 /* this is a crypto event */ 65954359Sroberto 66054359Sroberto/* 66182498Sroberto * System event codes 66254359Sroberto */ 66382498Sroberto#define EVNT_UNSPEC 0 /* unspecified */ 66482498Sroberto#define EVNT_SYSRESTART 1 /* system restart */ 66582498Sroberto#define EVNT_SYSFAULT 2 /* wsystem or hardware fault */ 66682498Sroberto#define EVNT_SYNCCHG 3 /* new leap or synch change */ 66782498Sroberto#define EVNT_PEERSTCHG 4 /* new source or stratum */ 66882498Sroberto#define EVNT_CLOCKRESET 5 /* clock reset */ 66982498Sroberto#define EVNT_BADDATETIM 6 /* invalid time or date */ 67082498Sroberto#define EVNT_CLOCKEXCPT 7 /* reference clock exception */ 67154359Sroberto 67282498Sroberto/* 67382498Sroberto * Peer event codes 67482498Sroberto */ 67582498Sroberto#define EVNT_PEERIPERR (1 | PEER_EVENT) /* IP error */ 67682498Sroberto#define EVNT_PEERAUTH (2 | PEER_EVENT) /* authentication failure */ 67782498Sroberto#define EVNT_UNREACH (3 | PEER_EVENT) /* change to unreachable */ 67882498Sroberto#define EVNT_REACH (4 | PEER_EVENT) /* change to reachable */ 67982498Sroberto#define EVNT_PEERCLOCK (5 | PEER_EVENT) /* clock exception */ 68054359Sroberto 68154359Sroberto/* 68254359Sroberto * Clock event codes 68354359Sroberto */ 68482498Sroberto#define CEVNT_NOMINAL 0 /* unspecified */ 68582498Sroberto#define CEVNT_TIMEOUT 1 /* poll timeout */ 68682498Sroberto#define CEVNT_BADREPLY 2 /* bad reply format */ 68782498Sroberto#define CEVNT_FAULT 3 /* hardware or software fault */ 68882498Sroberto#define CEVNT_PROP 4 /* propagation failure */ 68982498Sroberto#define CEVNT_BADDATE 5 /* bad date format or value */ 69082498Sroberto#define CEVNT_BADTIME 6 /* bad time format or value */ 69154359Sroberto#define CEVNT_MAX CEVNT_BADTIME 69254359Sroberto 69354359Sroberto/* 69454359Sroberto * Very misplaced value. Default port through which we send traps. 69554359Sroberto */ 69654359Sroberto#define TRAPPORT 18447 69754359Sroberto 69854359Sroberto 69954359Sroberto/* 70082498Sroberto * To speed lookups, peers are hashed by the low order bits of the 70182498Sroberto * remote IP address. These definitions relate to that. 70254359Sroberto */ 703182007Sroberto#define NTP_HASH_SIZE 128 704182007Sroberto#define NTP_HASH_MASK (NTP_HASH_SIZE-1) 705182007Sroberto#define NTP_HASH_ADDR(src) sock_hash(src) 70654359Sroberto 70754359Sroberto/* 708182007Sroberto * How we randomize polls. The poll interval is a power of two. We chose 709182007Sroberto * a random interval which is this value plus-minus one second. 71054359Sroberto */ 711182007Sroberto#define RANDPOLL(x) ((1 << (x)) - 1 + (ntp_random() & 0x3)) 71254359Sroberto 71354359Sroberto/* 71454359Sroberto * min, min3 and max. Makes it easier to transliterate the spec without 71554359Sroberto * thinking about it. 71654359Sroberto */ 71754359Sroberto#define min(a,b) (((a) < (b)) ? (a) : (b)) 71854359Sroberto#define max(a,b) (((a) > (b)) ? (a) : (b)) 71954359Sroberto#define min3(a,b,c) min(min((a),(b)), (c)) 72054359Sroberto 72154359Sroberto 72254359Sroberto/* 72354359Sroberto * Configuration items. These are for the protocol module (proto_config()) 72454359Sroberto */ 72554359Sroberto#define PROTO_BROADCLIENT 1 72654359Sroberto#define PROTO_PRECISION 2 /* (not used) */ 72754359Sroberto#define PROTO_AUTHENTICATE 3 72854359Sroberto#define PROTO_BROADDELAY 4 72954359Sroberto#define PROTO_AUTHDELAY 5 /* (not used) */ 73054359Sroberto#define PROTO_MULTICAST_ADD 6 73154359Sroberto#define PROTO_MULTICAST_DEL 7 73254359Sroberto#define PROTO_NTP 8 73354359Sroberto#define PROTO_KERNEL 9 73454359Sroberto#define PROTO_MONITOR 10 73554359Sroberto#define PROTO_FILEGEN 11 73682498Sroberto#define PROTO_PPS 12 73782498Sroberto#define PROTO_CAL 13 738132451Sroberto#define PROTO_MINCLOCK 14 739182007Sroberto#define PROTO_MAXCLOCK 15 740182007Sroberto#define PROTO_MINSANE 16 741182007Sroberto#define PROTO_FLOOR 17 742182007Sroberto#define PROTO_CEILING 18 743182007Sroberto#define PROTO_COHORT 19 744182007Sroberto#define PROTO_CALLDELAY 20 745182007Sroberto#define PROTO_MINDISP 21 746182007Sroberto#define PROTO_MAXDIST 22 747182007Sroberto#define PROTO_ADJ 23 748182007Sroberto#define PROTO_MAXHOP 24 749182007Sroberto#define PROTO_BEACON 25 750182007Sroberto#define PROTO_ORPHAN 26 75154359Sroberto 75254359Sroberto/* 75354359Sroberto * Configuration items for the loop filter 75454359Sroberto */ 75554359Sroberto#define LOOP_DRIFTINIT 1 /* set initial frequency offset */ 75654359Sroberto#define LOOP_DRIFTCOMP 2 /* set frequency offset */ 75782498Sroberto#define LOOP_MAX 3 /* set step offset */ 75882498Sroberto#define LOOP_PANIC 4 /* set panic offseet */ 75982498Sroberto#define LOOP_PHI 5 /* set dispersion rate */ 76082498Sroberto#define LOOP_MINSTEP 6 /* set step timeout */ 76182498Sroberto#define LOOP_MINPOLL 7 /* set min poll interval (log2 s) */ 76282498Sroberto#define LOOP_ALLAN 8 /* set minimum Allan intercept */ 76382498Sroberto#define LOOP_HUFFPUFF 9 /* set huff-n'-puff filter length */ 764132451Sroberto#define LOOP_FREQ 10 /* set initial frequency */ 765182007Sroberto#define LOOP_KERN_CLEAR 11 /* reset kernel pll parameters */ 76654359Sroberto 76754359Sroberto/* 76854359Sroberto * Configuration items for the stats printer 76954359Sroberto */ 77054359Sroberto#define STATS_FREQ_FILE 1 /* configure drift file */ 77154359Sroberto#define STATS_STATSDIR 2 /* directory prefix for stats files */ 77254359Sroberto#define STATS_PID_FILE 3 /* configure ntpd PID file */ 77354359Sroberto 774132451Sroberto#define MJD_1900 15020 /* MJD for 1 Jan 1900 */ 77554359Sroberto 77654359Sroberto/* 77754359Sroberto * Default parameters. We use these in the absence of something better. 77854359Sroberto */ 77954359Sroberto#define DEFBROADDELAY 4e-3 /* default broadcast offset */ 78054359Sroberto#define INADDR_NTP 0xe0000101 /* NTP multicast address 224.0.1.1 */ 78182498Sroberto 78254359Sroberto/* 78354359Sroberto * Structure used optionally for monitoring when this is turned on. 78454359Sroberto */ 78554359Srobertostruct mon_data { 78654359Sroberto struct mon_data *hash_next; /* next structure in hash list */ 78754359Sroberto struct mon_data *mru_next; /* next structure in MRU list */ 78854359Sroberto struct mon_data *mru_prev; /* previous structure in MRU list */ 789132451Sroberto u_long drop_count; /* dropped due RESLIMIT*/ 790132451Sroberto double avg_interval; /* average interpacket interval */ 791132451Sroberto u_long lasttime; /* interval since last packet */ 792132451Sroberto u_long count; /* total packet count */ 793132451Sroberto struct sockaddr_storage rmtadr; /* address of remote host */ 79454359Sroberto struct interface *interface; /* interface on which this arrived */ 79554359Sroberto u_short rmtport; /* remote port last came from */ 79654359Sroberto u_char mode; /* mode of incoming packet */ 79754359Sroberto u_char version; /* version of incoming packet */ 79854359Sroberto u_char cast_flags; /* flags MDF_?CAST */ 79954359Sroberto}; 80054359Sroberto 80182498Sroberto/* 80282498Sroberto * Values for cast_flags 80382498Sroberto */ 80482498Sroberto#define MDF_UCAST 0x01 /* unicast */ 80582498Sroberto#define MDF_MCAST 0x02 /* multicast */ 80682498Sroberto#define MDF_BCAST 0x04 /* broadcast */ 80782498Sroberto#define MDF_LCAST 0x08 /* localcast */ 80882498Sroberto#define MDF_ACAST 0x10 /* manycast */ 80982498Sroberto#define MDF_BCLNT 0x20 /* broadcast client */ 810132451Sroberto#define MDF_ACLNT 0x40 /* manycast client */ 81154359Sroberto 81254359Sroberto/* 81354359Sroberto * Values used with mon_enabled to indicate reason for enabling monitoring 81454359Sroberto */ 81554359Sroberto#define MON_OFF 0x00 /* no monitoring */ 81654359Sroberto#define MON_ON 0x01 /* monitoring explicitly enabled */ 81754359Sroberto#define MON_RES 0x02 /* implicit monitoring for RES_LIMITED */ 81854359Sroberto/* 81954359Sroberto * Structure used for restrictlist entries 82054359Sroberto */ 82154359Srobertostruct restrictlist { 82254359Sroberto struct restrictlist *next; /* link to next entry */ 823132451Sroberto u_int32 addr; /* Ipv4 host address (host byte order) */ 824132451Sroberto u_int32 mask; /* Ipv4 mask for address (host byte order) */ 82554359Sroberto u_long count; /* number of packets matched */ 82654359Sroberto u_short flags; /* accesslist flags */ 82754359Sroberto u_short mflags; /* match flags */ 82854359Sroberto}; 82954359Sroberto 830132451Srobertostruct restrictlist6 { 831132451Sroberto struct restrictlist6 *next; /* link to next entry */ 832132451Sroberto struct in6_addr addr6; /* Ipv6 host address */ 833132451Sroberto struct in6_addr mask6; /* Ipv6 mask address */ 834132451Sroberto u_long count; /* number of packets matched */ 835132451Sroberto u_short flags; /* accesslist flags */ 836132451Sroberto u_short mflags; /* match flags */ 837132451Sroberto}; 838132451Sroberto 839132451Sroberto 84054359Sroberto/* 84154359Sroberto * Access flags 84254359Sroberto */ 843132451Sroberto#define RES_IGNORE 0x001 /* ignore packet */ 844132451Sroberto#define RES_DONTSERVE 0x002 /* access denied */ 845132451Sroberto#define RES_DONTTRUST 0x004 /* authentication required */ 846132451Sroberto#define RES_VERSION 0x008 /* version mismatch */ 847132451Sroberto#define RES_NOPEER 0x010 /* new association denied */ 848132451Sroberto#define RES_LIMITED 0x020 /* packet rate exceeded */ 84954359Sroberto 850132451Sroberto#define RES_FLAGS (RES_IGNORE | RES_DONTSERVE |\ 851132451Sroberto RES_DONTTRUST | RES_VERSION |\ 852132451Sroberto RES_NOPEER | RES_LIMITED) 85354359Sroberto 854132451Sroberto#define RES_NOQUERY 0x040 /* mode 6/7 packet denied */ 855132451Sroberto#define RES_NOMODIFY 0x080 /* mode 6/7 modify denied */ 856132451Sroberto#define RES_NOTRAP 0x100 /* mode 6/7 set trap denied */ 857132451Sroberto#define RES_LPTRAP 0x200 /* mode 6/7 low priority trap */ 858132451Sroberto 859132451Sroberto#define RES_DEMOBILIZE 0x400 /* send kiss of death packet */ 860132451Sroberto#define RES_TIMEOUT 0x800 /* timeout this entry */ 861132451Sroberto 862132451Sroberto#define RES_ALLFLAGS (RES_FLAGS | RES_NOQUERY |\ 863132451Sroberto RES_NOMODIFY | RES_NOTRAP |\ 864132451Sroberto RES_LPTRAP | RES_DEMOBILIZE |\ 865132451Sroberto RES_TIMEOUT) 866132451Sroberto 86754359Sroberto/* 86854359Sroberto * Match flags 86954359Sroberto */ 87054359Sroberto#define RESM_INTERFACE 0x1 /* this is an interface */ 87154359Sroberto#define RESM_NTPONLY 0x2 /* match ntp port only */ 87254359Sroberto 87354359Sroberto/* 87454359Sroberto * Restriction configuration ops 87554359Sroberto */ 87654359Sroberto#define RESTRICT_FLAGS 1 /* add flags to restrict entry */ 87754359Sroberto#define RESTRICT_UNFLAG 2 /* remove flags from restrict entry */ 87854359Sroberto#define RESTRICT_REMOVE 3 /* remove a restrict entry */ 879182007Sroberto#define RESTRICT_REMOVEIF 4 /* remove an interface restrict entry */ 88054359Sroberto 88154359Sroberto/* 88254359Sroberto * Endpoint structure for the select algorithm 88354359Sroberto */ 88454359Srobertostruct endpoint { 88554359Sroberto double val; /* offset of endpoint */ 88654359Sroberto int type; /* interval entry/exit */ 88754359Sroberto}; 88854359Sroberto 88954359Sroberto/* 89054359Sroberto * Association matching AM[] return codes 89154359Sroberto */ 892182007Sroberto#define AM_ERR -1 /* error */ 893182007Sroberto#define AM_NOMATCH 0 /* no match */ 894182007Sroberto#define AM_PROCPKT 1 /* server/symmetric packet */ 895182007Sroberto#define AM_BCST 2 /* broadcast packet */ 896182007Sroberto#define AM_FXMIT 3 /* client packet */ 897182007Sroberto#define AM_MANYCAST 4 /* manycast packet */ 898182007Sroberto#define AM_NEWPASS 5 /* new passive */ 899182007Sroberto#define AM_NEWBCL 6 /* new broadcast */ 900182007Sroberto#define AM_POSSBCL 7 /* discard broadcast */ 90154359Sroberto 90254359Sroberto/* NetInfo configuration locations */ 90354359Sroberto#ifdef HAVE_NETINFO 90454359Sroberto#define NETINFO_CONFIG_DIR "/config/ntp" 90554359Sroberto#endif 90654359Sroberto 90754359Sroberto#endif /* NTP_H */ 908