xref: /NextBSD/contrib/ntp/include/ntp_types.h (revision 84d351007654069f9643c8e4b4802a7f5f08ee42)
1 /*
2  *  ntp_types.h - defines how int32 and u_int32 are treated.
3  *
4  * New style: Make sure C99 fixed width integer types are available:
5  * intN_t and uintN_t
6 
7  * Old style: defines how int32 and u_int32 are treated.
8  *  For 64 bit systems like the DEC Alpha, they have to be defined
9  *  as int and u_int.
10  *  For 32 bit systems, define them as long and u_long
11  */
12 #ifndef NTP_TYPES_H
13 #define NTP_TYPES_H
14 
15 #include <sys/types.h>
16 #if defined(HAVE_INTTYPES_H)
17 # include <inttypes.h>
18 #endif
19 #if defined(HAVE_STDINT_H)
20 # include <stdint.h>
21 #endif
22 
23 /* Bug 2813 */
24 #ifdef HAVE_LIMITS_H
25 # include <limits.h>
26 #endif
27 
28 #include "ntp_machine.h"
29 
30 
31 #ifndef TRUE
32 # define	TRUE	1
33 #endif
34 #ifndef FALSE
35 # define	FALSE	0
36 #endif
37 
38 /*
39  * This is another naming conflict.
40  * On NetBSD for MAC the macro "mac" is defined as 1
41  * this is fun for us as a packet structure contains an
42  * optional "mac" member - severe confusion results 8-)
43  * As we hopefully do not have to rely on that macro we
44  * just undefine that.
45  */
46 #ifdef mac
47 #undef mac
48 #endif
49 
50 /*
51  * used to quiet compiler warnings
52  */
53 #ifndef UNUSED_ARG
54 #define UNUSED_ARG(arg)		((void)(arg))
55 #endif
56 #ifndef UNUSED_LOCAL
57 #define UNUSED_LOCAL(arg)	((void)(arg))
58 #endif
59 
60 /*
61  * COUNTOF(array) - size of array in elements
62  */
63 #define COUNTOF(arr)	(sizeof(arr) / sizeof((arr)[0]))
64 
65 /*
66  * VMS DECC (v4.1), {u_char,u_short,u_long} are only in SOCKET.H,
67  *			and u_int isn't defined anywhere
68  */
69 #if defined(VMS)
70 #include <socket.h>
71 typedef unsigned int u_int;
72 #endif /* VMS */
73 
74 #ifdef HAVE_UINT32_T
75 # ifndef HAVE_INT32
76    typedef	int32_t		int32;
77 # endif
78 # ifndef HAVE_U_INT32
79    typedef	uint32_t	u_int32;
80 #  if defined(UINT32_MAX) && !defined(U_INT32_MAX)
81 #   define U_INT32_MAX UINT32_MAX
82 #  endif
83 # endif
84 #elif (SIZEOF_INT == 4)
85 # if !defined(HAVE_INT32) && !defined(int32)
86    typedef	int		int32;
87 #  ifndef INT32_MIN
88 #   define INT32_MIN INT_MIN
89 #  endif
90 #  ifndef INT32_MAX
91 #   define INT32_MAX INT_MAX
92 #  endif
93 # endif
94 # if !defined(HAVE_U_INT32) && !defined(u_int32)
95    typedef	unsigned	u_int32;
96 #  if defined(UINT_MAX) && !defined(U_INT32_MAX)
97 #   define U_INT32_MAX UINT_MAX
98 #  endif
99 # endif
100 #else	/* SIZEOF_INT != 4 */
101 # if (SIZEOF_LONG == 4)
102 # if !defined(HAVE_INT32) && !defined(int32)
103     typedef	long		int32;
104 #   ifndef INT32_MIN
105 #    define INT32_MIN LONG_MIN
106 #   endif
107 #   ifndef INT32_MAX
108 #    define INT32_MAX LONG_MAX
109 #   endif
110 #  endif
111 # if !defined(HAVE_U_INT32) && !defined(u_int32)
112     typedef	unsigned long	u_int32;
113 #   if defined(ULONG_MAX) && !defined(U_INT32_MAX)
114 #    define U_INT32_MAX ULONG_MAX
115 #   endif
116 #  endif
117 # else	/* SIZEOF_LONG != 4 */
118 #  include "Bletch: what's 32 bits on this machine?"
119 # endif
120 #endif	/* !HAVE_UINT32_T && SIZEOF_INT != 4 */
121 
122 #ifndef U_INT32_MAX
123 # define U_INT32_MAX	0xffffffff
124 #endif
125 
126 
127 /*
128  * Ugly dance to find out if we have 64bit integer type.
129  */
130 #if !defined(HAVE_INT64)
131 
132 /* assume best for now, fix if frustrated later. */
133 # define HAVE_INT64
134 # define HAVE_U_INT64
135 
136 /* now check the cascade. Feel free to add things. */
137 # ifdef INT64_MAX
138 
139 typedef int64_t int64;
140 typedef uint64_t u_int64;
141 
142 # elif SIZEOF_LONG == 8
143 
144 typedef long int64;
145 typedef unsigned long u_int64;
146 
147 # elif SIZEOF_LONG_LONG == 8
148 
149 typedef long long int64;
150 typedef unsigned long long u_int64;
151 
152 # else
153 
154 /* no 64bit scalar, give it up. */
155 #  undef HAVE_INT64
156 #  undef HAVE_U_INT64
157 
158 # endif
159 
160 #endif
161 
162 /*
163  * and here the trouble starts: We need a representation with more than
164  * 64 bits. If a scalar of that size is not available, we need a struct
165  * that holds the value in split representation.
166  *
167  * To ease the usage a bit, we alwys use a union that is in processor
168  * byte order and might or might not contain a 64bit scalar.
169  */
170 
171 #if SIZEOF_SHORT != 2
172 # error short is not 2 bytes -- what is 16 bit integer on this target?
173 #endif
174 
175 typedef union {
176 #   ifdef WORDS_BIGENDIAN
177 	struct {
178 		int16_t	hh; uint16_t hl; uint16_t lh; uint16_t ll;
179 	} w_s;
180 	struct {
181 		uint16_t hh; uint16_t hl; uint16_t lh; uint16_t ll;
182 	} W_s;
183 	struct {
184 		  int32 hi; u_int32 lo;
185 	} d_s;
186 	struct {
187 		u_int32	hi; u_int32 lo;
188 	} D_s;
189 #   else
190 	struct {
191 		uint16_t ll; uint16_t lh; uint16_t hl;   int16_t hh;
192 	} w_s;
193 	struct {
194 		uint16_t ll; uint16_t lh; uint16_t hl; uint16_t hh;
195 	} W_s;
196 	struct {
197 		u_int32 lo;   int32 hi;
198 	} d_s;
199 	struct {
200 		u_int32 lo; u_int32 hi;
201 	} D_s;
202 #   endif
203 
204 #   ifdef HAVE_INT64
205 	int64	q_s;	/*   signed quad scalar */
206 	u_int64 Q_s;	/* unsigned quad scalar */
207 #   endif
208 } vint64; /* variant int 64 */
209 
210 
211 typedef uint8_t		ntp_u_int8_t;
212 typedef uint16_t	ntp_u_int16_t;
213 typedef uint32_t	ntp_u_int32_t;
214 
215 typedef struct ntp_uint64_t { u_int32 val[2]; } ntp_uint64_t;
216 
217 typedef uint16_t	associd_t; /* association ID */
218 #define ASSOCID_MAX	USHRT_MAX
219 typedef u_int32 keyid_t;	/* cryptographic key ID */
220 #define KEYID_T_MAX	(0xffffffff)
221 typedef u_int32 tstamp_t;	/* NTP seconds timestamp */
222 
223 /*
224  * Cloning malloc()'s behavior of always returning pointers suitably
225  * aligned for the strictest alignment requirement of any type is not
226  * easy to do portably, as the maximum alignment required is not
227  * exposed.  Use the size of a union of the types known to represent the
228  * strictest alignment on some platform.
229  */
230 typedef union max_alignment_tag {
231 	double		d;
232 } max_alignment;
233 
234 #define MAXALIGN		sizeof(max_alignment)
235 #define ALIGN_UNITS(sz)		(((sz) + MAXALIGN - 1) / MAXALIGN)
236 #define ALIGNED_SIZE(sz)	(MAXALIGN * ALIGN_UNITS(sz))
237 #define INC_ALIGNED_PTR(b, m)	((void *)aligned_ptr((void *)(b), m))
238 
239 static inline
240 max_alignment *
aligned_ptr(max_alignment * base,size_t minsize)241 aligned_ptr(
242 	max_alignment *	base,
243 	size_t		minsize
244 	)
245 {
246 	return base + ALIGN_UNITS((minsize < 1) ? 1 : minsize);
247 }
248 
249 /*
250  * Macro to use in otherwise-empty source files to comply with ANSI C
251  * requirement that each translation unit (source file) contain some
252  * declaration.  This has commonly been done by declaring an unused
253  * global variable of type int or char.  An extern reference to exit()
254  * serves the same purpose without bloat.
255  */
256 #define	NONEMPTY_TRANSLATION_UNIT	extern void exit(int);
257 
258 /*
259  * On Unix struct sock_timeval is equivalent to struct timeval.
260  * On Windows built with 64-bit time_t, sock_timeval.tv_sec is a long
261  * as required by Windows' socket() interface timeout argument, while
262  * timeval.tv_sec is time_t for the more common use as a UTC time
263  * within NTP.
264  */
265 #ifndef SYS_WINNT
266 #define	sock_timeval	timeval
267 #endif
268 
269 /*
270  * On Unix open() works for tty (serial) devices just fine, while on
271  * Windows refclock serial devices are opened using CreateFile, a lower
272  * level than the CRT-provided descriptors, because the C runtime lacks
273  * tty APIs.  For refclocks which wish to use open() as well as or
274  * instead of refclock_open(), tty_open() is equivalent to open() on
275  * Unix and  implemented in the Windows port similarly to
276  * refclock_open().
277  * Similarly, the termios emulation in the Windows code needs to know
278  * about serial ports being closed, while the Posix systems do not.
279  */
280 #ifndef SYS_WINNT
281 # define tty_open(f, a, m)	open(f, a, m)
282 # define closeserial(fd)	close(fd)
283 # define closesocket(fd)	close(fd)
284 typedef int SOCKET;
285 # define INVALID_SOCKET		(-1)
286 # define SOCKET_ERROR		(-1)
287 # define socket_errno()		(errno)
288 #else	/* SYS_WINNT follows */
289 # define socket_errno()		(errno = WSAGetLastError())
290 #endif
291 
292 
293 
294 #endif	/* NTP_TYPES_H */
295