xref: /openbsd-src/usr.sbin/ntpd/ntp.h (revision c338e3e2ad38b099fa13a573170a235f9ed893ce)
1*c338e3e2Sotto /*	$OpenBSD: ntp.h,v 1.15 2023/11/15 15:52:09 otto Exp $ */
2ce81b4eaShenning 
3914fd659Shenning /*
4914fd659Shenning  * Copyright (c) 2004 Henning Brauer <henning@openbsd.org>
5914fd659Shenning  * Copyright (c) 2004 Alexander Guy <alexander.guy@andern.org>
6914fd659Shenning  *
7914fd659Shenning  * Permission to use, copy, modify, and distribute this software for any
8914fd659Shenning  * purpose with or without fee is hereby granted, provided that the above
9914fd659Shenning  * copyright notice and this permission notice appear in all copies.
10914fd659Shenning  *
11914fd659Shenning  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12914fd659Shenning  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13914fd659Shenning  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14914fd659Shenning  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15914fd659Shenning  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16914fd659Shenning  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17914fd659Shenning  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18914fd659Shenning  */
19914fd659Shenning 
205fbf7173Salexander #ifndef _NTP_H_
215fbf7173Salexander #define _NTP_H_
225fbf7173Salexander 
23914fd659Shenning /* Style borrowed from NTP ref/tcpdump and updated for SNTPv4 (RFC2030). */
24914fd659Shenning 
25914fd659Shenning /*
26914fd659Shenning  * RFC Section 3
27914fd659Shenning  *
28914fd659Shenning  *    0			  1		      2			  3
29914fd659Shenning  *    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
30914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
31914fd659Shenning  *   |			       Integer Part			     |
32914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
33914fd659Shenning  *   |			       Fraction Part			     |
34914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
35914fd659Shenning  *
36914fd659Shenning  *    0			  1		      2			  3
37914fd659Shenning  *    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
38914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
39914fd659Shenning  *   |		  Integer Part	     |	   Fraction Part	     |
40914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
41914fd659Shenning */
42914fd659Shenning struct l_fixedpt {
43af0b62daSmickey 	u_int32_t int_partl;
44af0b62daSmickey 	u_int32_t fractionl;
45914fd659Shenning };
46*c338e3e2Sotto #define L_DENOMINATOR	(UINT32_MAX + 1ULL)
47914fd659Shenning 
48914fd659Shenning struct s_fixedpt {
49af0b62daSmickey 	u_int16_t int_parts;
50af0b62daSmickey 	u_int16_t fractions;
51914fd659Shenning };
52*c338e3e2Sotto #define S_DENOMINATOR	(UINT16_MAX + 1)
53914fd659Shenning 
54914fd659Shenning /* RFC Section 4
55914fd659Shenning  *
56914fd659Shenning  *    0			  1		      2			  3
57914fd659Shenning  *    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
58914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59914fd659Shenning  *   |LI | VN  | Mode|	  Stratum    |	    Poll     |	 Precision   |
60914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
61914fd659Shenning  *   |			   Synchronizing Distance		     |
62914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63914fd659Shenning  *   |			  Synchronizing Dispersion		     |
64914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
65914fd659Shenning  *   |			Reference Clock Identifier		     |
66914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
67914fd659Shenning  *   |								     |
68914fd659Shenning  *   |		       Reference Timestamp (64 bits)		     |
69914fd659Shenning  *   |								     |
70914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
71914fd659Shenning  *   |								     |
72914fd659Shenning  *   |		       Originate Timestamp (64 bits)		     |
73914fd659Shenning  *   |								     |
74914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
75914fd659Shenning  *   |								     |
76914fd659Shenning  *   |			Receive Timestamp (64 bits)		     |
77914fd659Shenning  *   |								     |
78914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
79914fd659Shenning  *   |								     |
80914fd659Shenning  *   |			Transmit Timestamp (64 bits)		     |
81914fd659Shenning  *   |								     |
82914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
83914fd659Shenning  *   |                 Key Identifier (optional) (32)                |
84914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
85914fd659Shenning  *   |                                                               |
86914fd659Shenning  *   |                                                               |
87914fd659Shenning  *   |                 Message Digest (optional) (128)               |
88914fd659Shenning  *   |                                                               |
89914fd659Shenning  *   |                                                               |
90914fd659Shenning  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
91914fd659Shenning  *
92914fd659Shenning  */
93914fd659Shenning 
94914fd659Shenning #define	NTP_DIGESTSIZE		16
95914fd659Shenning #define	NTP_MSGSIZE_NOAUTH	48
96914fd659Shenning #define	NTP_MSGSIZE		(NTP_MSGSIZE_NOAUTH + 4 + NTP_DIGESTSIZE)
97914fd659Shenning 
98914fd659Shenning struct ntp_msg {
99914fd659Shenning 	u_int8_t status;	/* status of local clock and leap info */
100914fd659Shenning 	u_int8_t stratum;	/* Stratum level */
101914fd659Shenning 	u_int8_t ppoll;		/* poll value */
102914fd659Shenning 	int8_t precision;
103bd8c7023Shenning 	struct s_fixedpt rootdelay;
104914fd659Shenning 	struct s_fixedpt dispersion;
105914fd659Shenning 	u_int32_t refid;
106914fd659Shenning 	struct l_fixedpt reftime;
107914fd659Shenning 	struct l_fixedpt orgtime;
108914fd659Shenning 	struct l_fixedpt rectime;
109914fd659Shenning 	struct l_fixedpt xmttime;
110c0ee96ccShenning } __packed;
111914fd659Shenning 
1129096d664Shenning struct ntp_query {
1139096d664Shenning 	int			fd;
1149096d664Shenning 	struct ntp_msg		msg;
115692d048dSalexander 	double			xmttime;
1169096d664Shenning };
1179096d664Shenning 
118914fd659Shenning /*
119914fd659Shenning  *	Leap Second Codes (high order two bits)
120914fd659Shenning  */
121914fd659Shenning #define	LI_NOWARNING	(0 << 6)	/* no warning */
122914fd659Shenning #define	LI_PLUSSEC	(1 << 6)	/* add a second (61 seconds) */
123914fd659Shenning #define	LI_MINUSSEC	(2 << 6)	/* minus a second (59 seconds) */
124914fd659Shenning #define	LI_ALARM	(3 << 6)	/* alarm condition */
125914fd659Shenning 
126914fd659Shenning /*
127914fd659Shenning  *	Status Masks
128914fd659Shenning  */
129914fd659Shenning #define	MODEMASK	(7 << 0)
130914fd659Shenning #define	VERSIONMASK	(7 << 3)
1312713a698Salexander #define LIMASK		(3 << 6)
132914fd659Shenning 
133914fd659Shenning /*
134914fd659Shenning  *	Mode values
135914fd659Shenning  */
136914fd659Shenning #define	MODE_RES0	0	/* reserved */
137914fd659Shenning #define	MODE_SYM_ACT	1	/* symmetric active */
138914fd659Shenning #define	MODE_SYM_PAS	2	/* symmetric passive */
139914fd659Shenning #define	MODE_CLIENT	3	/* client */
140914fd659Shenning #define	MODE_SERVER	4	/* server */
141914fd659Shenning #define	MODE_BROADCAST	5	/* broadcast */
142914fd659Shenning #define	MODE_RES1	6	/* reserved for NTP control message */
143914fd659Shenning #define	MODE_RES2	7	/* reserved for private use */
144914fd659Shenning 
145914fd659Shenning #define	JAN_1970	2208988800UL	/* 1970 - 1900 in seconds */
146d96a2e9bSotto 
147d96a2e9bSotto /*
148d96a2e9bSotto  * The era we're in if we have no reason to assume otherwise.
149d96a2e9bSotto  * If lfp_to_d() sees an offset <= INT32_MAX the era is is assumed to be
150d96a2e9bSotto  * NTP_ERA + 1.
151d96a2e9bSotto  * Once the actual year is well into era 1, (after 2036) define NTP_ERA to 1
152d96a2e9bSotto  * and adapt (remove) the test in lfp_to_d().
153d96a2e9bSotto  * Once more than half of era 1 has elapsed (after 2104), re-inroduce the test
154d96a2e9bSotto  * to move to era 2 if offset <= INT32_MAX, repeat for each half era.
155d96a2e9bSotto  */
156d96a2e9bSotto #define NTP_ERA		0
157d96a2e9bSotto 
158d96a2e9bSotto #define SECS_IN_ERA	(UINT32_MAX + 1ULL)
1596a5eeebaShenning 
1609096d664Shenning #define	NTP_VERSION	4
161417a6d09Sdtucker #define	NTP_MAXSTRATUM	15
1629096d664Shenning 
1635fbf7173Salexander #endif	/* _NTP_H_ */
164