1c0b746e5SOllivier Robert /* 2c0b746e5SOllivier Robert * ntp_request.h - definitions for the ntpd remote query facility 3c0b746e5SOllivier Robert */ 4c0b746e5SOllivier Robert 59c2daa00SOllivier Robert #ifndef NTP_REQUEST_H 69c2daa00SOllivier Robert #define NTP_REQUEST_H 79c2daa00SOllivier Robert 8c0b746e5SOllivier Robert #include "stddef.h" 9c0b746e5SOllivier Robert #include "ntp_types.h" 10c0b746e5SOllivier Robert #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 72c0b746e5SOllivier Robert * 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 /* 117c0b746e5SOllivier Robert * union of raw addresses to save space 118c0b746e5SOllivier Robert */ 119c0b746e5SOllivier Robert union addrun { 120c0b746e5SOllivier Robert struct in6_addr addr6; 121c0b746e5SOllivier Robert struct in_addr addr; 122c0b746e5SOllivier Robert }; 123c0b746e5SOllivier Robert 1249c2daa00SOllivier Robert #define MODE7_PAYLOAD_LIM 176 1259c2daa00SOllivier Robert 126c0b746e5SOllivier Robert typedef union req_data_u_tag { 127224ba2bdSOllivier Robert u_int32 u32[MODE7_PAYLOAD_LIM / sizeof(u_int32)]; 128c0b746e5SOllivier Robert char data[MODE7_PAYLOAD_LIM]; /* data area (176 byte max) */ 129c0b746e5SOllivier Robert } req_data_u; /* struct conf_peer must fit */ 130c0b746e5SOllivier Robert 131c0b746e5SOllivier Robert /* 132ce265a54SOllivier Robert * A request packet. These are almost a fixed length. 133ce265a54SOllivier Robert */ 134ce265a54SOllivier Robert struct req_pkt { 135ce265a54SOllivier Robert u_char rm_vn_mode; /* response, more, version, mode */ 136ce265a54SOllivier Robert u_char auth_seq; /* key, sequence number */ 137ce265a54SOllivier Robert u_char implementation; /* implementation number */ 138ce265a54SOllivier Robert u_char request; /* request number */ 139ce265a54SOllivier Robert u_short err_nitems; /* error code/number of data items */ 140ce265a54SOllivier Robert u_short mbz_itemsize; /* item size */ 141ce265a54SOllivier Robert req_data_u u; /* data area */ 142c0b746e5SOllivier Robert l_fp tstamp; /* time stamp, for authentication */ 143c0b746e5SOllivier Robert keyid_t keyid; /* (optional) encryption key */ 144ce265a54SOllivier Robert char mac[MAX_MDG_LEN]; /* (optional) auth code */ 145c0b746e5SOllivier Robert }; 146c0b746e5SOllivier Robert 147c0b746e5SOllivier Robert /* 148c0b746e5SOllivier Robert * The req_pkt_tail structure is used by ntpd to adjust for different 149c0b746e5SOllivier Robert * packet sizes that may arrive. 150c0b746e5SOllivier Robert */ 151c0b746e5SOllivier Robert struct req_pkt_tail { 152c0b746e5SOllivier Robert l_fp tstamp; /* time stamp, for authentication */ 153c0b746e5SOllivier Robert keyid_t keyid; /* (optional) encryption key */ 154c0b746e5SOllivier Robert char mac[MAX_MDG_LEN]; /* (optional) auth code */ 155c0b746e5SOllivier Robert }; 156c0b746e5SOllivier Robert 157c0b746e5SOllivier Robert /* MODE_PRIVATE request packet header length before optional items. */ 158c0b746e5SOllivier Robert #define REQ_LEN_HDR (offsetof(struct req_pkt, u)) 159c0b746e5SOllivier Robert /* MODE_PRIVATE request packet fixed length without MAC. */ 160c0b746e5SOllivier Robert #define REQ_LEN_NOMAC (offsetof(struct req_pkt, keyid)) 161c0b746e5SOllivier Robert /* MODE_PRIVATE req_pkt_tail minimum size (16 octet digest) */ 162c0b746e5SOllivier Robert #define REQ_TAIL_MIN \ 163c0b746e5SOllivier Robert (sizeof(struct req_pkt_tail) - (MAX_MAC_LEN - MAX_MD5_LEN)) 164c0b746e5SOllivier Robert 165c0b746e5SOllivier Robert /* 166c0b746e5SOllivier Robert * A MODE_PRIVATE response packet. The length here is variable, this 167c0b746e5SOllivier Robert * is a maximally sized one. Note that this implementation doesn't 168c0b746e5SOllivier Robert * authenticate responses. 169c0b746e5SOllivier Robert */ 170c0b746e5SOllivier Robert #define RESP_HEADER_SIZE (offsetof(struct resp_pkt, u)) 171c0b746e5SOllivier Robert #define RESP_DATA_SIZE 500 172c0b746e5SOllivier Robert 173c0b746e5SOllivier Robert typedef union resp_pkt_u_tag { 174c0b746e5SOllivier Robert char data[RESP_DATA_SIZE]; 175c0b746e5SOllivier Robert u_int32 u32[RESP_DATA_SIZE / sizeof(u_int32)]; 176c0b746e5SOllivier Robert } 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 */ 185c0b746e5SOllivier Robert 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 193c0b746e5SOllivier Robert #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 */ 198c0b746e5SOllivier Robert #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 2109c2daa00SOllivier 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) \ 2189c2daa00SOllivier Robert ((u_char)(((resp)?RESP_BIT:0)\ 2199c2daa00SOllivier 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) 233c0b746e5SOllivier 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 241c0b746e5SOllivier Robert #define IMPL_XNTPD_OLD 2 /* Used by pre ipv6 ntpdc */ 242c0b746e5SOllivier 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 /* 256c0b746e5SOllivier Robert * 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 */ 276224ba2bdSOllivier Robert #define REQ_RESSUBFLAGS 18 /* remove flags from restrict list */ 277224ba2bdSOllivier Robert #define REQ_UNRESTRICT 19 /* remove entry from restrict list */ 278c0b746e5SOllivier Robert #define REQ_MON_GETLIST 20 /* return data collected by monitor */ 2799c2daa00SOllivier Robert #define REQ_RESET_STATS 21 /* reset stat counters */ 2809c2daa00SOllivier Robert #define REQ_RESET_PEER 22 /* reset peer stat counters */ 2819c2daa00SOllivier 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) */ 299c0b746e5SOllivier Robert #define REQ_MON_GETLIST_1 42 /* return collected v1 monitor data */ 300c0b746e5SOllivier Robert #define REQ_HOSTNAME_ASSOCID 43 /* Here is a hostname + assoc_id */ 301c0b746e5SOllivier Robert #define REQ_IF_STATS 44 /* get interface statistics */ 302c0b746e5SOllivier Robert #define REQ_IF_RELOAD 45 /* reload interface list */ 303ce265a54SOllivier Robert 304c0b746e5SOllivier Robert /* Determine size of pre-v6 version of structures */ 305c0b746e5SOllivier Robert #define v4sizeof(type) offsetof(type, v6_flag) 306c0b746e5SOllivier Robert 307c0b746e5SOllivier Robert /* 308c0b746e5SOllivier Robert * Flags in the peer information returns 309224ba2bdSOllivier Robert */ 310c0b746e5SOllivier Robert #define INFO_FLAG_CONFIG 0x1 311c0b746e5SOllivier Robert #define INFO_FLAG_SYSPEER 0x2 3129c2daa00SOllivier 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 3169c2daa00SOllivier Robert #define INFO_FLAG_SEL_CANDIDATE 0x40 3179c2daa00SOllivier Robert #define INFO_FLAG_SHORTLIST 0x80 3189c2daa00SOllivier 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 329c0b746e5SOllivier 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. 335c0b746e5SOllivier 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 */ 3399c2daa00SOllivier Robert u_short port; /* port number of peer */ 3409c2daa00SOllivier Robert u_char hmode; /* mode for this peer */ 3419c2daa00SOllivier Robert u_char flags; /* flags (from above) */ 342c0b746e5SOllivier Robert u_int v6_flag; /* is this v6 or not */ 343c0b746e5SOllivier Robert u_int unused1; /* (unused) padding for addr6 */ 344c0b746e5SOllivier 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. 3509c2daa00SOllivier 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 */ 361224ba2bdSOllivier Robert s_fp delay; /* peer.estdelay */ 362c0b746e5SOllivier Robert l_fp offset; /* peer.estoffset */ 363c0b746e5SOllivier Robert u_fp dispersion; /* peer.estdisp */ 364c0b746e5SOllivier Robert u_int v6_flag; /* is this v6 or not */ 365c0b746e5SOllivier Robert u_int unused1; /* (unused) padding for dstadr6 */ 366c0b746e5SOllivier Robert struct in6_addr dstadr6; /* local address (v6) */ 367224ba2bdSOllivier Robert struct in6_addr srcadr6; /* source address (v6) */ 368224ba2bdSOllivier 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 */ 376c0b746e5SOllivier 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 */ 387c0b746e5SOllivier 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 */ 3939c2daa00SOllivier Robert associd_t associd; /* association ID */ 3949c2daa00SOllivier Robert keyid_t keyid; /* peer.keyid */ 3959c2daa00SOllivier Robert u_int32 pkeyid; /* unused */ 3969c2daa00SOllivier Robert u_int32 refid; /* peer.refid */ 397c0b746e5SOllivier Robert u_int32 timer; /* peer.timer */ 398c0b746e5SOllivier Robert 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 */ 419c0b746e5SOllivier Robert u_int v6_flag; /* is this v6 or not */ 420c0b746e5SOllivier Robert u_int unused9; /* (unused) padding for dstadr6 */ 421c0b746e5SOllivier Robert struct in6_addr dstadr6; /* local address (v6-like) */ 422c0b746e5SOllivier Robert struct in6_addr srcadr6; /* sources address (v6-like) */ 423c0b746e5SOllivier Robert }; 424c0b746e5SOllivier Robert 425c0b746e5SOllivier Robert 426c0b746e5SOllivier Robert /* 427c0b746e5SOllivier Robert * Peer statistics structure 4289c2daa00SOllivier Robert */ 4299c2daa00SOllivier Robert struct info_peer_stats { 4309c2daa00SOllivier Robert u_int32 dstadr; /* local address */ 4319c2daa00SOllivier 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 */ 4519c2daa00SOllivier Robert u_char unused6; /* (unused) */ 452c0b746e5SOllivier Robert u_char unused7; /* (unused) */ 453c0b746e5SOllivier Robert u_char unused8; /* (unused) */ 454c0b746e5SOllivier Robert u_int v6_flag; /* is this v6 or not */ 455c0b746e5SOllivier Robert u_int unused9; /* (unused) padding for dstadr6 */ 456c0b746e5SOllivier Robert struct in6_addr dstadr6; /* local address */ 457c0b746e5SOllivier 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; 4699c2daa00SOllivier Robert }; 4709c2daa00SOllivier Robert 4719c2daa00SOllivier 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 { 477c0b746e5SOllivier Robert u_int32 peer; /* system peer address (v4) */ 478c0b746e5SOllivier Robert u_char peer_mode; /* mode we are syncing to peer in */ 4799c2daa00SOllivier Robert u_char leap; /* system leap bits */ 4809c2daa00SOllivier Robert u_char stratum; /* our stratum */ 4819c2daa00SOllivier Robert s_char precision; /* local clock precision */ 4829c2daa00SOllivier Robert s_fp rootdelay; /* delay from sync source */ 4839c2daa00SOllivier Robert u_fp rootdispersion; /* dispersion from sync source */ 4849c2daa00SOllivier Robert u_int32 refid; /* reference ID of sync source */ 4859c2daa00SOllivier Robert l_fp reftime; /* system reference time */ 486c0b746e5SOllivier Robert u_int32 poll; /* system poll interval */ 4879c2daa00SOllivier Robert u_char flags; /* system flags */ 4889c2daa00SOllivier Robert u_char unused1; /* unused */ 4899c2daa00SOllivier 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) */ 495c0b746e5SOllivier Robert u_int v6_flag; /* is this v6 or not */ 496c0b746e5SOllivier Robert u_int unused4; /* unused, padding for peer6 */ 4979c2daa00SOllivier Robert struct in6_addr peer6; /* system peer address (v6) */ 4989c2daa00SOllivier Robert }; 4999c2daa00SOllivier Robert 5009c2daa00SOllivier Robert 5019c2daa00SOllivier Robert /* 5029c2daa00SOllivier Robert * System stats. These are collected in the protocol module 5039c2daa00SOllivier Robert */ 504c0b746e5SOllivier Robert struct info_sys_stats { 5059c2daa00SOllivier Robert u_int32 timeup; /* time since restart */ 5069c2daa00SOllivier Robert u_int32 timereset; /* time since reset */ 507c0b746e5SOllivier Robert u_int32 denied; /* access denied */ 508c0b746e5SOllivier Robert u_int32 oldversionpkt; /* recent version */ 509c0b746e5SOllivier Robert u_int32 newversionpkt; /* current version */ 510c0b746e5SOllivier Robert u_int32 unknownversion; /* bad version */ 511c0b746e5SOllivier Robert u_int32 badlength; /* bad length or format */ 512c0b746e5SOllivier Robert u_int32 processed; /* packets processed */ 513c0b746e5SOllivier Robert u_int32 badauth; /* bad authentication */ 514c0b746e5SOllivier Robert u_int32 received; /* packets received */ 515c0b746e5SOllivier Robert u_int32 limitrejected; /* rate exceeded */ 516c0b746e5SOllivier Robert u_int32 lamport; /* Lamport violations */ 517c0b746e5SOllivier Robert 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 { 525c0b746e5SOllivier Robert u_int32 timeup; /* time since restart */ 526c0b746e5SOllivier Robert u_int32 timereset; /* time since reset */ 527c0b746e5SOllivier Robert u_int32 denied; /* access denied */ 528c0b746e5SOllivier Robert u_int32 oldversionpkt; /* recent version */ 529c0b746e5SOllivier Robert u_int32 newversionpkt; /* current version */ 530c0b746e5SOllivier Robert u_int32 unknownversion; /* bad version */ 531c0b746e5SOllivier Robert u_int32 badlength; /* bad length or format */ 532c0b746e5SOllivier Robert u_int32 processed; /* packets processed */ 533c0b746e5SOllivier Robert u_int32 badauth; /* bad authentication */ 534c0b746e5SOllivier 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; 548c0b746e5SOllivier 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 */ 557ce265a54SOllivier Robert u_short totalrecvbufs; /* total receive bufs */ 558ce265a54SOllivier Robert u_short freerecvbufs; /* free buffers */ 559ce265a54SOllivier Robert u_short fullrecvbufs; /* full buffers */ 560ce265a54SOllivier Robert u_short lowwater; /* number of times we've added buffers */ 561ce265a54SOllivier Robert u_int32 dropped; /* dropped packets */ 562ce265a54SOllivier Robert u_int32 ignored; /* ignored packets */ 563ce265a54SOllivier Robert u_int32 received; /* received packets */ 564ce265a54SOllivier Robert u_int32 sent; /* packets sent */ 565ce265a54SOllivier Robert u_int32 notsent; /* packets not sent */ 566ce265a54SOllivier Robert u_int32 interrupts; /* interrupts we've handled */ 567ce265a54SOllivier Robert u_int32 int_received; /* received by interrupt handler */ 568ce265a54SOllivier 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 */ 5779c2daa00SOllivier Robert u_int32 overflows; /* timer overflows */ 578224ba2bdSOllivier Robert u_int32 xmtcalls; /* calls to xmit */ 579224ba2bdSOllivier Robert }; 5809c2daa00SOllivier Robert 5819c2daa00SOllivier Robert 5829c2daa00SOllivier Robert /* 583c0b746e5SOllivier Robert * Structure for passing peer configuration information 584c0b746e5SOllivier Robert */ 585224ba2bdSOllivier Robert struct old_conf_peer { 586224ba2bdSOllivier Robert u_int32 peeraddr; /* address to poll */ 587224ba2bdSOllivier Robert u_char hmode; /* mode, either broadcast, active or client */ 588224ba2bdSOllivier Robert u_char version; /* version number to poll with */ 589224ba2bdSOllivier Robert u_char minpoll; /* min host poll interval */ 590224ba2bdSOllivier Robert u_char maxpoll; /* max host poll interval */ 591c0b746e5SOllivier Robert u_char flags; /* flags for this request */ 592c0b746e5SOllivier Robert u_char ttl; /* time to live (multicast) or refclock mode */ 593c0b746e5SOllivier Robert u_short unused; /* unused */ 594c0b746e5SOllivier Robert keyid_t keyid; /* key to use for this association */ 595c0b746e5SOllivier Robert }; 596c0b746e5SOllivier Robert 597c0b746e5SOllivier Robert struct conf_peer { 598c0b746e5SOllivier Robert u_int32 peeraddr; /* address to poll */ 5999c2daa00SOllivier Robert u_char hmode; /* mode, either broadcast, active or client */ 6009c2daa00SOllivier 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 */ 605c0b746e5SOllivier Robert u_short unused1; /* unused */ 606c0b746e5SOllivier Robert keyid_t keyid; /* key to use for this association */ 607c0b746e5SOllivier Robert char keystr[128]; /* public key file name */ 608c0b746e5SOllivier Robert u_int v6_flag; /* is this v6 or not */ 609c0b746e5SOllivier Robert u_int unused2; /* unused, padding for peeraddr6 */ 610c0b746e5SOllivier Robert struct in6_addr peeraddr6; /* ipv6 address to poll */ 611c0b746e5SOllivier Robert }; 612c0b746e5SOllivier Robert 613ce265a54SOllivier Robert #define CONF_FLAG_AUTHENABLE 0x01 614ce265a54SOllivier Robert #define CONF_FLAG_PREFER 0x02 615ce265a54SOllivier Robert #define CONF_FLAG_BURST 0x04 616ce265a54SOllivier Robert #define CONF_FLAG_IBURST 0x08 617c0b746e5SOllivier Robert #define CONF_FLAG_NOSELECT 0x10 618c0b746e5SOllivier Robert #define CONF_FLAG_SKEY 0x20 619ce265a54SOllivier Robert 620ce265a54SOllivier 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 */ 627c0b746e5SOllivier Robert u_int v6_flag; /* is this v6 or not */ 628c0b746e5SOllivier Robert struct in6_addr peeraddr6; /* address of peer (v6) */ 629c0b746e5SOllivier Robert }; 630c0b746e5SOllivier Robert 6319c2daa00SOllivier Robert /* 6329c2daa00SOllivier Robert * Structure for carrying system flags. 6339c2daa00SOllivier Robert */ 6349c2daa00SOllivier 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 */ 641c0b746e5SOllivier Robert #define SYS_FLAG_BCLIENT 0x01 642c0b746e5SOllivier Robert #define SYS_FLAG_PPS 0x02 643c0b746e5SOllivier Robert #define SYS_FLAG_NTP 0x04 644c0b746e5SOllivier Robert #define SYS_FLAG_KERNEL 0x08 645c0b746e5SOllivier Robert #define SYS_FLAG_MONITOR 0x10 6469c2daa00SOllivier Robert #define SYS_FLAG_FILEGEN 0x20 6479c2daa00SOllivier Robert #define SYS_FLAG_AUTH 0x40 6489c2daa00SOllivier 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 */ 657c0b746e5SOllivier Robert u_short rflags; /* restrict flags */ 658c0b746e5SOllivier Robert u_short mflags; /* match flags */ 659c0b746e5SOllivier Robert u_int v6_flag; /* is this v6 or not */ 6609c2daa00SOllivier Robert u_int unused1; /* unused, padding for addr6 */ 661c0b746e5SOllivier Robert struct in6_addr addr6; /* match address (v6) */ 662c0b746e5SOllivier Robert struct in6_addr mask6; /* match mask (v6) */ 663c0b746e5SOllivier Robert }; 664c0b746e5SOllivier Robert 665c0b746e5SOllivier Robert 6669c2daa00SOllivier Robert /* 6679c2daa00SOllivier Robert * Structure used for specifying restrict entries 6689c2daa00SOllivier Robert */ 6699c2daa00SOllivier Robert struct conf_restrict { 670c0b746e5SOllivier Robert u_int32 addr; /* match address */ 671c0b746e5SOllivier Robert u_int32 mask; /* match mask */ 672c0b746e5SOllivier Robert short ippeerlimit; /* ip peer limit */ 673c0b746e5SOllivier Robert int srvfuzrft; /* server response fuzz reftime: poll */ 674c0b746e5SOllivier Robert u_short flags; /* restrict flags XXX: OLD size and name */ 675c0b746e5SOllivier Robert u_short mflags; /* match flags */ 676c0b746e5SOllivier Robert short unused1; /* (unused) padding for v6_flag */ 677c0b746e5SOllivier Robert u_int v6_flag; /* is this v6 or not */ 678c0b746e5SOllivier Robert struct in6_addr addr6; /* match address (v6) */ 679c0b746e5SOllivier Robert struct in6_addr mask6; /* match mask (v6) */ 680c0b746e5SOllivier Robert }; 681c0b746e5SOllivier Robert 682c0b746e5SOllivier Robert 683c0b746e5SOllivier Robert /* 684c0b746e5SOllivier Robert * Structure used for returning monitor data 6859c2daa00SOllivier Robert */ 6869c2daa00SOllivier Robert struct info_monitor_1 { 6879c2daa00SOllivier Robert u_int32 avg_int; /* avg s between packets from this host */ 688c0b746e5SOllivier Robert u_int32 last_int; /* s since we last received a packet */ 689c0b746e5SOllivier Robert u_int32 restr; /* restrict bits (was named lastdrop) */ 690c0b746e5SOllivier Robert u_int32 count; /* count of packets received */ 691c0b746e5SOllivier 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 */ 697c0b746e5SOllivier Robert u_int v6_flag; /* is this v6 or not */ 698c0b746e5SOllivier Robert u_int unused1; /* unused, padding for addr6 */ 699c0b746e5SOllivier Robert struct in6_addr addr6; /* host address V6 style */ 700c0b746e5SOllivier Robert struct in6_addr daddr6; /* host address V6 style */ 7019c2daa00SOllivier Robert }; 7029c2daa00SOllivier Robert 703c0b746e5SOllivier Robert 704c0b746e5SOllivier Robert /* 705c0b746e5SOllivier Robert * Structure used for returning monitor data 706c0b746e5SOllivier Robert */ 707c0b746e5SOllivier Robert struct info_monitor { 708c0b746e5SOllivier Robert u_int32 avg_int; /* avg s between packets from this host */ 709c0b746e5SOllivier Robert u_int32 last_int; /* s since we last received a packet */ 710c0b746e5SOllivier Robert 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 */ 716c0b746e5SOllivier Robert u_int v6_flag; /* is this v6 or not */ 717c0b746e5SOllivier Robert u_int unused1; /* unused, padding for addr6 */ 718c0b746e5SOllivier Robert struct in6_addr addr6; /* host v6 address */ 719c0b746e5SOllivier Robert }; 720c0b746e5SOllivier Robert 721c0b746e5SOllivier Robert /* 722c0b746e5SOllivier Robert * 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 */ 732c0b746e5SOllivier Robert u_int v6_flag; /* is this v6 or not */ 733c0b746e5SOllivier 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 7459c2daa00SOllivier Robert #define RESET_FLAG_SYS 0x04 7469c2daa00SOllivier 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 751c0b746e5SOllivier Robert #define RESET_ALLFLAGS ( \ 752c0b746e5SOllivier Robert RESET_FLAG_ALLPEERS | \ 7539c2daa00SOllivier Robert RESET_FLAG_IO | \ 7549c2daa00SOllivier Robert RESET_FLAG_SYS | \ 7559c2daa00SOllivier Robert RESET_FLAG_MEM | \ 756c0b746e5SOllivier Robert RESET_FLAG_TIMER | \ 757c0b746e5SOllivier Robert RESET_FLAG_AUTH | \ 758c0b746e5SOllivier Robert RESET_FLAG_CTL \ 759c0b746e5SOllivier Robert ) 760c0b746e5SOllivier Robert 761c0b746e5SOllivier Robert /* 7629c2daa00SOllivier Robert * Structure used to return information concerning the authentication 7639c2daa00SOllivier Robert * module. 764c0b746e5SOllivier Robert */ 765c0b746e5SOllivier Robert struct info_auth { 7669c2daa00SOllivier Robert u_int32 timereset; /* time counters were reset */ 7679c2daa00SOllivier Robert u_int32 numkeys; /* number of keys we know */ 7689c2daa00SOllivier 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 { 782c0b746e5SOllivier Robert u_int32 local_address; /* local interface addres (v4) */ 783c0b746e5SOllivier 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 */ 790c0b746e5SOllivier Robert u_int v6_flag; /* is this v6 or not */ 791c0b746e5SOllivier Robert struct in6_addr local_address6; /* local interface address (v6) */ 792c0b746e5SOllivier 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 { 799c0b746e5SOllivier Robert u_int32 local_address; /* remote client's address */ 800c0b746e5SOllivier Robert u_int32 trap_address; /* local interface address */ 801c0b746e5SOllivier Robert u_short trap_port; /* remote client's port */ 802c0b746e5SOllivier Robert u_short unused; /* (unused) */ 803c0b746e5SOllivier Robert u_int v6_flag; /* is this v6 or not */ 804c0b746e5SOllivier Robert struct in6_addr local_address6; /* local interface address (v6) */ 805c0b746e5SOllivier 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; 848c0b746e5SOllivier Robert 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; 859c0b746e5SOllivier Robert 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 873224ba2bdSOllivier Robert #define NUMCBUGTIMES 32 874224ba2bdSOllivier Robert 875224ba2bdSOllivier Robert struct info_clkbug { 876224ba2bdSOllivier Robert u_int32 clockadr; 877224ba2bdSOllivier Robert u_char nvalues; 878224ba2bdSOllivier Robert u_char ntimes; 879224ba2bdSOllivier Robert u_short svalues; 880224ba2bdSOllivier Robert u_int32 stimes; 881224ba2bdSOllivier Robert u_int32 values[NUMCBUGVALUES]; 882224ba2bdSOllivier Robert l_fp times[NUMCBUGTIMES]; 883224ba2bdSOllivier Robert }; 8849c2daa00SOllivier Robert 885 /* 886 * Structure used for returning kernel pll/PPS information 887 */ 888 struct info_kernel { 889 int32 offset; 890 int32 freq; 891 int32 maxerror; 892 int32 esterror; 893 u_short status; 894 u_short shift; 895 int32 constant; 896 int32 precision; 897 int32 tolerance; 898 899 /* 900 * Variables used only if PPS signal discipline is implemented 901 */ 902 int32 ppsfreq; 903 int32 jitter; 904 int32 stabil; 905 int32 jitcnt; 906 int32 calcnt; 907 int32 errcnt; 908 int32 stbcnt; 909 }; 910 911 /* 912 * interface statistics 913 */ 914 struct info_if_stats { 915 union addrun unaddr; /* address */ 916 union addrun unbcast; /* broadcast */ 917 union addrun unmask; /* mask */ 918 u_int32 v6_flag; /* is this v6 */ 919 char name[32]; /* name of interface */ 920 int32 flags; /* interface flags */ 921 int32 last_ttl; /* last TTL specified */ 922 int32 num_mcast; /* No. of IP addresses in multicast socket */ 923 int32 received; /* number of incoming packets */ 924 int32 sent; /* number of outgoing packets */ 925 int32 notsent; /* number of send failures */ 926 int32 uptime; /* number of seconds this interface was active */ 927 u_int32 scopeid; /* Scope used for Multicasting */ 928 u_int32 ifindex; /* interface index - from system */ 929 u_int32 ifnum; /* sequential interface number */ 930 u_int32 peercnt; /* number of peers referencinf this interface - informational only */ 931 u_short family; /* Address family */ 932 u_char ignore_packets; /* Specify whether the packet should be ignored */ 933 u_char action; /* reason the item is listed */ 934 int32 _filler0; /* pad to a 64 bit size boundary */ 935 }; 936 937 #define IFS_EXISTS 1 /* just exists */ 938 #define IFS_CREATED 2 /* was just created */ 939 #define IFS_DELETED 3 /* was just delete */ 940 941 /* 942 * Info returned with IP -> hostname lookup 943 */ 944 /* 144 might need to become 32, matching data[] member of req_pkt */ 945 #define NTP_MAXHOSTNAME (32 - sizeof(u_int32) - sizeof(u_short)) 946 struct info_dns_assoc { 947 u_int32 peeraddr; /* peer address (HMS: being careful...) */ 948 associd_t associd; /* association ID */ 949 char hostname[NTP_MAXHOSTNAME]; /* hostname */ 950 }; 951 952 /* 953 * function declarations 954 */ 955 int get_packet_mode(struct recvbuf *rbufp); /* Return packet mode */ 956 957 #endif /* NTP_REQUEST_H */ 958