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