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