174462Salfred/*	$NetBSD: ntpq.h,v 1.10 2020/05/25 20:47:26 christos Exp $	*/
274462Salfred
3261046Smav/*
4261046Smav * ntpq.h - definitions of interest to ntpq
5261046Smav */
6261046Smav#ifdef HAVE_UNISTD_H
7261046Smav# include <unistd.h>
8261046Smav#endif
9261046Smav#include "ntp_fp.h"
10261046Smav#include "ntp.h"
11261046Smav#include "ntp_stdlib.h"
12261046Smav#include "ntp_string.h"
13261046Smav#include "ntp_malloc.h"
14261046Smav#include "ntp_assert.h"
15261046Smav#include "ntp_control.h"
16261046Smav#include "lib_strbuf.h"
1774462Salfred
18261046Smav#include "ntpq-opts.h"
19261046Smav
20261046Smav/*
21261046Smav * Maximum number of arguments
22261046Smav */
23261046Smav#define	MAXARGS	4
24261046Smav
25261046Smav/*
26261046Smav * Limit on packets in a single response.  Increasing this value to
27261046Smav * 96 will marginally speed "mrulist" operation on lossless networks
28261046Smav * but it has been observed to cause loss on WiFi networks and with
2974462Salfred * an IPv6 go6.net tunnel over UDP.  That loss causes the request
3074462Salfred * row limit to be cut in half, and it grows back very slowly to
3174462Salfred * ensure forward progress is made and loss isn't triggered too quickly
3274462Salfred * afterward.  While the lossless case gains only marginally with
3374462Salfred * MAXFRAGS == 96, the lossy case is a lot slower due to the repeated
3474462Salfred * timeouts.  Empirally, MAXFRAGS == 32 avoids most of the routine loss
3574462Salfred * on both the WiFi and UDP v6 tunnel tests and seems a good compromise.
3674462Salfred * This suggests some device in the path has a limit of 32 ~512 byte UDP
3774462Salfred * packets in queue.
3874462Salfred * Lowering MAXFRAGS may help with particularly lossy networks, but some
3974462Salfred * ntpq commands may rely on the longtime value of 24 implicitly,
40136581Sobrien * assuming a single multipacket response will be large enough for any
4174462Salfred * needs.  In contrast, the "mrulist" command is implemented as a series
4274462Salfred * of requests and multipacket responses to each.
4392990Sobrien */
4492990Sobrien#define	MAXFRAGS	32
4574462Salfred
4674462Salfred/*
4774462Salfred * Error codes for internal use
4874462Salfred */
4974462Salfred#define	ERR_UNSPEC		256
5074462Salfred#define	ERR_INCOMPLETE		257
5174462Salfred#define	ERR_TIMEOUT		258
5274462Salfred#define	ERR_TOOMUCH		259
5374462Salfred
5474462Salfred/*
5574462Salfred * Flags for forming descriptors.
5675094Siedowse */
5774462Salfred#define	OPT		0x80	/* this argument is optional, or'd with type */
5874462Salfred
5974462Salfred#define	NO		0x0
6074462Salfred#define	NTP_STR		0x1	/* string argument */
6174462Salfred#define	NTP_UINT	0x2	/* unsigned integer */
6274462Salfred#define	NTP_INT		0x3	/* signed integer */
6374462Salfred#define	NTP_ADD		0x4	/* IP network address */
6474462Salfred#define IP_VERSION	0x5	/* IP version */
6574462Salfred#define	NTP_ADP		0x6	/* IP address and port */
6674462Salfred#define NTP_LFP		0x7	/* NTP timestamp */
6774462Salfred#define NTP_MODE	0x8	/* peer mode */
6874462Salfred#define NTP_2BIT	0x9	/* leap bits */
6974462Salfred#define NTP_REFID	0xA	/* RefID */
7074462Salfred
7174462Salfred/*
7274462Salfred * Arguments are returned in a union
7374462Salfred */
7474462Salfredtypedef union {
7574462Salfred	const char *string;
76156090Sdeischen	long ival;
7774462Salfred	u_long uval;
7892941Sobrien	sockaddr_u netnum;
7992941Sobrien} arg_v;
8092905Sobrien
8192905Sobrien/*
8274462Salfred * Structure for passing parsed command line
8374462Salfred */
8474462Salfredstruct parse {
8574462Salfred	const char *keyword;
8674462Salfred	arg_v argval[MAXARGS];
8774462Salfred	size_t nargs;
8874462Salfred};
8974462Salfred
9074462Salfred/*
9174462Salfred * ntpdc includes a command parser which could charitably be called
9274462Salfred * crude.  The following structure is used to define the command
9374462Salfred * syntax.
9474462Salfred */
9574462Salfredstruct xcmd {
9674462Salfred  const char *keyword;		/* command key word */
9774462Salfred	void (*handler)	(struct parse *, FILE *);	/* command handler */
9874462Salfred	u_char arg[MAXARGS];	/* descriptors for arguments */
9974462Salfred  const char *desc[MAXARGS];	/* descriptions for arguments */
10074462Salfred  const char *comment;
10174462Salfred};
10274462Salfred
10374462Salfred/*
10474462Salfred * Structure to hold association data
10574462Salfred */
10674462Salfredstruct association {
10774462Salfred	associd_t assid;
10874462Salfred	u_short status;
10974462Salfred};
11074462Salfred
11174462Salfred/*
11274462Salfred * mrulist terminal status interval
11374462Salfred */
11474462Salfred#define	MRU_REPORT_SECS	5
11574462Salfred
11674462Salfred/*
11774462Salfred * var_format is used to override cooked formatting for selected vars.
11874462Salfred */
11974462Salfredtypedef struct var_format_tag {
12074462Salfred	const char *	varname;
12174462Salfred	u_short		fmt;
12274462Salfred} var_format;
12374462Salfred
12474462Salfredtypedef struct chost_tag chost;
12574462Salfredstruct chost_tag {
12674462Salfred	const char *name;
12774462Salfred	int 	    fam;
12874462Salfred};
12974462Salfred
13074462Salfredextern chost	chosts[];
13174462Salfred
13274462Salfredextern int	interactive;	/* are we prompting? */
13374462Salfredextern int	old_rv;		/* use old rv behavior? --old-rv */
13474462Salfredextern te_Refid	drefid;		/* How should we display a refid? */
13574462Salfredextern u_int	assoc_cache_slots;/* count of allocated array entries */
13674462Salfredextern u_int	numassoc;	/* number of cached associations */
13774462Salfredextern u_int	numhosts;
13874462Salfred
13974462Salfredextern	void	grow_assoc_cache(void);
14074462Salfredextern	void	asciize		(int, char *, FILE *);
14174462Salfredextern	int	getnetnum	(const char *, sockaddr_u *, char *, int);
14274462Salfredextern	void	sortassoc	(void);
14374462Salfredextern	void	show_error_msg	(int, associd_t);
14474462Salfredextern	int	dogetassoc	(FILE *);
14574462Salfredextern	int	doquery		(int, associd_t, int, size_t, const char *,
14674462Salfred				 u_short *, size_t *, const char **);
14774462Salfredextern	int	doqueryex	(int, associd_t, int, size_t, const char *,
14874462Salfred				 u_short *, size_t *, const char **, int);
14974462Salfredextern	const char * nntohost	(sockaddr_u *);
15074462Salfredextern	const char * nntohost_col (sockaddr_u *, size_t, int);
15174462Salfredextern	const char * nntohostp	(sockaddr_u *);
15274462Salfredextern	int	decodets	(char *, l_fp *);
15374462Salfredextern	int	decodeuint	(char *, u_long *);
15474462Salfredextern	int	nextvar		(size_t *, const char **, char **, char **);
15574462Salfredextern	int	decodetime	(char *, l_fp *);
15674462Salfredextern	void	printvars	(size_t, const char *, int, int, int, FILE *);
15774462Salfredextern	int	decodeint	(char *, long *);
15874462Salfredextern	void	makeascii	(size_t, const char *, FILE *);
15974462Salfredextern	const char * trunc_left	(const char *, size_t);
16074462Salfredextern	const char * trunc_right(const char *, size_t);
16174462Salfred
16274462Salfredtypedef	int/*BOOL*/ (*Ctrl_C_Handler)(void);
16374462Salfredextern	int/*BOOL*/ 	push_ctrl_c_handler(Ctrl_C_Handler);
16474462Salfredextern	int/*BOOL*/ 	pop_ctrl_c_handler(Ctrl_C_Handler);
16574462Salfred