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