ntpq.h revision 290001
1/*
2 * ntpq.h - definitions of interest to ntpq
3 */
4#ifdef HAVE_UNISTD_H
5# include <unistd.h>
6#endif
7#include "ntp_fp.h"
8#include "ntp.h"
9#include "ntp_stdlib.h"
10#include "ntp_string.h"
11#include "ntp_malloc.h"
12#include "ntp_assert.h"
13#include "ntp_control.h"
14#include "lib_strbuf.h"
15
16/*
17 * Maximum number of arguments
18 */
19#define	MAXARGS	4
20
21/*
22 * Limit on packets in a single response.  Increasing this value to
23 * 96 will marginally speed "mrulist" operation on lossless networks
24 * but it has been observed to cause loss on WiFi networks and with
25 * an IPv6 go6.net tunnel over UDP.  That loss causes the request
26 * row limit to be cut in half, and it grows back very slowly to
27 * ensure forward progress is made and loss isn't triggered too quickly
28 * afterward.  While the lossless case gains only marginally with
29 * MAXFRAGS == 96, the lossy case is a lot slower due to the repeated
30 * timeouts.  Empirally, MAXFRAGS == 32 avoids most of the routine loss
31 * on both the WiFi and UDP v6 tunnel tests and seems a good compromise.
32 * This suggests some device in the path has a limit of 32 ~512 byte UDP
33 * packets in queue.
34 * Lowering MAXFRAGS may help with particularly lossy networks, but some
35 * ntpq commands may rely on the longtime value of 24 implicitly,
36 * assuming a single multipacket response will be large enough for any
37 * needs.  In contrast, the "mrulist" command is implemented as a series
38 * of requests and multipacket responses to each.
39 */
40#define	MAXFRAGS	32
41
42/*
43 * Error codes for internal use
44 */
45#define	ERR_UNSPEC		256
46#define	ERR_INCOMPLETE		257
47#define	ERR_TIMEOUT		258
48#define	ERR_TOOMUCH		259
49
50/*
51 * Flags for forming descriptors.
52 */
53#define	OPT		0x80	/* this argument is optional, or'd with type */
54
55#define	NO		0x0
56#define	NTP_STR		0x1	/* string argument */
57#define	NTP_UINT	0x2	/* unsigned integer */
58#define	NTP_INT		0x3	/* signed integer */
59#define	NTP_ADD		0x4	/* IP network address */
60#define IP_VERSION	0x5	/* IP version */
61#define	NTP_ADP		0x6	/* IP address and port */
62#define NTP_LFP		0x7	/* NTP timestamp */
63#define NTP_MODE	0x8	/* peer mode */
64#define NTP_2BIT	0x9	/* leap bits */
65
66/*
67 * Arguments are returned in a union
68 */
69typedef union {
70	const char *string;
71	long ival;
72	u_long uval;
73	sockaddr_u netnum;
74} arg_v;
75
76/*
77 * Structure for passing parsed command line
78 */
79struct parse {
80	const char *keyword;
81	arg_v argval[MAXARGS];
82	size_t nargs;
83};
84
85/*
86 * ntpdc includes a command parser which could charitably be called
87 * crude.  The following structure is used to define the command
88 * syntax.
89 */
90struct xcmd {
91  const char *keyword;		/* command key word */
92	void (*handler)	(struct parse *, FILE *);	/* command handler */
93	u_char arg[MAXARGS];	/* descriptors for arguments */
94  const char *desc[MAXARGS];	/* descriptions for arguments */
95  const char *comment;
96};
97
98/*
99 * Structure to hold association data
100 */
101struct association {
102	associd_t assid;
103	u_short status;
104};
105
106/*
107 * mrulist terminal status interval
108 */
109#define	MRU_REPORT_SECS	5
110
111/*
112 * var_format is used to override cooked formatting for selected vars.
113 */
114typedef struct var_format_tag {
115	const char *	varname;
116	u_short		fmt;
117} var_format;
118
119typedef struct chost_tag chost;
120struct chost_tag {
121	const char *name;
122	int 	    fam;
123};
124
125extern chost	chosts[];
126
127extern int	interactive;	/* are we prompting? */
128extern int	old_rv;		/* use old rv behavior? --old-rv */
129extern u_int	assoc_cache_slots;/* count of allocated array entries */
130extern u_int	numassoc;	/* number of cached associations */
131extern u_int	numhosts;
132
133extern	void	grow_assoc_cache(void);
134extern	void	asciize		(int, char *, FILE *);
135extern	int	getnetnum	(const char *, sockaddr_u *, char *, int);
136extern	void	sortassoc	(void);
137extern	void	show_error_msg	(int, associd_t);
138extern	int	dogetassoc	(FILE *);
139extern	int	doquery		(int, associd_t, int, int, const char *,
140				 u_short *, int *, const char **);
141extern	int	doqueryex	(int, associd_t, int, int, const char *,
142				 u_short *, int *, const char **, int);
143extern	const char * nntohost	(sockaddr_u *);
144extern	const char * nntohost_col (sockaddr_u *, size_t, int);
145extern	const char * nntohostp	(sockaddr_u *);
146extern	int	decodets	(char *, l_fp *);
147extern	int	decodeuint	(char *, u_long *);
148extern	int	nextvar		(int *, const char **, char **, char **);
149extern	int	decodetime	(char *, l_fp *);
150extern	void	printvars	(int, const char *, int, int, int, FILE *);
151extern	int	decodeint	(char *, long *);
152extern	void	makeascii	(int, const char *, FILE *);
153extern	const char * trunc_left	(const char *, size_t);
154extern	const char * trunc_right(const char *, size_t);
155