convert-from-bsd-to-posix-string-and-memory-functions-20010807
[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 };
392
393