1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
|
/*
* ntp_control.h - definitions related to NTP mode 6 control messages
*/
#include "ntp_types.h"
struct ntp_control {
u_char li_vn_mode; /* leap, version, mode */
u_char r_m_e_op; /* response, more, error, opcode */
u_short sequence; /* sequence number of request */
u_short status; /* status word for association */
associd_t associd; /* association ID */
u_short offset; /* offset of this batch of data */
u_short count; /* count of data in this packet */
u_char data[(480 + MAX_MAC_LEN)]; /* data + auth */
};
/*
* Length of the control header, in octets
*/
#define CTL_HEADER_LEN 12
#define CTL_MAX_DATA_LEN 468
/*
* Limits and things
*/
#define CTL_MAXTRAPS 3 /* maximum number of traps we allow */
#define CTL_TRAPTIME (60*60) /* time out traps in 1 hour */
#define CTL_MAXAUTHSIZE 64 /* maximum size of an authen'ed req */
/*
* Decoding for the r_m_e_op field
*/
#define CTL_RESPONSE 0x80
#define CTL_ERROR 0x40
#define CTL_MORE 0x20
#define CTL_OP_MASK 0x1f
#define CTL_ISRESPONSE(r_m_e_op) (((r_m_e_op) & 0x80) != 0)
#define CTL_ISMORE(r_m_e_op) (((r_m_e_op) & 0x20) != 0)
#define CTL_ISERROR(r_m_e_op) (((r_m_e_op) & 0x40) != 0)
#define CTL_OP(r_m_e_op) ((r_m_e_op) & CTL_OP_MASK)
/*
* Opcodes
*/
#define CTL_OP_UNSPEC 0
#define CTL_OP_READSTAT 1
#define CTL_OP_READVAR 2
#define CTL_OP_WRITEVAR 3
#define CTL_OP_READCLOCK 4
#define CTL_OP_WRITECLOCK 5
#define CTL_OP_SETTRAP 6
#define CTL_OP_ASYNCMSG 7
#define CTL_OP_UNSETTRAP 31
/*
* {En,De}coding of the system status word
*/
#define CTL_SST_TS_UNSPEC 0 /* time source unspecified */
#define CTL_SST_TS_ATOM 1 /* time source calibrated atomic */
#define CTL_SST_TS_LF 2 /* time source VLF or LF radio */
#define CTL_SST_TS_HF 3 /* time source HF radio */
#define CTL_SST_TS_UHF 4 /* time source UHF radio */
#define CTL_SST_TS_LOCAL 5 /* time source LOCAL */
#define CTL_SST_TS_NTP 6 /* time source NTP */
#define CTL_SST_TS_UDPTIME 7 /* time source UDP/TIME */
#define CTL_SST_TS_WRSTWTCH 8 /* time source is wristwatch */
#define CTL_SST_TS_TELEPHONE 9 /* time source is telephone modem */
#define CTL_SST_TS_PPS 0x20 /* time source is PPS signal */
#define CTL_SYS_MAXEVENTS 15
#define CTL_SYS_STATUS(li, source, nevnt, evnt) \
(((((unsigned short)(li))<< 14)&0xc000) | \
(((source)<<8)&0x3f00) | \
(((nevnt)<<4)&0x00f0) | \
((evnt)&0x000f))
#define CTL_SYS_LI(status) (((status)>>14) & 0x3)
#define CTL_SYS_SOURCE(status) (((status)>>8) & 0x3f)
#define CTL_SYS_NEVNT(status) (((status)>>4) & 0xf)
#define CTL_SYS_EVENT(status) ((status) & 0xf)
/*
* {En,De}coding of the peer status word
*/
#define CTL_PST_CONFIG 0x80
#define CTL_PST_AUTHENABLE 0x40
#define CTL_PST_AUTHENTIC 0x20
#define CTL_PST_REACH 0x10
#define CTL_PST_UNSPEC 0x08
#define CTL_PST_SEL_REJECT 0 /* reject */
#define CTL_PST_SEL_SANE 1 /* x falsetick */
#define CTL_PST_SEL_CORRECT 2 /* . excess */
#define CTL_PST_SEL_SELCAND 3 /* - outlyer */
#define CTL_PST_SEL_SYNCCAND 4 /* + candidat */
#define CTL_PST_SEL_DISTSYSPEER 5 /* # selected */
#define CTL_PST_SEL_SYSPEER 6 /* * sys.peer */
#define CTL_PST_SEL_PPS 7 /* o pps.peer */
#define CTL_PEER_MAXEVENTS 15
#define CTL_PEER_STATUS(status, nevnt, evnt) \
((((status)<<8) & 0xff00) | \
(((nevnt)<<4) & 0x00f0) | \
((evnt) & 0x000f))
#define CTL_PEER_STATVAL(status)(((status)>>8) & 0xff)
#define CTL_PEER_NEVNT(status) (((status)>>4) & 0xf)
#define CTL_PEER_EVENT(status) ((status) & 0xf)
/*
* {En,De}coding of the clock status word
*/
#define CTL_CLK_OKAY 0
#define CTL_CLK_NOREPLY 1
#define CTL_CLK_BADFORMAT 2
#define CTL_CLK_FAULT 3
#define CTL_CLK_PROPAGATION 4
#define CTL_CLK_BADDATE 5
#define CTL_CLK_BADTIME 6
#define CTL_CLK_STATUS(status, event) \
((((status)<<8) & 0xff00) | \
((event) & 0x00ff))
/*
* Error code responses returned when the E bit is set.
*/
#define CERR_UNSPEC 0
#define CERR_PERMISSION 1
#define CERR_BADFMT 2
#define CERR_BADOP 3
#define CERR_BADASSOC 4
#define CERR_UNKNOWNVAR 5
#define CERR_BADVALUE 6
#define CERR_RESTRICT 7
#define CERR_NORESOURCE CERR_PERMISSION /* wish there was a different code */
/*
* System variables we understand
*/
#define CS_LEAP 1
#define CS_STRATUM 2
#define CS_PRECISION 3
#define CS_ROOTDELAY 4
#define CS_ROOTDISPERSION 5
#define CS_REFID 6
#define CS_REFTIME 7
#define CS_POLL 8
#define CS_PEERID 9
#define CS_STATE 10
#define CS_OFFSET 11
#define CS_DRIFT 12
#define CS_JITTER 13
#define CS_ERROR 14
#define CS_CLOCK 15
#define CS_PROCESSOR 16
#define CS_SYSTEM 17
#define CS_VERSION 18
#define CS_STABIL 19
#define CS_VARLIST 20
#ifdef OPENSSL
#define CS_FLAGS 21
#define CS_HOST 22
#define CS_PUBLIC 23
#define CS_CERTIF 24
#define CS_REVTIME 25
#define CS_LEAPTAB 26
#define CS_TAI 27
#define CS_DIGEST 28
#define CS_IDENT 29
#define CS_REVOKE 30
#define CS_MAXCODE CS_REVOKE
#else
#define CS_MAXCODE CS_VARLIST
#endif /* OPENSSL */
/*
* Peer variables we understand
*/
#define CP_CONFIG 1
#define CP_AUTHENABLE 2
#define CP_AUTHENTIC 3
#define CP_SRCADR 4
#define CP_SRCPORT 5
#define CP_DSTADR 6
#define CP_DSTPORT 7
#define CP_LEAP 8
#define CP_HMODE 9
#define CP_STRATUM 10
#define CP_PPOLL 11
#define CP_HPOLL 12
#define CP_PRECISION 13
#define CP_ROOTDELAY 14
#define CP_ROOTDISPERSION 15
#define CP_REFID 16
#define CP_REFTIME 17
#define CP_ORG 18
#define CP_REC 19
#define CP_XMT 20
#define CP_REACH 21
#define CP_UNREACH 22
#define CP_TIMER 23
#define CP_DELAY 24
#define CP_OFFSET 25
#define CP_JITTER 26
#define CP_DISPERSION 27
#define CP_KEYID 28
#define CP_FILTDELAY 29
#define CP_FILTOFFSET 30
#define CP_PMODE 31
#define CP_RECEIVED 32
#define CP_SENT 33
#define CP_FILTERROR 34
#define CP_FLASH 35
#define CP_TTL 36
#define CP_VARLIST 37
#ifdef OPENSSL
#define CP_FLAGS 38
#define CP_HOST 39
#define CP_VALID 40
#define CP_INITSEQ 41
#define CP_INITKEY 42
#define CP_INITTSP 43
#define CP_DIGEST 44
#define CP_IDENT 45
#define CP_MAXCODE CP_IDENT
#else
#define CP_MAXCODE CP_VARLIST
#endif /* OPENSSL */
/*
* Clock variables we understand
*/
#define CC_TYPE 1
#define CC_TIMECODE 2
#define CC_POLL 3
#define CC_NOREPLY 4
#define CC_BADFORMAT 5
#define CC_BADDATA 6
#define CC_FUDGETIME1 7
#define CC_FUDGETIME2 8
#define CC_FUDGEVAL1 9
#define CC_FUDGEVAL2 10
#define CC_FLAGS 11
#define CC_DEVICE 12
#define CC_VARLIST 13
#define CC_MAXCODE CC_VARLIST
/*
* Definition of the structure used internally to hold trap information.
* ntp_request.c wants to see this.
*/
struct ctl_trap {
struct sockaddr_storage tr_addr;/* address of trap recipient */
struct interface *tr_localaddr; /* interface to send this through */
u_long tr_settime; /* time trap was set */
u_long tr_count; /* async messages sent to this guy */
u_long tr_origtime; /* time trap was originally set */
u_long tr_resets; /* count of resets for this trap */
u_short tr_sequence; /* trap sequence id */
u_char tr_flags; /* trap flags */
u_char tr_version; /* version number of trapper */
};
extern struct ctl_trap ctl_trap[];
/*
* Flag bits
*/
#define TRAP_INUSE 0x1 /* this trap is active */
#define TRAP_NONPRIO 0x2 /* this trap is non-priority */
#define TRAP_CONFIGURED 0x4 /* this trap was configured */
/*
* Types of things we may deal with
* shared between ntpq and library
*/
#define TYPE_SYS 1
#define TYPE_PEER 2
#define TYPE_CLOCK 3
|