/*
  chronyd/chronyc - Programs for keeping computer clocks accurate.

 **********************************************************************
 * Copyright (C) Richard P. Curnow  1997-2002
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 * 
 **********************************************************************

  =======================================================================

  Data structure definitions within the daemon for various reports that
  can be generated */

#ifndef GOT_REPORTS_H
#define GOT_REPORTS_H

#include "sysincl.h"
#include "addressing.h"
#include "ntp.h"

typedef struct {
  IPAddr ip_addr;
  int stratum;
  int poll;
  enum {RPT_NTP_CLIENT, RPT_NTP_PEER, RPT_LOCAL_REFERENCE} mode;
  enum {
    RPT_NONSELECTABLE,
    RPT_FALSETICKER,
    RPT_JITTERY,
    RPT_SELECTABLE,
    RPT_UNSELECTED,
    RPT_SELECTED,
  } state;

  int reachability;
  unsigned long latest_meas_ago; /* seconds */
  double orig_latest_meas; /* seconds */
  double latest_meas; /* seconds */
  double latest_meas_err; /* seconds */
} RPT_SourceReport ;

typedef struct {
  uint32_t ref_id;
  IPAddr ip_addr;
  int stratum;
  NTP_Leap leap_status;
  struct timespec ref_time;
  double current_correction;
  double last_offset;
  double rms_offset;
  double freq_ppm;
  double resid_freq_ppm;
  double skew_ppm;
  double root_delay;
  double root_dispersion;
  double last_update_interval;
} RPT_TrackingReport;

typedef struct {
  uint32_t ref_id;
  IPAddr ip_addr;
  unsigned long n_samples;
  unsigned long n_runs;
  unsigned long span_seconds;
  double resid_freq_ppm;
  double skew_ppm;
  double sd;
  double est_offset;
  double est_offset_err;
} RPT_SourcestatsReport;

typedef struct {
  struct timespec ref_time;
  unsigned long n_samples;
  unsigned long n_runs;
  unsigned long span_seconds;
  double rtc_seconds_fast;
  double rtc_gain_rate_ppm;
} RPT_RTC_Report;

typedef struct {
  IPAddr ip_addr;
  uint32_t ntp_hits;
  uint32_t nke_hits;
  uint32_t cmd_hits;
  uint16_t ntp_drops;
  uint16_t nke_drops;
  uint16_t cmd_drops;
  int8_t ntp_interval;
  int8_t nke_interval;
  int8_t cmd_interval;
  int8_t ntp_timeout_interval;
  uint32_t last_ntp_hit_ago;
  uint32_t last_nke_hit_ago;
  uint32_t last_cmd_hit_ago;
} RPT_ClientAccessByIndex_Report;

typedef struct {
  uint32_t ntp_hits;
  uint32_t nke_hits;
  uint32_t cmd_hits;
  uint32_t ntp_drops;
  uint32_t nke_drops;
  uint32_t cmd_drops;
  uint32_t log_drops;
  uint32_t ntp_auth_hits;
  uint32_t ntp_interleaved_hits;
  uint32_t ntp_timestamps;
  uint32_t ntp_span_seconds;
} RPT_ServerStatsReport;

typedef struct {
  struct timespec when;
  double slewed_offset;
  double orig_offset;
  double residual;
} RPT_ManualSamplesReport;

typedef struct {
  int online;
  int offline;
  int burst_online;
  int burst_offline;
  int unresolved;
} RPT_ActivityReport;

typedef struct {
  int active;
  int leap_only;
  double offset;
  double freq_ppm;
  double wander_ppm;
  double last_update_ago;
  double remaining_time;
} RPT_SmoothingReport;

typedef struct {
  IPAddr remote_addr;
  IPAddr local_addr;
  uint16_t remote_port;
  uint8_t leap;
  uint8_t version;
  uint8_t mode;
  uint8_t stratum;
  int8_t poll;
  int8_t precision;
  double root_delay;
  double root_dispersion;
  uint32_t ref_id;
  struct timespec ref_time;
  double offset;
  double peer_delay;
  double peer_dispersion;
  double response_time;
  double jitter_asymmetry;
  uint16_t tests;
  int interleaved;
  int authenticated;
  char tx_tss_char;
  char rx_tss_char;
  uint32_t total_tx_count;
  uint32_t total_rx_count;
  uint32_t total_valid_count;
} RPT_NTPReport;

typedef struct {
  NTP_AuthMode mode;
  uint32_t key_id;
  int key_type;
  int key_length;
  int ke_attempts;
  uint32_t last_ke_ago;
  int cookies;
  int cookie_length;
  int nak;
} RPT_AuthReport;

typedef struct {
  uint32_t ref_id;
  IPAddr ip_addr;
  char state_char;
  int authentication;
  NTP_Leap leap;
  int conf_options;
  int eff_options;
  uint32_t last_sample_ago;
  double score;
  double lo_limit;
  double hi_limit;
} RPT_SelectReport;

#endif /* GOT_REPORTS_H */
