154359Sroberto/*
254359Sroberto * ntp_control.h - definitions related to NTP mode 6 control messages
354359Sroberto */
454359Sroberto
554359Sroberto#include "ntp_types.h"
654359Sroberto
754359Srobertostruct ntp_control {
854359Sroberto	u_char li_vn_mode;		/* leap, version, mode */
954359Sroberto	u_char r_m_e_op;		/* response, more, error, opcode */
1054359Sroberto	u_short sequence;		/* sequence number of request */
1154359Sroberto	u_short status;			/* status word for association */
1282498Sroberto	associd_t associd;		/* association ID */
1354359Sroberto	u_short offset;			/* offset of this batch of data */
1454359Sroberto	u_short count;			/* count of data in this packet */
1554359Sroberto	u_char data[(480 + MAX_MAC_LEN)]; /* data + auth */
1654359Sroberto};
1754359Sroberto
1854359Sroberto/*
1954359Sroberto * Length of the control header, in octets
2054359Sroberto */
2154359Sroberto#define	CTL_HEADER_LEN		12
2254359Sroberto#define	CTL_MAX_DATA_LEN	468
2354359Sroberto
2454359Sroberto
2554359Sroberto/*
2654359Sroberto * Limits and things
2754359Sroberto */
2854359Sroberto#define	CTL_MAXTRAPS	3		/* maximum number of traps we allow */
2954359Sroberto#define	CTL_TRAPTIME	(60*60)		/* time out traps in 1 hour */
3054359Sroberto#define	CTL_MAXAUTHSIZE	64		/* maximum size of an authen'ed req */
3154359Sroberto
3254359Sroberto/*
3354359Sroberto * Decoding for the r_m_e_op field
3454359Sroberto */
3554359Sroberto#define	CTL_RESPONSE	0x80
3654359Sroberto#define	CTL_ERROR	0x40
3754359Sroberto#define	CTL_MORE	0x20
3854359Sroberto#define	CTL_OP_MASK	0x1f
3954359Sroberto
4054359Sroberto#define	CTL_ISRESPONSE(r_m_e_op)	(((r_m_e_op) & 0x80) != 0)
4154359Sroberto#define	CTL_ISMORE(r_m_e_op)	(((r_m_e_op) & 0x20) != 0)
4254359Sroberto#define	CTL_ISERROR(r_m_e_op)	(((r_m_e_op) & 0x40) != 0)
4354359Sroberto#define	CTL_OP(r_m_e_op)	((r_m_e_op) & CTL_OP_MASK)
4454359Sroberto
4554359Sroberto/*
4654359Sroberto * Opcodes
4754359Sroberto */
4854359Sroberto#define	CTL_OP_UNSPEC		0
4954359Sroberto#define	CTL_OP_READSTAT		1
5054359Sroberto#define	CTL_OP_READVAR		2
5154359Sroberto#define	CTL_OP_WRITEVAR		3
5254359Sroberto#define	CTL_OP_READCLOCK	4
5354359Sroberto#define	CTL_OP_WRITECLOCK	5
5454359Sroberto#define	CTL_OP_SETTRAP		6
5554359Sroberto#define	CTL_OP_ASYNCMSG		7
5654359Sroberto#define	CTL_OP_UNSETTRAP	31
5754359Sroberto
5854359Sroberto/*
5954359Sroberto * {En,De}coding of the system status word
6054359Sroberto */
6154359Sroberto#define	CTL_SST_TS_UNSPEC	0	/* time source unspecified */
6254359Sroberto#define	CTL_SST_TS_ATOM		1	/* time source calibrated atomic */
6354359Sroberto#define	CTL_SST_TS_LF		2	/* time source VLF or LF radio */
6454359Sroberto#define	CTL_SST_TS_HF		3	/* time source HF radio */
6554359Sroberto#define	CTL_SST_TS_UHF		4	/* time source UHF radio */
6654359Sroberto#define	CTL_SST_TS_LOCAL	5	/* time source LOCAL */
6754359Sroberto#define	CTL_SST_TS_NTP		6	/* time source NTP */
6854359Sroberto#define	CTL_SST_TS_UDPTIME	7	/* time source UDP/TIME */
6954359Sroberto#define	CTL_SST_TS_WRSTWTCH	8	/* time source is wristwatch */
7054359Sroberto#define	CTL_SST_TS_TELEPHONE	9	/* time source is telephone modem */
7154359Sroberto#define CTL_SST_TS_PPS		0x20	/* time source is PPS signal */
7254359Sroberto
7354359Sroberto#define	CTL_SYS_MAXEVENTS	15
7454359Sroberto
7554359Sroberto#define	CTL_SYS_STATUS(li, source, nevnt, evnt) \
7654359Sroberto		(((((unsigned short)(li))<< 14)&0xc000) | \
7754359Sroberto		(((source)<<8)&0x3f00) | \
7854359Sroberto		(((nevnt)<<4)&0x00f0) | \
7954359Sroberto		((evnt)&0x000f))
8054359Sroberto
8154359Sroberto#define	CTL_SYS_LI(status)	(((status)>>14) & 0x3)
8254359Sroberto#define	CTL_SYS_SOURCE(status)	(((status)>>8) & 0x3f)
8354359Sroberto#define	CTL_SYS_NEVNT(status)	(((status)>>4) & 0xf)
8454359Sroberto#define	CTL_SYS_EVENT(status)	((status) & 0xf)
8554359Sroberto
8654359Sroberto/*
8754359Sroberto * {En,De}coding of the peer status word
8854359Sroberto */
8954359Sroberto#define	CTL_PST_CONFIG		0x80
9054359Sroberto#define	CTL_PST_AUTHENABLE	0x40
9154359Sroberto#define	CTL_PST_AUTHENTIC	0x20
9254359Sroberto#define	CTL_PST_REACH		0x10
9354359Sroberto#define	CTL_PST_UNSPEC		0x08
9454359Sroberto
9554359Sroberto#define	CTL_PST_SEL_REJECT	0	/*   reject */
9654359Sroberto#define	CTL_PST_SEL_SANE	1	/* x falsetick */
9754359Sroberto#define	CTL_PST_SEL_CORRECT	2	/* . excess */
9854359Sroberto#define	CTL_PST_SEL_SELCAND	3	/* - outlyer */
9954359Sroberto#define	CTL_PST_SEL_SYNCCAND	4	/* + candidat */
10054359Sroberto#define	CTL_PST_SEL_DISTSYSPEER	5	/* # selected */
10154359Sroberto#define	CTL_PST_SEL_SYSPEER	6	/* * sys.peer */
10254359Sroberto#define	CTL_PST_SEL_PPS		7	/* o pps.peer */
10354359Sroberto
10454359Sroberto#define	CTL_PEER_MAXEVENTS	15
10554359Sroberto
10654359Sroberto#define	CTL_PEER_STATUS(status, nevnt, evnt) \
10754359Sroberto		((((status)<<8) & 0xff00) | \
10854359Sroberto		(((nevnt)<<4) & 0x00f0) | \
10954359Sroberto		((evnt) & 0x000f))
11054359Sroberto
11154359Sroberto#define	CTL_PEER_STATVAL(status)(((status)>>8) & 0xff)
11254359Sroberto#define	CTL_PEER_NEVNT(status)	(((status)>>4) & 0xf)
11354359Sroberto#define	CTL_PEER_EVENT(status)	((status) & 0xf)
11454359Sroberto
11554359Sroberto/*
11654359Sroberto * {En,De}coding of the clock status word
11754359Sroberto */
11854359Sroberto#define	CTL_CLK_OKAY		0
11954359Sroberto#define	CTL_CLK_NOREPLY		1
12054359Sroberto#define	CTL_CLK_BADFORMAT	2
12154359Sroberto#define	CTL_CLK_FAULT		3
12254359Sroberto#define	CTL_CLK_PROPAGATION	4
12354359Sroberto#define	CTL_CLK_BADDATE		5
12454359Sroberto#define	CTL_CLK_BADTIME		6
12554359Sroberto
12654359Sroberto#define	CTL_CLK_STATUS(status, event) \
12754359Sroberto		((((status)<<8) & 0xff00) | \
12854359Sroberto		((event) & 0x00ff))
12954359Sroberto
13054359Sroberto/*
13154359Sroberto * Error code responses returned when the E bit is set.
13254359Sroberto */
13354359Sroberto#define	CERR_UNSPEC	0
13454359Sroberto#define	CERR_PERMISSION	1
13554359Sroberto#define	CERR_BADFMT	2
13654359Sroberto#define	CERR_BADOP	3
13754359Sroberto#define	CERR_BADASSOC	4
13854359Sroberto#define	CERR_UNKNOWNVAR	5
13954359Sroberto#define	CERR_BADVALUE	6
14054359Sroberto#define	CERR_RESTRICT	7
14154359Sroberto
14254359Sroberto#define	CERR_NORESOURCE	CERR_PERMISSION	/* wish there was a different code */
14354359Sroberto
14454359Sroberto
14554359Sroberto/*
14654359Sroberto * System variables we understand
14754359Sroberto */
14854359Sroberto#define	CS_LEAP		1
14954359Sroberto#define	CS_STRATUM	2
15054359Sroberto#define	CS_PRECISION	3
15154359Sroberto#define	CS_ROOTDELAY	4
15254359Sroberto#define	CS_ROOTDISPERSION	5
15354359Sroberto#define	CS_REFID	6
15454359Sroberto#define	CS_REFTIME	7
15554359Sroberto#define	CS_POLL		8
15654359Sroberto#define	CS_PEERID	9
15754359Sroberto#define CS_STATE	10
15854359Sroberto#define	CS_OFFSET	11
15954359Sroberto#define	CS_DRIFT	12
16082498Sroberto#define CS_JITTER	13
161182007Sroberto#define CS_ERROR	14
162182007Sroberto#define	CS_CLOCK	15
163182007Sroberto#define	CS_PROCESSOR	16
164182007Sroberto#define	CS_SYSTEM	17
165182007Sroberto#define CS_VERSION	18
166182007Sroberto#define	CS_STABIL	19
167182007Sroberto#define CS_VARLIST	20
168132451Sroberto#ifdef OPENSSL
169182007Sroberto#define CS_FLAGS	21
170182007Sroberto#define CS_HOST		22
171182007Sroberto#define CS_PUBLIC	23
172182007Sroberto#define	CS_CERTIF	24
173182007Sroberto#define	CS_REVTIME	25
174182007Sroberto#define CS_LEAPTAB	26
175182007Sroberto#define CS_TAI		27
176182007Sroberto#define	CS_DIGEST	28
177182007Sroberto#define CS_IDENT	29
178182007Sroberto#define	CS_REVOKE	30
179182007Sroberto#define	CS_MAXCODE	CS_REVOKE
18082498Sroberto#else
18154359Sroberto#define	CS_MAXCODE	CS_VARLIST
182132451Sroberto#endif /* OPENSSL */
18354359Sroberto
18454359Sroberto/*
18554359Sroberto * Peer variables we understand
18654359Sroberto */
18754359Sroberto#define	CP_CONFIG	1
18854359Sroberto#define	CP_AUTHENABLE	2
18954359Sroberto#define	CP_AUTHENTIC	3
19054359Sroberto#define	CP_SRCADR	4
19154359Sroberto#define	CP_SRCPORT	5
19254359Sroberto#define	CP_DSTADR	6
19354359Sroberto#define	CP_DSTPORT	7
19454359Sroberto#define	CP_LEAP		8
19554359Sroberto#define	CP_HMODE	9
19654359Sroberto#define	CP_STRATUM	10
19754359Sroberto#define	CP_PPOLL	11
19854359Sroberto#define	CP_HPOLL	12
19954359Sroberto#define	CP_PRECISION	13
20054359Sroberto#define	CP_ROOTDELAY	14
20154359Sroberto#define	CP_ROOTDISPERSION	15
20254359Sroberto#define	CP_REFID	16
20354359Sroberto#define	CP_REFTIME	17
20454359Sroberto#define	CP_ORG		18
20554359Sroberto#define	CP_REC		19
20654359Sroberto#define	CP_XMT		20
20754359Sroberto#define	CP_REACH	21
208182007Sroberto#define	CP_UNREACH	22
20954359Sroberto#define	CP_TIMER	23
21054359Sroberto#define	CP_DELAY	24
21154359Sroberto#define	CP_OFFSET	25
21254359Sroberto#define CP_JITTER	26
21354359Sroberto#define	CP_DISPERSION	27
21454359Sroberto#define	CP_KEYID	28
21554359Sroberto#define	CP_FILTDELAY	29
21654359Sroberto#define	CP_FILTOFFSET	30
21754359Sroberto#define	CP_PMODE	31
21854359Sroberto#define	CP_RECEIVED	32
21954359Sroberto#define	CP_SENT		33
22054359Sroberto#define	CP_FILTERROR	34
22154359Sroberto#define	CP_FLASH	35
22282498Sroberto#define CP_TTL		36
223182007Sroberto#define CP_VARLIST	37
224132451Sroberto#ifdef OPENSSL
225182007Sroberto#define CP_FLAGS	38
226182007Sroberto#define CP_HOST		39
227182007Sroberto#define CP_VALID	40
228132451Sroberto#define	CP_INITSEQ	41
229132451Sroberto#define	CP_INITKEY	42
230132451Sroberto#define	CP_INITTSP	43
231132451Sroberto#define	CP_DIGEST	44
232132451Sroberto#define CP_IDENT	45
233132451Sroberto#define	CP_MAXCODE	CP_IDENT
23482498Sroberto#else
23554359Sroberto#define	CP_MAXCODE	CP_VARLIST
236132451Sroberto#endif /* OPENSSL */
23754359Sroberto
23854359Sroberto/*
23954359Sroberto * Clock variables we understand
24054359Sroberto */
24154359Sroberto#define	CC_TYPE		1
24254359Sroberto#define	CC_TIMECODE	2
24354359Sroberto#define	CC_POLL		3
24454359Sroberto#define	CC_NOREPLY	4
24554359Sroberto#define	CC_BADFORMAT	5
24654359Sroberto#define	CC_BADDATA	6
24754359Sroberto#define	CC_FUDGETIME1	7
24854359Sroberto#define	CC_FUDGETIME2	8
24954359Sroberto#define	CC_FUDGEVAL1	9
25054359Sroberto#define	CC_FUDGEVAL2	10
25154359Sroberto#define	CC_FLAGS	11
25254359Sroberto#define	CC_DEVICE	12
25354359Sroberto#define CC_VARLIST	13
25454359Sroberto
25554359Sroberto#define	CC_MAXCODE	CC_VARLIST
25654359Sroberto
25754359Sroberto/*
25854359Sroberto * Definition of the structure used internally to hold trap information.
25954359Sroberto * ntp_request.c wants to see this.
26054359Sroberto */
26154359Srobertostruct ctl_trap {
262132451Sroberto	struct sockaddr_storage tr_addr;/* address of trap recipient */
26354359Sroberto	struct interface *tr_localaddr;	/* interface to send this through */
26454359Sroberto	u_long tr_settime;		/* time trap was set */
26554359Sroberto	u_long tr_count;		/* async messages sent to this guy */
26654359Sroberto	u_long tr_origtime;		/* time trap was originally set */
26754359Sroberto	u_long tr_resets;		/* count of resets for this trap */
26854359Sroberto	u_short tr_sequence;		/* trap sequence id */
26954359Sroberto	u_char tr_flags;		/* trap flags */
27054359Sroberto	u_char tr_version;		/* version number of trapper */
27154359Sroberto};
272182007Srobertoextern struct ctl_trap ctl_trap[];
27354359Sroberto
27454359Sroberto/*
27554359Sroberto * Flag bits
27654359Sroberto */
27754359Sroberto#define	TRAP_INUSE	0x1		/* this trap is active */
27854359Sroberto#define	TRAP_NONPRIO	0x2		/* this trap is non-priority */
27954359Sroberto#define	TRAP_CONFIGURED	0x4		/* this trap was configured */
28054359Sroberto
28154359Sroberto/*
28254359Sroberto * Types of things we may deal with
28354359Sroberto * shared between ntpq and library
28454359Sroberto */
28554359Sroberto#define	TYPE_SYS	1
28654359Sroberto#define	TYPE_PEER	2
28754359Sroberto#define	TYPE_CLOCK	3
288