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