1c0b746e5SOllivier Robert /* 2c0b746e5SOllivier Robert * ntp_request.h - definitions for the ntpd remote query facility 3c0b746e5SOllivier Robert */ 4c0b746e5SOllivier Robert 52b15cb3dSCy Schubert #ifndef NTP_REQUEST_H 62b15cb3dSCy Schubert #define NTP_REQUEST_H 79c2daa00SOllivier Robert 82b15cb3dSCy Schubert #include "stddef.h" 9c0b746e5SOllivier Robert #include "ntp_types.h" 102b15cb3dSCy Schubert #include "recvbuff.h" 11c0b746e5SOllivier Robert 12c0b746e5SOllivier Robert /* 13c0b746e5SOllivier Robert * A mode 7 packet is used exchanging data between an NTP server 14c0b746e5SOllivier Robert * and a client for purposes other than time synchronization, e.g. 15c0b746e5SOllivier Robert * monitoring, statistics gathering and configuration. A mode 7 16c0b746e5SOllivier Robert * packet has the following format: 17c0b746e5SOllivier Robert * 18c0b746e5SOllivier Robert * 0 1 2 3 19c0b746e5SOllivier Robert * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 20c0b746e5SOllivier Robert * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 21c0b746e5SOllivier Robert * |R|M| VN | Mode|A| Sequence | Implementation| Req Code | 22c0b746e5SOllivier Robert * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 23c0b746e5SOllivier Robert * | Err | Number of data items | MBZ | Size of data item | 24c0b746e5SOllivier Robert * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 25c0b746e5SOllivier Robert * | | 26c0b746e5SOllivier Robert * | Data (Minimum 0 octets, maximum 500 octets) | 27c0b746e5SOllivier Robert * | | 28c0b746e5SOllivier Robert * [...] 29c0b746e5SOllivier Robert * | | 30c0b746e5SOllivier Robert * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 31c0b746e5SOllivier Robert * | Encryption Keyid (when A bit set) | 32c0b746e5SOllivier Robert * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 33c0b746e5SOllivier Robert * | | 34c0b746e5SOllivier Robert * | Message Authentication Code (when A bit set) | 35c0b746e5SOllivier Robert * | | 36c0b746e5SOllivier Robert * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 37c0b746e5SOllivier Robert * 38c0b746e5SOllivier Robert * where the fields are (note that the client sends requests, the server 39c0b746e5SOllivier Robert * responses): 40c0b746e5SOllivier Robert * 41c0b746e5SOllivier Robert * Response Bit: This packet is a response (if clear, packet is a request). 42c0b746e5SOllivier Robert * 43c0b746e5SOllivier Robert * More Bit: Set for all packets but the last in a response which 44c0b746e5SOllivier Robert * requires more than one packet. 45c0b746e5SOllivier Robert * 46c0b746e5SOllivier Robert * Version Number: 2 for current version 47c0b746e5SOllivier Robert * 48c0b746e5SOllivier Robert * Mode: Always 7 49c0b746e5SOllivier Robert * 50c0b746e5SOllivier Robert * Authenticated bit: If set, this packet is authenticated. 51c0b746e5SOllivier Robert * 52c0b746e5SOllivier Robert * Sequence number: For a multipacket response, contains the sequence 53c0b746e5SOllivier Robert * number of this packet. 0 is the first in the sequence, 54c0b746e5SOllivier Robert * 127 (or less) is the last. The More Bit must be set in 55c0b746e5SOllivier Robert * all packets but the last. 56c0b746e5SOllivier Robert * 57c0b746e5SOllivier Robert * Implementation number: The number of the implementation this request code 58c0b746e5SOllivier Robert * is defined by. An implementation number of zero is used 59c0b746e5SOllivier Robert * for requst codes/data formats which all implementations 60c0b746e5SOllivier Robert * agree on. Implementation number 255 is reserved (for 61c0b746e5SOllivier Robert * extensions, in case we run out). 62c0b746e5SOllivier Robert * 63c0b746e5SOllivier Robert * Request code: An implementation-specific code which specifies the 64c0b746e5SOllivier Robert * operation to be (which has been) performed and/or the 65c0b746e5SOllivier Robert * format and semantics of the data included in the packet. 66c0b746e5SOllivier Robert * 67c0b746e5SOllivier Robert * Err: Must be 0 for a request. For a response, holds an error 68c0b746e5SOllivier Robert * code relating to the request. If nonzero, the operation 69c0b746e5SOllivier Robert * requested wasn't performed. 70c0b746e5SOllivier Robert * 71c0b746e5SOllivier Robert * 0 - no error 722b15cb3dSCy Schubert * 1 - incompatible implementation number 73c0b746e5SOllivier Robert * 2 - unimplemented request code 74c0b746e5SOllivier Robert * 3 - format error (wrong data items, data size, packet size etc.) 75c0b746e5SOllivier Robert * 4 - no data available (e.g. request for details on unknown peer) 76c0b746e5SOllivier Robert * 5-6 I don't know 77c0b746e5SOllivier Robert * 7 - authentication failure (i.e. permission denied) 78c0b746e5SOllivier Robert * 79c0b746e5SOllivier Robert * Number of data items: number of data items in packet. 0 to 500 80c0b746e5SOllivier Robert * 81c0b746e5SOllivier Robert * MBZ: A reserved data field, must be zero in requests and responses. 82c0b746e5SOllivier Robert * 83c0b746e5SOllivier Robert * Size of data item: size of each data item in packet. 0 to 500 84c0b746e5SOllivier Robert * 85c0b746e5SOllivier Robert * Data: Variable sized area containing request/response data. For 86c0b746e5SOllivier Robert * requests and responses the size in octets must be greater 87c0b746e5SOllivier Robert * than or equal to the product of the number of data items 88c0b746e5SOllivier Robert * and the size of a data item. For requests the data area 89c0b746e5SOllivier Robert * must be exactly 40 octets in length. For responses the 90c0b746e5SOllivier Robert * data area may be any length between 0 and 500 octets 91c0b746e5SOllivier Robert * inclusive. 92c0b746e5SOllivier Robert * 93c0b746e5SOllivier Robert * Message Authentication Code: Same as NTP spec, in definition and function. 94c0b746e5SOllivier Robert * May optionally be included in requests which require 95c0b746e5SOllivier Robert * authentication, is never included in responses. 96c0b746e5SOllivier Robert * 97c0b746e5SOllivier Robert * The version number, mode and keyid have the same function and are 98c0b746e5SOllivier Robert * in the same location as a standard NTP packet. The request packet 99c0b746e5SOllivier Robert * is the same size as a standard NTP packet to ease receive buffer 100c0b746e5SOllivier Robert * management, and to allow the same encryption procedure to be used 101c0b746e5SOllivier Robert * both on mode 7 and standard NTP packets. The mac is included when 102c0b746e5SOllivier Robert * it is required that a request be authenticated, the keyid should be 103c0b746e5SOllivier Robert * zero in requests in which the mac is not included. 104c0b746e5SOllivier Robert * 105c0b746e5SOllivier Robert * The data format depends on the implementation number/request code pair 106c0b746e5SOllivier Robert * and whether the packet is a request or a response. The only requirement 107c0b746e5SOllivier Robert * is that data items start in the octet immediately following the size 108c0b746e5SOllivier Robert * word and that data items be concatenated without padding between (i.e. 109c0b746e5SOllivier Robert * if the data area is larger than data_items*size, all padding is at 110c0b746e5SOllivier Robert * the end). Padding is ignored, other than for encryption purposes. 111c0b746e5SOllivier Robert * Implementations using encryption might want to include a time stamp 112c0b746e5SOllivier Robert * or other data in the request packet padding. The key used for requests 113c0b746e5SOllivier Robert * is implementation defined, but key 15 is suggested as a default. 114c0b746e5SOllivier Robert */ 115c0b746e5SOllivier Robert 116c0b746e5SOllivier Robert /* 117ea906c41SOllivier Robert * union of raw addresses to save space 118ea906c41SOllivier Robert */ 1192b15cb3dSCy Schubert union addrun { 120ea906c41SOllivier Robert struct in6_addr addr6; 121ea906c41SOllivier Robert struct in_addr addr; 122ea906c41SOllivier Robert }; 123ea906c41SOllivier Robert 1242b15cb3dSCy Schubert #define MODE7_PAYLOAD_LIM 176 1252b15cb3dSCy Schubert 1262b15cb3dSCy Schubert typedef union req_data_u_tag { 1272b15cb3dSCy Schubert u_int32 u32[MODE7_PAYLOAD_LIM / sizeof(u_int32)]; 1282b15cb3dSCy Schubert char data[MODE7_PAYLOAD_LIM]; /* data area (176 byte max) */ 1292b15cb3dSCy Schubert } req_data_u; /* struct conf_peer must fit */ 1302b15cb3dSCy Schubert 131ea906c41SOllivier Robert /* 132c0b746e5SOllivier Robert * A request packet. These are almost a fixed length. 133c0b746e5SOllivier Robert */ 134c0b746e5SOllivier Robert struct req_pkt { 135c0b746e5SOllivier Robert u_char rm_vn_mode; /* response, more, version, mode */ 136c0b746e5SOllivier Robert u_char auth_seq; /* key, sequence number */ 137c0b746e5SOllivier Robert u_char implementation; /* implementation number */ 138c0b746e5SOllivier Robert u_char request; /* request number */ 139c0b746e5SOllivier Robert u_short err_nitems; /* error code/number of data items */ 140c0b746e5SOllivier Robert u_short mbz_itemsize; /* item size */ 1412b15cb3dSCy Schubert req_data_u u; /* data area */ 142c0b746e5SOllivier Robert l_fp tstamp; /* time stamp, for authentication */ 1432b15cb3dSCy Schubert keyid_t keyid; /* (optional) encryption key */ 14409100258SXin LI char mac[MAX_MDG_LEN]; /* (optional) auth code */ 145c0b746e5SOllivier Robert }; 146c0b746e5SOllivier Robert 147c0b746e5SOllivier Robert /* 148ce265a54SOllivier Robert * The req_pkt_tail structure is used by ntpd to adjust for different 149ce265a54SOllivier Robert * packet sizes that may arrive. 150ce265a54SOllivier Robert */ 151ce265a54SOllivier Robert struct req_pkt_tail { 152ce265a54SOllivier Robert l_fp tstamp; /* time stamp, for authentication */ 1532b15cb3dSCy Schubert keyid_t keyid; /* (optional) encryption key */ 15409100258SXin LI char mac[MAX_MDG_LEN]; /* (optional) auth code */ 155ce265a54SOllivier Robert }; 156ce265a54SOllivier Robert 1572b15cb3dSCy Schubert /* MODE_PRIVATE request packet header length before optional items. */ 1582b15cb3dSCy Schubert #define REQ_LEN_HDR (offsetof(struct req_pkt, u)) 1592b15cb3dSCy Schubert /* MODE_PRIVATE request packet fixed length without MAC. */ 1602b15cb3dSCy Schubert #define REQ_LEN_NOMAC (offsetof(struct req_pkt, keyid)) 1612b15cb3dSCy Schubert /* MODE_PRIVATE req_pkt_tail minimum size (16 octet digest) */ 1622b15cb3dSCy Schubert #define REQ_TAIL_MIN \ 1632b15cb3dSCy Schubert (sizeof(struct req_pkt_tail) - (MAX_MAC_LEN - MAX_MD5_LEN)) 164c0b746e5SOllivier Robert 165c0b746e5SOllivier Robert /* 1662b15cb3dSCy Schubert * A MODE_PRIVATE response packet. The length here is variable, this 1672b15cb3dSCy Schubert * is a maximally sized one. Note that this implementation doesn't 168c0b746e5SOllivier Robert * authenticate responses. 169c0b746e5SOllivier Robert */ 1702b15cb3dSCy Schubert #define RESP_HEADER_SIZE (offsetof(struct resp_pkt, u)) 1712b15cb3dSCy Schubert #define RESP_DATA_SIZE 500 1722b15cb3dSCy Schubert 1732b15cb3dSCy Schubert typedef union resp_pkt_u_tag { 1742b15cb3dSCy Schubert char data[RESP_DATA_SIZE]; 1752b15cb3dSCy Schubert u_int32 u32[RESP_DATA_SIZE / sizeof(u_int32)]; 1762b15cb3dSCy Schubert } resp_pkt_u; 177c0b746e5SOllivier Robert 178c0b746e5SOllivier Robert struct resp_pkt { 179c0b746e5SOllivier Robert u_char rm_vn_mode; /* response, more, version, mode */ 180c0b746e5SOllivier Robert u_char auth_seq; /* key, sequence number */ 181c0b746e5SOllivier Robert u_char implementation; /* implementation number */ 182c0b746e5SOllivier Robert u_char request; /* request number */ 183c0b746e5SOllivier Robert u_short err_nitems; /* error code/number of data items */ 184c0b746e5SOllivier Robert u_short mbz_itemsize; /* item size */ 1852b15cb3dSCy Schubert resp_pkt_u u; /* data area */ 186c0b746e5SOllivier Robert }; 187c0b746e5SOllivier Robert 188c0b746e5SOllivier Robert 189c0b746e5SOllivier Robert /* 190c0b746e5SOllivier Robert * Information error codes 191c0b746e5SOllivier Robert */ 192c0b746e5SOllivier Robert #define INFO_OKAY 0 1932b15cb3dSCy Schubert #define INFO_ERR_IMPL 1 /* incompatible implementation */ 194c0b746e5SOllivier Robert #define INFO_ERR_REQ 2 /* unknown request code */ 195c0b746e5SOllivier Robert #define INFO_ERR_FMT 3 /* format error */ 196c0b746e5SOllivier Robert #define INFO_ERR_NODATA 4 /* no data for this request */ 197c0b746e5SOllivier Robert #define INFO_ERR_AUTH 7 /* authentication failure */ 1982b15cb3dSCy Schubert #define MAX_INFO_ERR INFO_ERR_AUTH 199c0b746e5SOllivier Robert 200c0b746e5SOllivier Robert /* 201c0b746e5SOllivier Robert * Maximum sequence number. 202c0b746e5SOllivier Robert */ 203c0b746e5SOllivier Robert #define MAXSEQ 127 204c0b746e5SOllivier Robert 205c0b746e5SOllivier Robert 206c0b746e5SOllivier Robert /* 207c0b746e5SOllivier Robert * Bit setting macros for multifield items. 208c0b746e5SOllivier Robert */ 209c0b746e5SOllivier Robert #define RESP_BIT 0x80 210c0b746e5SOllivier Robert #define MORE_BIT 0x40 211c0b746e5SOllivier Robert 212c0b746e5SOllivier Robert #define ISRESPONSE(rm_vn_mode) (((rm_vn_mode)&RESP_BIT)!=0) 213c0b746e5SOllivier Robert #define ISMORE(rm_vn_mode) (((rm_vn_mode)&MORE_BIT)!=0) 214c0b746e5SOllivier Robert #define INFO_VERSION(rm_vn_mode) ((u_char)(((rm_vn_mode)>>3)&0x7)) 215c0b746e5SOllivier Robert #define INFO_MODE(rm_vn_mode) ((rm_vn_mode)&0x7) 216c0b746e5SOllivier Robert 217c0b746e5SOllivier Robert #define RM_VN_MODE(resp, more, version) \ 218c0b746e5SOllivier Robert ((u_char)(((resp)?RESP_BIT:0)\ 219c0b746e5SOllivier Robert |((more)?MORE_BIT:0)\ 220c0b746e5SOllivier Robert |((version?version:(NTP_OLDVERSION+1))<<3)\ 221c0b746e5SOllivier Robert |(MODE_PRIVATE))) 222c0b746e5SOllivier Robert 223c0b746e5SOllivier Robert #define INFO_IS_AUTH(auth_seq) (((auth_seq) & 0x80) != 0) 224c0b746e5SOllivier Robert #define INFO_SEQ(auth_seq) ((auth_seq)&0x7f) 225c0b746e5SOllivier Robert #define AUTH_SEQ(auth, seq) ((u_char)((((auth)!=0)?0x80:0)|((seq)&0x7f))) 226c0b746e5SOllivier Robert 227c0b746e5SOllivier Robert #define INFO_ERR(err_nitems) ((u_short)((ntohs(err_nitems)>>12)&0xf)) 228c0b746e5SOllivier Robert #define INFO_NITEMS(err_nitems) ((u_short)(ntohs(err_nitems)&0xfff)) 229c0b746e5SOllivier Robert #define ERR_NITEMS(err, nitems) (htons((u_short)((((u_short)(err)<<12)&0xf000)\ 230c0b746e5SOllivier Robert |((u_short)(nitems)&0xfff)))) 231c0b746e5SOllivier Robert 232c0b746e5SOllivier Robert #define INFO_MBZ(mbz_itemsize) ((ntohs(mbz_itemsize)>>12)&0xf) 2339c2daa00SOllivier Robert #define INFO_ITEMSIZE(mbz_itemsize) ((u_short)(ntohs(mbz_itemsize)&0xfff)) 234c0b746e5SOllivier Robert #define MBZ_ITEMSIZE(itemsize) (htons((u_short)(itemsize))) 235c0b746e5SOllivier Robert 236c0b746e5SOllivier Robert 237c0b746e5SOllivier Robert /* 238c0b746e5SOllivier Robert * Implementation numbers. One for universal use and one for ntpd. 239c0b746e5SOllivier Robert */ 240c0b746e5SOllivier Robert #define IMPL_UNIV 0 2419c2daa00SOllivier Robert #define IMPL_XNTPD_OLD 2 /* Used by pre ipv6 ntpdc */ 2429c2daa00SOllivier Robert #define IMPL_XNTPD 3 /* Used by post ipv6 ntpdc */ 243c0b746e5SOllivier Robert 244c0b746e5SOllivier Robert /* 245c0b746e5SOllivier Robert * Some limits related to authentication. Frames which are 246c0b746e5SOllivier Robert * authenticated must include a time stamp which differs from 247c0b746e5SOllivier Robert * the receive time stamp by no more than 10 seconds. 248c0b746e5SOllivier Robert */ 249c0b746e5SOllivier Robert #define INFO_TS_MAXSKEW 10. 250c0b746e5SOllivier Robert 251c0b746e5SOllivier Robert /* 252c0b746e5SOllivier Robert * Universal request codes go here. There aren't any. 253c0b746e5SOllivier Robert */ 254c0b746e5SOllivier Robert 255c0b746e5SOllivier Robert /* 2562b15cb3dSCy Schubert * ntpdc -> ntpd request codes go here. 257c0b746e5SOllivier Robert */ 258c0b746e5SOllivier Robert #define REQ_PEER_LIST 0 /* return list of peers */ 259c0b746e5SOllivier Robert #define REQ_PEER_LIST_SUM 1 /* return summary info for all peers */ 260c0b746e5SOllivier Robert #define REQ_PEER_INFO 2 /* get standard information on peer */ 261c0b746e5SOllivier Robert #define REQ_PEER_STATS 3 /* get statistics for peer */ 262c0b746e5SOllivier Robert #define REQ_SYS_INFO 4 /* get system information */ 263c0b746e5SOllivier Robert #define REQ_SYS_STATS 5 /* get system stats */ 264c0b746e5SOllivier Robert #define REQ_IO_STATS 6 /* get I/O stats */ 265c0b746e5SOllivier Robert #define REQ_MEM_STATS 7 /* stats related to peer list maint */ 266c0b746e5SOllivier Robert #define REQ_LOOP_INFO 8 /* info from the loop filter */ 267c0b746e5SOllivier Robert #define REQ_TIMER_STATS 9 /* get timer stats */ 268c0b746e5SOllivier Robert #define REQ_CONFIG 10 /* configure a new peer */ 269c0b746e5SOllivier Robert #define REQ_UNCONFIG 11 /* unconfigure an existing peer */ 270c0b746e5SOllivier Robert #define REQ_SET_SYS_FLAG 12 /* set system flags */ 271c0b746e5SOllivier Robert #define REQ_CLR_SYS_FLAG 13 /* clear system flags */ 272c0b746e5SOllivier Robert #define REQ_MONITOR 14 /* (not used) */ 273c0b746e5SOllivier Robert #define REQ_NOMONITOR 15 /* (not used) */ 274c0b746e5SOllivier Robert #define REQ_GET_RESTRICT 16 /* return restrict list */ 275c0b746e5SOllivier Robert #define REQ_RESADDFLAGS 17 /* add flags to restrict list */ 276c0b746e5SOllivier Robert #define REQ_RESSUBFLAGS 18 /* remove flags from restrict list */ 277c0b746e5SOllivier Robert #define REQ_UNRESTRICT 19 /* remove entry from restrict list */ 278c0b746e5SOllivier Robert #define REQ_MON_GETLIST 20 /* return data collected by monitor */ 279c0b746e5SOllivier Robert #define REQ_RESET_STATS 21 /* reset stat counters */ 280c0b746e5SOllivier Robert #define REQ_RESET_PEER 22 /* reset peer stat counters */ 281c0b746e5SOllivier Robert #define REQ_REREAD_KEYS 23 /* reread the encryption key file */ 282c0b746e5SOllivier Robert #define REQ_DO_DIRTY_HACK 24 /* (not used) */ 283c0b746e5SOllivier Robert #define REQ_DONT_DIRTY_HACK 25 /* (not used) */ 284c0b746e5SOllivier Robert #define REQ_TRUSTKEY 26 /* add a trusted key */ 285c0b746e5SOllivier Robert #define REQ_UNTRUSTKEY 27 /* remove a trusted key */ 286c0b746e5SOllivier Robert #define REQ_AUTHINFO 28 /* return authentication info */ 287c0b746e5SOllivier Robert #define REQ_TRAPS 29 /* return currently set traps */ 288c0b746e5SOllivier Robert #define REQ_ADD_TRAP 30 /* add a trap */ 289c0b746e5SOllivier Robert #define REQ_CLR_TRAP 31 /* clear a trap */ 290c0b746e5SOllivier Robert #define REQ_REQUEST_KEY 32 /* define a new request keyid */ 291c0b746e5SOllivier Robert #define REQ_CONTROL_KEY 33 /* define a new control keyid */ 292c0b746e5SOllivier Robert #define REQ_GET_CTLSTATS 34 /* get stats from the control module */ 293c0b746e5SOllivier Robert #define REQ_GET_LEAPINFO 35 /* (not used) */ 294c0b746e5SOllivier Robert #define REQ_GET_CLOCKINFO 36 /* get clock information */ 295c0b746e5SOllivier Robert #define REQ_SET_CLKFUDGE 37 /* set clock fudge factors */ 296c0b746e5SOllivier Robert #define REQ_GET_KERNEL 38 /* get kernel pll/pps information */ 297c0b746e5SOllivier Robert #define REQ_GET_CLKBUGINFO 39 /* get clock debugging info */ 298c0b746e5SOllivier Robert #define REQ_SET_PRECISION 41 /* (not used) */ 299224ba2bdSOllivier Robert #define REQ_MON_GETLIST_1 42 /* return collected v1 monitor data */ 300224ba2bdSOllivier Robert #define REQ_HOSTNAME_ASSOCID 43 /* Here is a hostname + assoc_id */ 301ea906c41SOllivier Robert #define REQ_IF_STATS 44 /* get interface statistics */ 302ea906c41SOllivier Robert #define REQ_IF_RELOAD 45 /* reload interface list */ 303c0b746e5SOllivier Robert 3049c2daa00SOllivier Robert /* Determine size of pre-v6 version of structures */ 3059c2daa00SOllivier Robert #define v4sizeof(type) offsetof(type, v6_flag) 3069c2daa00SOllivier Robert 307c0b746e5SOllivier Robert /* 308c0b746e5SOllivier Robert * Flags in the peer information returns 309c0b746e5SOllivier Robert */ 310c0b746e5SOllivier Robert #define INFO_FLAG_CONFIG 0x1 311c0b746e5SOllivier Robert #define INFO_FLAG_SYSPEER 0x2 312c0b746e5SOllivier Robert #define INFO_FLAG_BURST 0x4 313c0b746e5SOllivier Robert #define INFO_FLAG_REFCLOCK 0x8 314c0b746e5SOllivier Robert #define INFO_FLAG_PREFER 0x10 315c0b746e5SOllivier Robert #define INFO_FLAG_AUTHENABLE 0x20 316c0b746e5SOllivier Robert #define INFO_FLAG_SEL_CANDIDATE 0x40 317c0b746e5SOllivier Robert #define INFO_FLAG_SHORTLIST 0x80 318ea906c41SOllivier Robert #define INFO_FLAG_IBURST 0x100 319c0b746e5SOllivier Robert 320c0b746e5SOllivier Robert /* 321c0b746e5SOllivier Robert * Flags in the system information returns 322c0b746e5SOllivier Robert */ 323c0b746e5SOllivier Robert #define INFO_FLAG_BCLIENT 0x1 324c0b746e5SOllivier Robert #define INFO_FLAG_AUTHENTICATE 0x2 325c0b746e5SOllivier Robert #define INFO_FLAG_NTP 0x4 326c0b746e5SOllivier Robert #define INFO_FLAG_KERNEL 0x8 327c0b746e5SOllivier Robert #define INFO_FLAG_MONITOR 0x40 328c0b746e5SOllivier Robert #define INFO_FLAG_FILEGEN 0x80 329ce265a54SOllivier Robert #define INFO_FLAG_CAL 0x10 330c0b746e5SOllivier Robert #define INFO_FLAG_PPS_SYNC 0x20 331c0b746e5SOllivier Robert 332c0b746e5SOllivier Robert /* 333c0b746e5SOllivier Robert * Peer list structure. Used to return raw lists of peers. It goes 334c0b746e5SOllivier Robert * without saying that everything returned is in network byte order. 335224ba2bdSOllivier Robert * Well, it *would* have gone without saying, but somebody said it. 336c0b746e5SOllivier Robert */ 337c0b746e5SOllivier Robert struct info_peer_list { 3389c2daa00SOllivier Robert u_int32 addr; /* address of peer */ 339c0b746e5SOllivier Robert u_short port; /* port number of peer */ 340c0b746e5SOllivier Robert u_char hmode; /* mode for this peer */ 341c0b746e5SOllivier Robert u_char flags; /* flags (from above) */ 3429c2daa00SOllivier Robert u_int v6_flag; /* is this v6 or not */ 3439c2daa00SOllivier Robert u_int unused1; /* (unused) padding for addr6 */ 3449c2daa00SOllivier Robert struct in6_addr addr6; /* v6 address of peer */ 345c0b746e5SOllivier Robert }; 346c0b746e5SOllivier Robert 347c0b746e5SOllivier Robert 348c0b746e5SOllivier Robert /* 349c0b746e5SOllivier Robert * Peer summary structure. Sort of the info that ntpdc returns by default. 350c0b746e5SOllivier Robert */ 351c0b746e5SOllivier Robert struct info_peer_summary { 352c0b746e5SOllivier Robert u_int32 dstadr; /* local address (zero for undetermined) */ 353c0b746e5SOllivier Robert u_int32 srcadr; /* source address */ 354c0b746e5SOllivier Robert u_short srcport; /* source port */ 355c0b746e5SOllivier Robert u_char stratum; /* stratum of peer */ 356c0b746e5SOllivier Robert s_char hpoll; /* host polling interval */ 357c0b746e5SOllivier Robert s_char ppoll; /* peer polling interval */ 358c0b746e5SOllivier Robert u_char reach; /* reachability register */ 359c0b746e5SOllivier Robert u_char flags; /* flags, from above */ 360c0b746e5SOllivier Robert u_char hmode; /* peer mode */ 361c0b746e5SOllivier Robert s_fp delay; /* peer.estdelay */ 362c0b746e5SOllivier Robert l_fp offset; /* peer.estoffset */ 363c0b746e5SOllivier Robert u_fp dispersion; /* peer.estdisp */ 3649c2daa00SOllivier Robert u_int v6_flag; /* is this v6 or not */ 3659c2daa00SOllivier Robert u_int unused1; /* (unused) padding for dstadr6 */ 3669c2daa00SOllivier Robert struct in6_addr dstadr6; /* local address (v6) */ 3679c2daa00SOllivier Robert struct in6_addr srcadr6; /* source address (v6) */ 368c0b746e5SOllivier Robert }; 369c0b746e5SOllivier Robert 370c0b746e5SOllivier Robert 371c0b746e5SOllivier Robert /* 372c0b746e5SOllivier Robert * Peer information structure. 373c0b746e5SOllivier Robert */ 374c0b746e5SOllivier Robert struct info_peer { 375c0b746e5SOllivier Robert u_int32 dstadr; /* local address */ 3769c2daa00SOllivier Robert u_int32 srcadr; /* source address */ 377c0b746e5SOllivier Robert u_short srcport; /* remote port */ 378c0b746e5SOllivier Robert u_char flags; /* peer flags */ 379c0b746e5SOllivier Robert u_char leap; /* peer.leap */ 380c0b746e5SOllivier Robert u_char hmode; /* peer.hmode */ 381c0b746e5SOllivier Robert u_char pmode; /* peer.pmode */ 382c0b746e5SOllivier Robert u_char stratum; /* peer.stratum */ 383c0b746e5SOllivier Robert u_char ppoll; /* peer.ppoll */ 384c0b746e5SOllivier Robert u_char hpoll; /* peer.hpoll */ 385c0b746e5SOllivier Robert s_char precision; /* peer.precision */ 386c0b746e5SOllivier Robert u_char version; /* peer.version */ 387224ba2bdSOllivier Robert u_char unused8; 388c0b746e5SOllivier Robert u_char reach; /* peer.reach */ 389c0b746e5SOllivier Robert u_char unreach; /* peer.unreach */ 390c0b746e5SOllivier Robert u_char flash; /* old peer.flash */ 391c0b746e5SOllivier Robert u_char ttl; /* peer.ttl */ 392c0b746e5SOllivier Robert u_short flash2; /* new peer.flash */ 393224ba2bdSOllivier Robert associd_t associd; /* association ID */ 394224ba2bdSOllivier Robert keyid_t keyid; /* peer.keyid */ 395c0b746e5SOllivier Robert u_int32 pkeyid; /* unused */ 396c0b746e5SOllivier Robert u_int32 refid; /* peer.refid */ 397c0b746e5SOllivier Robert u_int32 timer; /* peer.timer */ 3982b15cb3dSCy Schubert s_fp rootdelay; /* peer.delay */ 399c0b746e5SOllivier Robert u_fp rootdispersion; /* peer.dispersion */ 400c0b746e5SOllivier Robert l_fp reftime; /* peer.reftime */ 401c0b746e5SOllivier Robert l_fp org; /* peer.org */ 402c0b746e5SOllivier Robert l_fp rec; /* peer.rec */ 403c0b746e5SOllivier Robert l_fp xmt; /* peer.xmt */ 404c0b746e5SOllivier Robert s_fp filtdelay[NTP_SHIFT]; /* delay shift register */ 405c0b746e5SOllivier Robert l_fp filtoffset[NTP_SHIFT]; /* offset shift register */ 406c0b746e5SOllivier Robert u_char order[NTP_SHIFT]; /* order of peers from last filter */ 407c0b746e5SOllivier Robert s_fp delay; /* peer.estdelay */ 408c0b746e5SOllivier Robert u_fp dispersion; /* peer.estdisp */ 409c0b746e5SOllivier Robert l_fp offset; /* peer.estoffset */ 410c0b746e5SOllivier Robert u_fp selectdisp; /* peer select dispersion */ 411c0b746e5SOllivier Robert int32 unused1; /* (obsolete) */ 412c0b746e5SOllivier Robert int32 unused2; 413c0b746e5SOllivier Robert int32 unused3; 414c0b746e5SOllivier Robert int32 unused4; 415c0b746e5SOllivier Robert int32 unused5; 416c0b746e5SOllivier Robert int32 unused6; 417c0b746e5SOllivier Robert int32 unused7; 418c0b746e5SOllivier Robert s_fp estbdelay; /* broadcast offset */ 4199c2daa00SOllivier Robert u_int v6_flag; /* is this v6 or not */ 4209c2daa00SOllivier Robert u_int unused9; /* (unused) padding for dstadr6 */ 4219c2daa00SOllivier Robert struct in6_addr dstadr6; /* local address (v6-like) */ 4229c2daa00SOllivier Robert struct in6_addr srcadr6; /* sources address (v6-like) */ 423c0b746e5SOllivier Robert }; 424c0b746e5SOllivier Robert 425c0b746e5SOllivier Robert 426c0b746e5SOllivier Robert /* 427c0b746e5SOllivier Robert * Peer statistics structure 428c0b746e5SOllivier Robert */ 429c0b746e5SOllivier Robert struct info_peer_stats { 430c0b746e5SOllivier Robert u_int32 dstadr; /* local address */ 431c0b746e5SOllivier Robert u_int32 srcadr; /* remote address */ 432c0b746e5SOllivier Robert u_short srcport; /* remote port */ 433c0b746e5SOllivier Robert u_short flags; /* peer flags */ 434c0b746e5SOllivier Robert u_int32 timereset; /* time counters were reset */ 435c0b746e5SOllivier Robert u_int32 timereceived; /* time since a packet received */ 436c0b746e5SOllivier Robert u_int32 timetosend; /* time until a packet sent */ 437c0b746e5SOllivier Robert u_int32 timereachable; /* time peer has been reachable */ 438c0b746e5SOllivier Robert u_int32 sent; /* number sent */ 439c0b746e5SOllivier Robert u_int32 unused1; /* (unused) */ 440c0b746e5SOllivier Robert u_int32 processed; /* number processed */ 441c0b746e5SOllivier Robert u_int32 unused2; /* (unused) */ 442c0b746e5SOllivier Robert u_int32 badauth; /* bad authentication */ 443c0b746e5SOllivier Robert u_int32 bogusorg; /* bogus origin */ 444c0b746e5SOllivier Robert u_int32 oldpkt; /* duplicate */ 445c0b746e5SOllivier Robert u_int32 unused3; /* (unused) */ 446c0b746e5SOllivier Robert u_int32 unused4; /* (unused) */ 447c0b746e5SOllivier Robert u_int32 seldisp; /* bad dispersion */ 448c0b746e5SOllivier Robert u_int32 selbroken; /* bad reference time */ 449c0b746e5SOllivier Robert u_int32 unused5; /* (unused) */ 450c0b746e5SOllivier Robert u_char candidate; /* select order */ 451c0b746e5SOllivier Robert u_char unused6; /* (unused) */ 452c0b746e5SOllivier Robert u_char unused7; /* (unused) */ 453c0b746e5SOllivier Robert u_char unused8; /* (unused) */ 4549c2daa00SOllivier Robert u_int v6_flag; /* is this v6 or not */ 4559c2daa00SOllivier Robert u_int unused9; /* (unused) padding for dstadr6 */ 4569c2daa00SOllivier Robert struct in6_addr dstadr6; /* local address */ 4579c2daa00SOllivier Robert struct in6_addr srcadr6; /* remote address */ 458c0b746e5SOllivier Robert }; 459c0b746e5SOllivier Robert 460c0b746e5SOllivier Robert 461c0b746e5SOllivier Robert /* 462c0b746e5SOllivier Robert * Loop filter variables 463c0b746e5SOllivier Robert */ 464c0b746e5SOllivier Robert struct info_loop { 465c0b746e5SOllivier Robert l_fp last_offset; 466c0b746e5SOllivier Robert l_fp drift_comp; 467c0b746e5SOllivier Robert u_int32 compliance; 468c0b746e5SOllivier Robert u_int32 watchdog_timer; 469c0b746e5SOllivier Robert }; 470c0b746e5SOllivier Robert 471c0b746e5SOllivier Robert 472c0b746e5SOllivier Robert /* 473c0b746e5SOllivier Robert * System info. Mostly the sys.* variables, plus a few unique to 474c0b746e5SOllivier Robert * the implementation. 475c0b746e5SOllivier Robert */ 476c0b746e5SOllivier Robert struct info_sys { 4779c2daa00SOllivier Robert u_int32 peer; /* system peer address (v4) */ 478c0b746e5SOllivier Robert u_char peer_mode; /* mode we are syncing to peer in */ 479c0b746e5SOllivier Robert u_char leap; /* system leap bits */ 480c0b746e5SOllivier Robert u_char stratum; /* our stratum */ 481c0b746e5SOllivier Robert s_char precision; /* local clock precision */ 4822b15cb3dSCy Schubert s_fp rootdelay; /* delay from sync source */ 483c0b746e5SOllivier Robert u_fp rootdispersion; /* dispersion from sync source */ 484c0b746e5SOllivier Robert u_int32 refid; /* reference ID of sync source */ 485c0b746e5SOllivier Robert l_fp reftime; /* system reference time */ 486c0b746e5SOllivier Robert u_int32 poll; /* system poll interval */ 487c0b746e5SOllivier Robert u_char flags; /* system flags */ 488c0b746e5SOllivier Robert u_char unused1; /* unused */ 489c0b746e5SOllivier Robert u_char unused2; /* unused */ 490c0b746e5SOllivier Robert u_char unused3; /* unused */ 491c0b746e5SOllivier Robert s_fp bdelay; /* default broadcast offset */ 492c0b746e5SOllivier Robert s_fp frequency; /* frequency residual (scaled ppm) */ 493c0b746e5SOllivier Robert l_fp authdelay; /* default authentication delay */ 494c0b746e5SOllivier Robert u_fp stability; /* clock stability (scaled ppm) */ 4959c2daa00SOllivier Robert u_int v6_flag; /* is this v6 or not */ 4969c2daa00SOllivier Robert u_int unused4; /* unused, padding for peer6 */ 4979c2daa00SOllivier Robert struct in6_addr peer6; /* system peer address (v6) */ 498c0b746e5SOllivier Robert }; 499c0b746e5SOllivier Robert 500c0b746e5SOllivier Robert 501c0b746e5SOllivier Robert /* 502c0b746e5SOllivier Robert * System stats. These are collected in the protocol module 503c0b746e5SOllivier Robert */ 504c0b746e5SOllivier Robert struct info_sys_stats { 5059c2daa00SOllivier Robert u_int32 timeup; /* time since restart */ 5069c2daa00SOllivier Robert u_int32 timereset; /* time since reset */ 5079c2daa00SOllivier Robert u_int32 denied; /* access denied */ 5089c2daa00SOllivier Robert u_int32 oldversionpkt; /* recent version */ 5099c2daa00SOllivier Robert u_int32 newversionpkt; /* current version */ 5109c2daa00SOllivier Robert u_int32 unknownversion; /* bad version */ 5119c2daa00SOllivier Robert u_int32 badlength; /* bad length or format */ 512c0b746e5SOllivier Robert u_int32 processed; /* packets processed */ 5139c2daa00SOllivier Robert u_int32 badauth; /* bad authentication */ 5149c2daa00SOllivier Robert u_int32 received; /* packets received */ 5159c2daa00SOllivier Robert u_int32 limitrejected; /* rate exceeded */ 51609100258SXin LI u_int32 lamport; /* Lamport violations */ 51709100258SXin LI u_int32 tsrounding; /* Timestamp rounding errors */ 518c0b746e5SOllivier Robert }; 519c0b746e5SOllivier Robert 520c0b746e5SOllivier Robert 521c0b746e5SOllivier Robert /* 522c0b746e5SOllivier Robert * System stats - old version 523c0b746e5SOllivier Robert */ 524c0b746e5SOllivier Robert struct old_info_sys_stats { 5259c2daa00SOllivier Robert u_int32 timeup; /* time since restart */ 5269c2daa00SOllivier Robert u_int32 timereset; /* time since reset */ 5279c2daa00SOllivier Robert u_int32 denied; /* access denied */ 5289c2daa00SOllivier Robert u_int32 oldversionpkt; /* recent version */ 5299c2daa00SOllivier Robert u_int32 newversionpkt; /* current version */ 5309c2daa00SOllivier Robert u_int32 unknownversion; /* bad version */ 5319c2daa00SOllivier Robert u_int32 badlength; /* bad length or format */ 532c0b746e5SOllivier Robert u_int32 processed; /* packets processed */ 5339c2daa00SOllivier Robert u_int32 badauth; /* bad authentication */ 5349c2daa00SOllivier Robert u_int32 wanderhold; /* (not used) */ 535c0b746e5SOllivier Robert }; 536c0b746e5SOllivier Robert 537c0b746e5SOllivier Robert 538c0b746e5SOllivier Robert /* 539c0b746e5SOllivier Robert * Peer memory statistics. Collected in the peer module. 540c0b746e5SOllivier Robert */ 541c0b746e5SOllivier Robert struct info_mem_stats { 542c0b746e5SOllivier Robert u_int32 timereset; /* time since reset */ 543c0b746e5SOllivier Robert u_short totalpeermem; 544c0b746e5SOllivier Robert u_short freepeermem; 545c0b746e5SOllivier Robert u_int32 findpeer_calls; 546c0b746e5SOllivier Robert u_int32 allocations; 547c0b746e5SOllivier Robert u_int32 demobilizations; 548ea906c41SOllivier Robert u_char hashcount[NTP_HASH_SIZE]; 549c0b746e5SOllivier Robert }; 550c0b746e5SOllivier Robert 551c0b746e5SOllivier Robert 552c0b746e5SOllivier Robert /* 553c0b746e5SOllivier Robert * I/O statistics. Collected in the I/O module 554c0b746e5SOllivier Robert */ 555c0b746e5SOllivier Robert struct info_io_stats { 556c0b746e5SOllivier Robert u_int32 timereset; /* time since reset */ 557c0b746e5SOllivier Robert u_short totalrecvbufs; /* total receive bufs */ 558c0b746e5SOllivier Robert u_short freerecvbufs; /* free buffers */ 559c0b746e5SOllivier Robert u_short fullrecvbufs; /* full buffers */ 560c0b746e5SOllivier Robert u_short lowwater; /* number of times we've added buffers */ 561c0b746e5SOllivier Robert u_int32 dropped; /* dropped packets */ 562c0b746e5SOllivier Robert u_int32 ignored; /* ignored packets */ 563c0b746e5SOllivier Robert u_int32 received; /* received packets */ 564c0b746e5SOllivier Robert u_int32 sent; /* packets sent */ 565c0b746e5SOllivier Robert u_int32 notsent; /* packets not sent */ 566c0b746e5SOllivier Robert u_int32 interrupts; /* interrupts we've handled */ 567c0b746e5SOllivier Robert u_int32 int_received; /* received by interrupt handler */ 568c0b746e5SOllivier Robert }; 569c0b746e5SOllivier Robert 570c0b746e5SOllivier Robert 571c0b746e5SOllivier Robert /* 572c0b746e5SOllivier Robert * Timer stats. Guess where from. 573c0b746e5SOllivier Robert */ 574c0b746e5SOllivier Robert struct info_timer_stats { 575c0b746e5SOllivier Robert u_int32 timereset; /* time since reset */ 576c0b746e5SOllivier Robert u_int32 alarms; /* alarms we've handled */ 577c0b746e5SOllivier Robert u_int32 overflows; /* timer overflows */ 578c0b746e5SOllivier Robert u_int32 xmtcalls; /* calls to xmit */ 579c0b746e5SOllivier Robert }; 580c0b746e5SOllivier Robert 581c0b746e5SOllivier Robert 582c0b746e5SOllivier Robert /* 583c0b746e5SOllivier Robert * Structure for passing peer configuration information 584c0b746e5SOllivier Robert */ 585ce265a54SOllivier Robert struct old_conf_peer { 586ce265a54SOllivier Robert u_int32 peeraddr; /* address to poll */ 587ce265a54SOllivier Robert u_char hmode; /* mode, either broadcast, active or client */ 588ce265a54SOllivier Robert u_char version; /* version number to poll with */ 589ce265a54SOllivier Robert u_char minpoll; /* min host poll interval */ 590ce265a54SOllivier Robert u_char maxpoll; /* max host poll interval */ 591ce265a54SOllivier Robert u_char flags; /* flags for this request */ 592ce265a54SOllivier Robert u_char ttl; /* time to live (multicast) or refclock mode */ 593ce265a54SOllivier Robert u_short unused; /* unused */ 594ce265a54SOllivier Robert keyid_t keyid; /* key to use for this association */ 595ce265a54SOllivier Robert }; 596ce265a54SOllivier Robert 597c0b746e5SOllivier Robert struct conf_peer { 598c0b746e5SOllivier Robert u_int32 peeraddr; /* address to poll */ 599c0b746e5SOllivier Robert u_char hmode; /* mode, either broadcast, active or client */ 600c0b746e5SOllivier Robert u_char version; /* version number to poll with */ 601c0b746e5SOllivier Robert u_char minpoll; /* min host poll interval */ 602c0b746e5SOllivier Robert u_char maxpoll; /* max host poll interval */ 603c0b746e5SOllivier Robert u_char flags; /* flags for this request */ 604c0b746e5SOllivier Robert u_char ttl; /* time to live (multicast) or refclock mode */ 6059c2daa00SOllivier Robert u_short unused1; /* unused */ 606224ba2bdSOllivier Robert keyid_t keyid; /* key to use for this association */ 6072b15cb3dSCy Schubert char keystr[128]; /* public key file name */ 6089c2daa00SOllivier Robert u_int v6_flag; /* is this v6 or not */ 6099c2daa00SOllivier Robert u_int unused2; /* unused, padding for peeraddr6 */ 6109c2daa00SOllivier Robert struct in6_addr peeraddr6; /* ipv6 address to poll */ 611c0b746e5SOllivier Robert }; 612c0b746e5SOllivier Robert 613224ba2bdSOllivier Robert #define CONF_FLAG_AUTHENABLE 0x01 614224ba2bdSOllivier Robert #define CONF_FLAG_PREFER 0x02 615224ba2bdSOllivier Robert #define CONF_FLAG_BURST 0x04 616224ba2bdSOllivier Robert #define CONF_FLAG_IBURST 0x08 617224ba2bdSOllivier Robert #define CONF_FLAG_NOSELECT 0x10 618224ba2bdSOllivier Robert #define CONF_FLAG_SKEY 0x20 619c0b746e5SOllivier Robert 620c0b746e5SOllivier Robert /* 621c0b746e5SOllivier Robert * Structure for passing peer deletion information. Currently 622c0b746e5SOllivier Robert * we only pass the address and delete all configured peers with 623c0b746e5SOllivier Robert * this addess. 624c0b746e5SOllivier Robert */ 625c0b746e5SOllivier Robert struct conf_unpeer { 626c0b746e5SOllivier Robert u_int32 peeraddr; /* address of peer */ 6279c2daa00SOllivier Robert u_int v6_flag; /* is this v6 or not */ 6289c2daa00SOllivier Robert struct in6_addr peeraddr6; /* address of peer (v6) */ 629c0b746e5SOllivier Robert }; 630c0b746e5SOllivier Robert 631c0b746e5SOllivier Robert /* 632c0b746e5SOllivier Robert * Structure for carrying system flags. 633c0b746e5SOllivier Robert */ 634c0b746e5SOllivier Robert struct conf_sys_flags { 635c0b746e5SOllivier Robert u_int32 flags; 636c0b746e5SOllivier Robert }; 637c0b746e5SOllivier Robert 638c0b746e5SOllivier Robert /* 639c0b746e5SOllivier Robert * System flags we can set/clear 640c0b746e5SOllivier Robert */ 641ce265a54SOllivier Robert #define SYS_FLAG_BCLIENT 0x01 642ce265a54SOllivier Robert #define SYS_FLAG_PPS 0x02 643ce265a54SOllivier Robert #define SYS_FLAG_NTP 0x04 644ce265a54SOllivier Robert #define SYS_FLAG_KERNEL 0x08 645c0b746e5SOllivier Robert #define SYS_FLAG_MONITOR 0x10 646c0b746e5SOllivier Robert #define SYS_FLAG_FILEGEN 0x20 647ce265a54SOllivier Robert #define SYS_FLAG_AUTH 0x40 648ce265a54SOllivier Robert #define SYS_FLAG_CAL 0x80 649c0b746e5SOllivier Robert 650c0b746e5SOllivier Robert /* 651c0b746e5SOllivier Robert * Structure used for returning restrict entries 652c0b746e5SOllivier Robert */ 653c0b746e5SOllivier Robert struct info_restrict { 654c0b746e5SOllivier Robert u_int32 addr; /* match address */ 655c0b746e5SOllivier Robert u_int32 mask; /* match mask */ 656c0b746e5SOllivier Robert u_int32 count; /* number of packets matched */ 65709100258SXin LI u_short rflags; /* restrict flags */ 658c0b746e5SOllivier Robert u_short mflags; /* match flags */ 6599c2daa00SOllivier Robert u_int v6_flag; /* is this v6 or not */ 6609c2daa00SOllivier Robert u_int unused1; /* unused, padding for addr6 */ 6619c2daa00SOllivier Robert struct in6_addr addr6; /* match address (v6) */ 6629c2daa00SOllivier Robert struct in6_addr mask6; /* match mask (v6) */ 663c0b746e5SOllivier Robert }; 664c0b746e5SOllivier Robert 665c0b746e5SOllivier Robert 666c0b746e5SOllivier Robert /* 667c0b746e5SOllivier Robert * Structure used for specifying restrict entries 668c0b746e5SOllivier Robert */ 669c0b746e5SOllivier Robert struct conf_restrict { 670c0b746e5SOllivier Robert u_int32 addr; /* match address */ 671c0b746e5SOllivier Robert u_int32 mask; /* match mask */ 67209100258SXin LI short ippeerlimit; /* ip peer limit */ 673*2d4e511cSCy Schubert int srvfuzrft; /* server response fuzz reftime: poll */ 674*2d4e511cSCy Schubert u_short flags; /* restrict flags XXX: OLD size and name */ 675c0b746e5SOllivier Robert u_short mflags; /* match flags */ 676*2d4e511cSCy Schubert short unused1; /* (unused) padding for v6_flag */ 6779c2daa00SOllivier Robert u_int v6_flag; /* is this v6 or not */ 6789c2daa00SOllivier Robert struct in6_addr addr6; /* match address (v6) */ 6799c2daa00SOllivier Robert struct in6_addr mask6; /* match mask (v6) */ 680c0b746e5SOllivier Robert }; 681c0b746e5SOllivier Robert 682c0b746e5SOllivier Robert 683c0b746e5SOllivier Robert /* 684c0b746e5SOllivier Robert * Structure used for returning monitor data 685c0b746e5SOllivier Robert */ 686c0b746e5SOllivier Robert struct info_monitor_1 { 6872b15cb3dSCy Schubert u_int32 avg_int; /* avg s between packets from this host */ 6882b15cb3dSCy Schubert u_int32 last_int; /* s since we last received a packet */ 6892b15cb3dSCy Schubert u_int32 restr; /* restrict bits (was named lastdrop) */ 690c0b746e5SOllivier Robert u_int32 count; /* count of packets received */ 6919c2daa00SOllivier Robert u_int32 addr; /* host address V4 style */ 692c0b746e5SOllivier Robert u_int32 daddr; /* destination host address */ 693c0b746e5SOllivier Robert u_int32 flags; /* flags about destination */ 694c0b746e5SOllivier Robert u_short port; /* port number of last reception */ 695c0b746e5SOllivier Robert u_char mode; /* mode of last packet */ 696c0b746e5SOllivier Robert u_char version; /* version number of last packet */ 6979c2daa00SOllivier Robert u_int v6_flag; /* is this v6 or not */ 6989c2daa00SOllivier Robert u_int unused1; /* unused, padding for addr6 */ 6999c2daa00SOllivier Robert struct in6_addr addr6; /* host address V6 style */ 7009c2daa00SOllivier Robert struct in6_addr daddr6; /* host address V6 style */ 701c0b746e5SOllivier Robert }; 702c0b746e5SOllivier Robert 703c0b746e5SOllivier Robert 704c0b746e5SOllivier Robert /* 705c0b746e5SOllivier Robert * Structure used for returning monitor data 706c0b746e5SOllivier Robert */ 707c0b746e5SOllivier Robert struct info_monitor { 7082b15cb3dSCy Schubert u_int32 avg_int; /* avg s between packets from this host */ 7092b15cb3dSCy Schubert u_int32 last_int; /* s since we last received a packet */ 7102b15cb3dSCy Schubert u_int32 restr; /* restrict bits (was named lastdrop) */ 711c0b746e5SOllivier Robert u_int32 count; /* count of packets received */ 712c0b746e5SOllivier Robert u_int32 addr; /* host address */ 713c0b746e5SOllivier Robert u_short port; /* port number of last reception */ 714c0b746e5SOllivier Robert u_char mode; /* mode of last packet */ 715c0b746e5SOllivier Robert u_char version; /* version number of last packet */ 7169c2daa00SOllivier Robert u_int v6_flag; /* is this v6 or not */ 7179c2daa00SOllivier Robert u_int unused1; /* unused, padding for addr6 */ 7189c2daa00SOllivier Robert struct in6_addr addr6; /* host v6 address */ 719c0b746e5SOllivier Robert }; 720c0b746e5SOllivier Robert 721c0b746e5SOllivier Robert /* 7222b15cb3dSCy Schubert * Structure used for returning monitor data (old format) 723c0b746e5SOllivier Robert */ 724c0b746e5SOllivier Robert struct old_info_monitor { 725c0b746e5SOllivier Robert u_int32 lasttime; /* last packet from this host */ 726c0b746e5SOllivier Robert u_int32 firsttime; /* first time we received a packet */ 727c0b746e5SOllivier Robert u_int32 count; /* count of packets received */ 728c0b746e5SOllivier Robert u_int32 addr; /* host address */ 729c0b746e5SOllivier Robert u_short port; /* port number of last reception */ 730c0b746e5SOllivier Robert u_char mode; /* mode of last packet */ 731c0b746e5SOllivier Robert u_char version; /* version number of last packet */ 7329c2daa00SOllivier Robert u_int v6_flag; /* is this v6 or not */ 7339c2daa00SOllivier Robert struct in6_addr addr6; /* host address (v6)*/ 734c0b746e5SOllivier Robert }; 735c0b746e5SOllivier Robert 736c0b746e5SOllivier Robert /* 737c0b746e5SOllivier Robert * Structure used for passing indication of flags to clear 738c0b746e5SOllivier Robert */ 739c0b746e5SOllivier Robert struct reset_flags { 740c0b746e5SOllivier Robert u_int32 flags; 741c0b746e5SOllivier Robert }; 742c0b746e5SOllivier Robert 743c0b746e5SOllivier Robert #define RESET_FLAG_ALLPEERS 0x01 744c0b746e5SOllivier Robert #define RESET_FLAG_IO 0x02 745c0b746e5SOllivier Robert #define RESET_FLAG_SYS 0x04 746c0b746e5SOllivier Robert #define RESET_FLAG_MEM 0x08 747c0b746e5SOllivier Robert #define RESET_FLAG_TIMER 0x10 748c0b746e5SOllivier Robert #define RESET_FLAG_AUTH 0x20 749c0b746e5SOllivier Robert #define RESET_FLAG_CTL 0x40 750c0b746e5SOllivier Robert 7512b15cb3dSCy Schubert #define RESET_ALLFLAGS ( \ 7522b15cb3dSCy Schubert RESET_FLAG_ALLPEERS | \ 7532b15cb3dSCy Schubert RESET_FLAG_IO | \ 7542b15cb3dSCy Schubert RESET_FLAG_SYS | \ 7552b15cb3dSCy Schubert RESET_FLAG_MEM | \ 7562b15cb3dSCy Schubert RESET_FLAG_TIMER | \ 7572b15cb3dSCy Schubert RESET_FLAG_AUTH | \ 7582b15cb3dSCy Schubert RESET_FLAG_CTL \ 7592b15cb3dSCy Schubert ) 760c0b746e5SOllivier Robert 761c0b746e5SOllivier Robert /* 762c0b746e5SOllivier Robert * Structure used to return information concerning the authentication 763c0b746e5SOllivier Robert * module. 764c0b746e5SOllivier Robert */ 765c0b746e5SOllivier Robert struct info_auth { 766c0b746e5SOllivier Robert u_int32 timereset; /* time counters were reset */ 767c0b746e5SOllivier Robert u_int32 numkeys; /* number of keys we know */ 768c0b746e5SOllivier Robert u_int32 numfreekeys; /* number of free keys */ 769c0b746e5SOllivier Robert u_int32 keylookups; /* calls to authhavekey() */ 770c0b746e5SOllivier Robert u_int32 keynotfound; /* requested key unknown */ 771c0b746e5SOllivier Robert u_int32 encryptions; /* number of encryptions */ 772c0b746e5SOllivier Robert u_int32 decryptions; /* number of decryptions */ 773c0b746e5SOllivier Robert u_int32 expired; /* number of expired keys */ 774c0b746e5SOllivier Robert u_int32 keyuncached; /* calls to encrypt/decrypt with uncached key */ 775c0b746e5SOllivier Robert }; 776c0b746e5SOllivier Robert 777c0b746e5SOllivier Robert 778c0b746e5SOllivier Robert /* 779c0b746e5SOllivier Robert * Structure used to pass trap information to the client 780c0b746e5SOllivier Robert */ 781c0b746e5SOllivier Robert struct info_trap { 7829c2daa00SOllivier Robert u_int32 local_address; /* local interface addres (v4) */ 7839c2daa00SOllivier Robert u_int32 trap_address; /* remote client's addres (v4) */ 784c0b746e5SOllivier Robert u_short trap_port; /* remote port number */ 785c0b746e5SOllivier Robert u_short sequence; /* sequence number */ 786c0b746e5SOllivier Robert u_int32 settime; /* time trap last set */ 787c0b746e5SOllivier Robert u_int32 origtime; /* time trap originally set */ 788c0b746e5SOllivier Robert u_int32 resets; /* number of resets on this trap */ 789c0b746e5SOllivier Robert u_int32 flags; /* trap flags, as defined in ntp_control.h */ 7909c2daa00SOllivier Robert u_int v6_flag; /* is this v6 or not */ 7919c2daa00SOllivier Robert struct in6_addr local_address6; /* local interface address (v6) */ 7929c2daa00SOllivier Robert struct in6_addr trap_address6; /* remote client's address (v6) */ 793c0b746e5SOllivier Robert }; 794c0b746e5SOllivier Robert 795c0b746e5SOllivier Robert /* 796c0b746e5SOllivier Robert * Structure used to pass add/clear trap information to the client 797c0b746e5SOllivier Robert */ 798c0b746e5SOllivier Robert struct conf_trap { 7999c2daa00SOllivier Robert u_int32 local_address; /* remote client's address */ 8009c2daa00SOllivier Robert u_int32 trap_address; /* local interface address */ 801c0b746e5SOllivier Robert u_short trap_port; /* remote client's port */ 802c0b746e5SOllivier Robert u_short unused; /* (unused) */ 8039c2daa00SOllivier Robert u_int v6_flag; /* is this v6 or not */ 8049c2daa00SOllivier Robert struct in6_addr local_address6; /* local interface address (v6) */ 8059c2daa00SOllivier Robert struct in6_addr trap_address6; /* remote client's address (v6) */ 806c0b746e5SOllivier Robert }; 807c0b746e5SOllivier Robert 808c0b746e5SOllivier Robert 809c0b746e5SOllivier Robert /* 810c0b746e5SOllivier Robert * Structure used to return statistics from the control module 811c0b746e5SOllivier Robert */ 812c0b746e5SOllivier Robert struct info_control { 813c0b746e5SOllivier Robert u_int32 ctltimereset; 814c0b746e5SOllivier Robert u_int32 numctlreq; /* number of requests we've received */ 815c0b746e5SOllivier Robert u_int32 numctlbadpkts; /* number of bad control packets */ 816c0b746e5SOllivier Robert u_int32 numctlresponses; /* # resp packets sent */ 817c0b746e5SOllivier Robert u_int32 numctlfrags; /* # of fragments sent */ 818c0b746e5SOllivier Robert u_int32 numctlerrors; /* number of error responses sent */ 819c0b746e5SOllivier Robert u_int32 numctltooshort; /* number of too short input packets */ 820c0b746e5SOllivier Robert u_int32 numctlinputresp; /* number of responses on input */ 821c0b746e5SOllivier Robert u_int32 numctlinputfrag; /* number of fragments on input */ 822c0b746e5SOllivier Robert u_int32 numctlinputerr; /* # input pkts with err bit set */ 823c0b746e5SOllivier Robert u_int32 numctlbadoffset; /* # input pkts with nonzero offset */ 824c0b746e5SOllivier Robert u_int32 numctlbadversion; /* # input pkts with unknown version */ 825c0b746e5SOllivier Robert u_int32 numctldatatooshort; /* data too short for count */ 826c0b746e5SOllivier Robert u_int32 numctlbadop; /* bad op code found in packet */ 827c0b746e5SOllivier Robert u_int32 numasyncmsgs; /* # async messages we've sent */ 828c0b746e5SOllivier Robert }; 829c0b746e5SOllivier Robert 830c0b746e5SOllivier Robert 831c0b746e5SOllivier Robert /* 832c0b746e5SOllivier Robert * Structure used to return clock information 833c0b746e5SOllivier Robert */ 834c0b746e5SOllivier Robert struct info_clock { 835c0b746e5SOllivier Robert u_int32 clockadr; 836c0b746e5SOllivier Robert u_char type; 837c0b746e5SOllivier Robert u_char flags; 838c0b746e5SOllivier Robert u_char lastevent; 839c0b746e5SOllivier Robert u_char currentstatus; 840c0b746e5SOllivier Robert u_int32 polls; 841c0b746e5SOllivier Robert u_int32 noresponse; 842c0b746e5SOllivier Robert u_int32 badformat; 843c0b746e5SOllivier Robert u_int32 baddata; 844c0b746e5SOllivier Robert u_int32 timestarted; 845c0b746e5SOllivier Robert l_fp fudgetime1; 846c0b746e5SOllivier Robert l_fp fudgetime2; 847c0b746e5SOllivier Robert int32 fudgeval1; 8482b15cb3dSCy Schubert u_int32 fudgeval2; 849c0b746e5SOllivier Robert }; 850c0b746e5SOllivier Robert 851c0b746e5SOllivier Robert 852c0b746e5SOllivier Robert /* 853c0b746e5SOllivier Robert * Structure used for setting clock fudge factors 854c0b746e5SOllivier Robert */ 855c0b746e5SOllivier Robert struct conf_fudge { 856c0b746e5SOllivier Robert u_int32 clockadr; 857c0b746e5SOllivier Robert u_int32 which; 858c0b746e5SOllivier Robert l_fp fudgetime; 8592b15cb3dSCy Schubert u_int32 fudgeval_flags; 860c0b746e5SOllivier Robert }; 861c0b746e5SOllivier Robert 862c0b746e5SOllivier Robert #define FUDGE_TIME1 1 863c0b746e5SOllivier Robert #define FUDGE_TIME2 2 864c0b746e5SOllivier Robert #define FUDGE_VAL1 3 865c0b746e5SOllivier Robert #define FUDGE_VAL2 4 866c0b746e5SOllivier Robert #define FUDGE_FLAGS 5 867c0b746e5SOllivier Robert 868c0b746e5SOllivier Robert 869c0b746e5SOllivier Robert /* 870c0b746e5SOllivier Robert * Structure used for returning clock debugging info 871c0b746e5SOllivier Robert */ 872c0b746e5SOllivier Robert #define NUMCBUGVALUES 16 873c0b746e5SOllivier Robert #define NUMCBUGTIMES 32 874c0b746e5SOllivier Robert 875c0b746e5SOllivier Robert struct info_clkbug { 876c0b746e5SOllivier Robert u_int32 clockadr; 877c0b746e5SOllivier Robert u_char nvalues; 878c0b746e5SOllivier Robert u_char ntimes; 879c0b746e5SOllivier Robert u_short svalues; 880c0b746e5SOllivier Robert u_int32 stimes; 881c0b746e5SOllivier Robert u_int32 values[NUMCBUGVALUES]; 882c0b746e5SOllivier Robert l_fp times[NUMCBUGTIMES]; 883c0b746e5SOllivier Robert }; 884c0b746e5SOllivier Robert 885c0b746e5SOllivier Robert /* 886c0b746e5SOllivier Robert * Structure used for returning kernel pll/PPS information 887c0b746e5SOllivier Robert */ 888c0b746e5SOllivier Robert struct info_kernel { 889c0b746e5SOllivier Robert int32 offset; 890c0b746e5SOllivier Robert int32 freq; 891c0b746e5SOllivier Robert int32 maxerror; 892c0b746e5SOllivier Robert int32 esterror; 893c0b746e5SOllivier Robert u_short status; 894c0b746e5SOllivier Robert u_short shift; 895c0b746e5SOllivier Robert int32 constant; 896c0b746e5SOllivier Robert int32 precision; 897c0b746e5SOllivier Robert int32 tolerance; 898c0b746e5SOllivier Robert 899c0b746e5SOllivier Robert /* 900c0b746e5SOllivier Robert * Variables used only if PPS signal discipline is implemented 901c0b746e5SOllivier Robert */ 902c0b746e5SOllivier Robert int32 ppsfreq; 903c0b746e5SOllivier Robert int32 jitter; 904c0b746e5SOllivier Robert int32 stabil; 905c0b746e5SOllivier Robert int32 jitcnt; 906c0b746e5SOllivier Robert int32 calcnt; 907c0b746e5SOllivier Robert int32 errcnt; 908c0b746e5SOllivier Robert int32 stbcnt; 909c0b746e5SOllivier Robert }; 910224ba2bdSOllivier Robert 911224ba2bdSOllivier Robert /* 912ea906c41SOllivier Robert * interface statistics 913ea906c41SOllivier Robert */ 914ea906c41SOllivier Robert struct info_if_stats { 915ea906c41SOllivier Robert union addrun unaddr; /* address */ 916ea906c41SOllivier Robert union addrun unbcast; /* broadcast */ 917ea906c41SOllivier Robert union addrun unmask; /* mask */ 918ea906c41SOllivier Robert u_int32 v6_flag; /* is this v6 */ 919ea906c41SOllivier Robert char name[32]; /* name of interface */ 920ea906c41SOllivier Robert int32 flags; /* interface flags */ 921ea906c41SOllivier Robert int32 last_ttl; /* last TTL specified */ 922ea906c41SOllivier Robert int32 num_mcast; /* No. of IP addresses in multicast socket */ 923ea906c41SOllivier Robert int32 received; /* number of incoming packets */ 924ea906c41SOllivier Robert int32 sent; /* number of outgoing packets */ 925ea906c41SOllivier Robert int32 notsent; /* number of send failures */ 926ea906c41SOllivier Robert int32 uptime; /* number of seconds this interface was active */ 927ea906c41SOllivier Robert u_int32 scopeid; /* Scope used for Multicasting */ 928ea906c41SOllivier Robert u_int32 ifindex; /* interface index - from system */ 929ea906c41SOllivier Robert u_int32 ifnum; /* sequential interface number */ 930ea906c41SOllivier Robert u_int32 peercnt; /* number of peers referencinf this interface - informational only */ 931ea906c41SOllivier Robert u_short family; /* Address family */ 932ea906c41SOllivier Robert u_char ignore_packets; /* Specify whether the packet should be ignored */ 933ea906c41SOllivier Robert u_char action; /* reason the item is listed */ 934ea906c41SOllivier Robert int32 _filler0; /* pad to a 64 bit size boundary */ 935ea906c41SOllivier Robert }; 936ea906c41SOllivier Robert 937ea906c41SOllivier Robert #define IFS_EXISTS 1 /* just exists */ 938ea906c41SOllivier Robert #define IFS_CREATED 2 /* was just created */ 939ea906c41SOllivier Robert #define IFS_DELETED 3 /* was just delete */ 940ea906c41SOllivier Robert 941ea906c41SOllivier Robert /* 942224ba2bdSOllivier Robert * Info returned with IP -> hostname lookup 943224ba2bdSOllivier Robert */ 944224ba2bdSOllivier Robert /* 144 might need to become 32, matching data[] member of req_pkt */ 945224ba2bdSOllivier Robert #define NTP_MAXHOSTNAME (32 - sizeof(u_int32) - sizeof(u_short)) 946224ba2bdSOllivier Robert struct info_dns_assoc { 947224ba2bdSOllivier Robert u_int32 peeraddr; /* peer address (HMS: being careful...) */ 948224ba2bdSOllivier Robert associd_t associd; /* association ID */ 949224ba2bdSOllivier Robert char hostname[NTP_MAXHOSTNAME]; /* hostname */ 950224ba2bdSOllivier Robert }; 9512b15cb3dSCy Schubert 9522b15cb3dSCy Schubert /* 9532b15cb3dSCy Schubert * function declarations 9542b15cb3dSCy Schubert */ 9552b15cb3dSCy Schubert int get_packet_mode(struct recvbuf *rbufp); /* Return packet mode */ 9562b15cb3dSCy Schubert 9579c2daa00SOllivier Robert #endif /* NTP_REQUEST_H */ 958