reindent-20030715
[openafs.git] / src / ntp / ntp.h
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #ifndef FD_SET
11 #define NFDBITS         32
12 #define FD_SETSIZE      32
13 #define FD_SET(n, p)    ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
14 #define FD_CLR(n, p)    ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
15 #define FD_ISSET(n, p)  ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
16 #define FD_ZERO(p)      memset((char *)(p), 0, sizeof(*(p)))
17 #endif
18
19 #ifndef NBBY
20 #define NBBY    8               /* number of bits per byte */
21 #endif
22
23 #define MAXNETIF        10
24
25 struct intf {
26     int fd;
27     char *name;
28     struct sockaddr_in sin;
29     struct sockaddr_in bcast;
30     struct sockaddr_in mask;
31     int uses;
32     int if_flags;
33 };
34 extern struct intf addrs[];
35 extern int nintf;
36
37 /*
38  *  Definitions for the masses
39  */
40 #define JAN_1970        2208988800      /* 1970 - 1900 in seconds */
41
42 /*
43  *  Daemon specific (ntpd.c)
44  */
45 #define SHIFT_MASK      0xff    /* number of intervals to wait */
46
47 #ifndef WAYTOOBIG
48 #define WAYTOOBIG       1000.0  /* Too many seconds to correct, something is
49                                  * really wrong */
50 #endif
51
52 #ifndef XTAL
53 #define XTAL    1               /* crystal controlled clock by default */
54 #endif
55
56 #ifndef NTPINITFILE
57 #define NTPINITFILE     "/etc/ntp.conf"
58 #endif
59 #ifndef NTPDRIFTCOMP
60 #define NTPDRIFTCOMP    "/etc/ntp.drift"
61 #endif
62
63 struct list {
64     struct ntp_peer *head;
65     struct ntp_peer *tail;
66     int members;
67 };
68
69 #define STRMCMP(a, cond, b) \
70         (((a) == UNSPECIFIED ? NTP_INFIN+1 : a) cond \
71          ((b) == UNSPECIFIED ? NTP_INFIN+1 : (b)))
72
73
74 /*
75  *  Definitions outlined in the NTP spec
76  */
77 #define NTP_VERSION     1
78 #define NTP_PORT        123     /* for ref only (see /etc/services) */
79 #define NTP_INFIN       15
80 #define NTP_MAXAGE      86400
81 #define NTP_MAXSKW      0.01    /* seconds */
82 #define NTP_MINDIST     0.02    /* seconds */
83 #ifdef  REFCLOCK
84 #define NTP_REFMAXSKW   0.001   /* seconds (for REFCLOCKs) */
85 #define NTP_REFMINDIST  0.001   /* seconds (for REFCLOCKs) */
86 #endif
87 #define NTP_MINPOLL     6       /* (64) seconds between messages */
88 #define NTP_MAXPOLL     10      /* (1024) secs to poll */
89 #define NTP_WINDOW      8       /* size of shift register */
90 #define NTP_MAXWGT      8       /* maximum allowable dispersion */
91 #define NTP_MAXLIST     5       /* max size of selection list */
92 #define NTP_MAXSTRA     2       /* max number of strata in selection list */
93 #define X_NTP_CANDIDATES 64     /* number of peers to consider when doing
94                                  * clock selection */
95 #define NTP_SELECT      0.75    /* weight used to compute dispersion */
96
97 #define PEER_MAXDISP    64.0    /* Maximum dispersion  */
98 #define PEER_THRESHOLD  0.5     /* dispersion threshold */
99 #define PEER_FILTER     0.5     /* filter weight */
100
101 #if     XTAL == 0
102 #define PEER_SHIFT      4
103 #define NTP_WINDOW_SHIFT_MASK 0x0f
104 #else
105 #define PEER_SHIFT      8
106 #define NTP_WINDOW_SHIFT_MASK 0xff
107 #endif
108
109
110 /*
111  *  5.1 Uniform Phase Adjustments
112  *  Clock parameters
113  */
114 #define CLOCK_UPDATE    8       /* update interval (1<<CLOCK_UPDATE secs) */
115 #if     XTAL
116 #define CLOCK_ADJ       2       /* adjustment interval (1<<CLOCK_ADJ secs) */
117
118 #if defined (hpux)              /* must use settimeofday instead of adjtime */
119 #define CLOCK_PHASE     5       /* send bigger chunks */
120 #define CLOCK_MAX       0.128   /* maximum aperture (milliseconds) */
121
122 #else
123
124 #if defined (AFS_SUN_ENV)       /* these guys have such terrible clocks... */
125 #define CLOCK_PHASE     8       /* phase shift */
126 #define CLOCK_MAX       0.512   /* maximum aperture (milliseconds) */
127
128 #else
129
130 #if defined (AFS_AIX32_ENV)     /* there is a bug in adjtime */
131 #define CLOCK_PHASE     8       /* phase shift */
132 #define CLOCK_MAX       0.512   /* maximum aperture (milliseconds) */
133
134 #else
135
136 #define CLOCK_PHASE     8       /* phase shift */
137 #define CLOCK_MAX       0.128   /* maximum aperture (milliseconds) */
138 #endif
139 #endif
140 #endif
141
142 #else /*!XTAL */
143 #define CLOCK_ADJ       0
144 #define CLOCK_PHASE     6       /* phase shift */
145 #define CLOCK_MAX       0.512   /* maximum aperture (milliseconds) */
146 #endif
147 #define CLOCK_FREQ      10      /* frequency shift */
148 #define CLOCK_TRACK     8
149 #define CLOCK_COMP      4
150 #define CLOCK_FACTOR    18
151 \f
152 /*
153  * Structure definitions for NTP fixed point values
154  *
155  *    0                   1                   2                   3
156  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
157  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
158  *   |                         Integer Part                          |
159  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
160  *   |                         Fraction Part                         |
161  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
162  *
163  *    0                   1                   2                   3
164  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
165  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
166  *   |            Integer Part       |     Fraction Part             |
167  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
168 */
169 struct l_fixedpt {
170     afs_uint32 int_part;
171     afs_uint32 fraction;
172 };
173
174 struct s_fixedpt {
175     u_short int_part;
176     u_short fraction;
177 };
178
179 /* sign extension problem */
180 #if defined(AFS_SUN_ENV) || defined(AFS_HPUX_ENV)
181 #define s_char(v) char v
182 #else
183 #if defined(AFS_HPUX_ENV) || defined(AFS_AIX_ENV)
184 #define s_char(v) signed char v
185 #else
186 #define s_char(v) int v:8
187 #endif
188 #endif
189
190 /*  =================  Table 3.3. Packet Variables   ================= */
191 /*
192  *    0                   1                   2                   3
193  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
194  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
195  *   |LI | VN  | Mode|    Stratum    |      Poll     |   Precision   |
196  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
197  *   |                     Synchronizing Distance                    |
198  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
199  *   |                    Synchronizing Dispersion                   |
200  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
201  *   |                  Reference Clock Identifier                   |
202  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
203  *   |                                                               |
204  *   |                 Reference Timestamp (64 bits)                 |
205  *   |                                                               |
206  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
207  *   |                                                               |
208  *   |                 Originate Timestamp (64 bits)                 |
209  *   |                                                               |
210  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
211  *   |                                                               |
212  *   |                  Receive Timestamp (64 bits)                  |
213  *   |                                                               |
214  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
215  *   |                                                               |
216  *   |                  Transmit Timestamp (64 bits)                 |
217  *   |                                                               |
218  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
219 */
220 struct ntpdata {
221     u_char status;              /* status of local clock and leap info */
222     u_char stratum;             /* Stratum level */
223     u_char ppoll;               /* poll value */
224       s_char(precision);        /* -6..-31 */
225
226     struct s_fixedpt distance;
227     struct s_fixedpt dispersion;
228     afs_uint32 refid;
229     struct l_fixedpt reftime;
230     struct l_fixedpt org;
231     struct l_fixedpt rec;
232     struct l_fixedpt xmt;
233 };
234 /*
235  *      Leap Second Codes (high order two bits)
236  */
237 #define NO_WARNING      0x00    /* no warning */
238 #define PLUS_SEC        0x40    /* add a second (61 seconds) */
239 #define MINUS_SEC       0x80    /* minus a second (59 seconds) */
240 #define ALARM           0xc0    /* alarm condition (clock unsynchronized) */
241
242 #ifdef MODEMASK
243 #undef MODEMASK
244 #endif
245
246 /*
247  *      Clock Status Bits that Encode Version
248  */
249 #define NTPVERSION_1    0x08
250 #define VERSIONMASK     0x38
251 #define LEAPMASK        0xc0
252 #define MODEMASK        0x07
253
254 /*
255  *      Code values
256  */
257 #define MODE_UNSPEC     0       /* unspecified */
258 #define MODE_SYM_ACT    1       /* symmetric active */
259 #define MODE_SYM_PAS    2       /* symmetric passive */
260 #define MODE_CLIENT     3       /* client */
261 #define MODE_SERVER     4       /* server */
262 #define MODE_BROADCAST  5       /* broadcast */
263 #define MODE_RES1       6       /* reserved */
264 #define MODE_RES2       7       /* reserved */
265
266 /*
267  *      Stratum Definitions
268  */
269 #define UNSPECIFIED     0
270 #define PRIM_REF        1       /* radio clock */
271 #define INFO_QUERY      62      /* **** THIS implementation dependent **** */
272 #define INFO_REPLY      63      /* **** THIS implementation dependent **** */
273
274
275 /* =================  table 3.2 Peer Variables  ================= */
276 struct ntp_peer {
277     struct ntp_peer *next, *prev;
278     struct sockaddr_in src;     /* both peer.srcadr and 
279                                  * peer.srcport */
280     int flags;                  /* local flags */
281 #define PEER_FL_CONFIG          1
282 #define PEER_FL_AUTHENABLE      2
283 #define PEER_FL_SANE            0x0100  /* sane peer */
284 #define PEER_FL_CANDIDATE       0x0200  /* candidate peer */
285 #define PEER_FL_SYNC            0x1000  /* peer can bet sync'd to */
286 #define PEER_FL_BCAST           0x2000  /* broadcast peer */
287 #define PEER_FL_REFCLOCK        0x4000  /* peer is a local reference clock */
288 #define PEER_FL_SELECTED        0x8000  /* actually used by query routine */
289
290     int sock;                   /* index into sockets to derive
291                                  * peer.dstadr and peer.dstport */
292     u_char leap;                /* receive */
293     u_char hmode;               /* receive */
294     u_char stratum;             /* receive */
295     u_char ppoll;               /* receive */
296     u_char hpoll;               /* poll update */
297     short precision;            /* receive */
298     struct s_fixedpt distance;  /* receive */
299     struct s_fixedpt dispersion;        /* receive */
300     afs_uint32 refid;           /* receive */
301     struct l_fixedpt reftime;   /* receive */
302     struct l_fixedpt org;       /* receive, clear */
303     struct l_fixedpt rec;       /* receive, clear */
304     struct l_fixedpt xmt;       /* transmit, clear */
305     afs_uint32 reach;           /* receive, transmit, clear */
306     afs_uint32 valid;           /* packet, transmit, clear */
307     afs_uint32 timer;           /* receive, transmit, poll update */
308     afs_int32 stopwatch;        /* <<local>> for timing */
309     /*
310      * first order offsets
311      */
312     struct filter {
313         short samples;          /* <<local>> */
314         double offset[PEER_SHIFT];
315         double delay[PEER_SHIFT];
316     } filter;                   /* filter, clear */
317
318     double estdelay;            /* filter */
319     double estoffset;           /* filter */
320     double estdisp;             /* filter */
321
322     afs_uint32 pkt_sent;        /* <<local>> */
323     afs_uint32 pkt_rcvd;        /* <<local>> */
324     afs_uint32 pkt_dropped;     /* <<local>> */
325 };
326
327 /* ================= table 3.1:  System Variables ================= */
328
329 struct sysdata {                /* procedure */
330     u_char leap;                /* clock update */
331     u_char stratum;             /* clock update */
332     short precision;            /* system */
333     struct s_fixedpt distance;  /* clock update */
334     struct s_fixedpt dispersion;        /* clock update */
335     afs_uint32 refid;           /* clock update */
336     struct l_fixedpt reftime;   /* clock update */
337     int hold;                   /* clock update */
338     struct ntp_peer *peer;      /* selection */
339     int maxpeers;               /* <<local>> */
340     u_char filler;              /* put here for %&*%$$ SUNs */
341 };
342 \f
343 #define NTPDC_VERSION   2
344
345 /*
346  *  These structures are used to pass information to the ntpdc (control)
347  *  program.  They are unique to this implementation and not part of the
348  *  NTP specification.
349  */
350 struct clockinfo {
351     afs_uint32 net_address;
352     afs_uint32 my_address;
353     u_short port;
354     u_short flags;
355     afs_uint32 pkt_sent;
356     afs_uint32 pkt_rcvd;
357     afs_uint32 pkt_dropped;
358     afs_uint32 timer;
359     u_char leap;
360     u_char stratum;
361     u_char ppoll;
362       s_char(precision);
363
364     u_char hpoll;
365     u_char filler1;
366     u_short reach;
367
368     afs_int32 estdisp;          /* scaled by 1000 */
369     afs_int32 estdelay;         /* in milliseconds */
370     afs_int32 estoffset;        /* in milliseconds */
371     afs_uint32 refid;
372     struct l_fixedpt reftime;
373     struct info_filter {
374         short index;
375         short filler;
376         afs_int32 offset[PEER_SHIFT];   /* in milliseconds */
377         afs_int32 delay[PEER_SHIFT];    /* in milliseconds */
378     } info_filter;
379 };
380
381 struct ntpinfo {
382     u_char version;
383     u_char type;                /* request type (stratum in ntp packets) */
384     u_char count;               /* number of entries in this packet */
385     u_char seq;                 /* sequence number of this packet */
386
387     u_char npkts;               /* total number of packets */
388     u_char peers;
389     u_char fill3;
390     u_char fill4;
391 };