]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
Move estimated offset and error to sourcestats report
authorMiroslav Lichvar <mlichvar@redhat.com>
Sun, 13 Dec 2009 13:53:58 +0000 (14:53 +0100)
committerMiroslav Lichvar <mlichvar@redhat.com>
Mon, 14 Dec 2009 09:34:33 +0000 (10:34 +0100)
And print the estimated offset in sourcestats output.

candm.h
chrony.texi
client.c
cmdmon.c
reports.h
sources.c
sources.h
sourcestats.c
sourcestats.h

diff --git a/candm.h b/candm.h
index f226a9d4655c4a8e20e8d417b50b3b07923f79b9..25f16c18d34e7fbd3591fb7863399a270a371192 100644 (file)
--- a/candm.h
+++ b/candm.h
@@ -475,8 +475,6 @@ typedef struct {
   Float orig_latest_meas;
   Float latest_meas;
   Float latest_meas_err;
-  Float est_offset;
-  Float est_offset_err;
   int32_t EOR;
 } RPY_Source_Data;
 
@@ -503,6 +501,8 @@ typedef struct {
   Float sd;
   Float resid_freq_ppm;
   Float skew_ppm;
+  Float est_offset;
+  Float est_offset_err;
   int32_t EOR;
 } RPY_Sourcestats;
 
index 95b7232c49216a7537daabdb5da18b5f15e3fd26..9fc672f4ee1ed963a064f8de37a3de327bc570e9 100644 (file)
@@ -3569,9 +3569,9 @@ An example report is
 @example
 @group
 210 Number of sources = 1
-Name/IP Address            NP  NR  Span  Frequency   Freq Skew   Std Dev
-========================================================================
-abc.def.ghi                11   5   46m      -0.001       0.045     25us
+Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
+===============================================================================
+abc.def.ghi                11   5   46m     -0.001      0.045      1us    25us
 @end group
 @end example
 
@@ -3609,6 +3609,9 @@ million.  In this case, the computer's clock is estimated to be running
 This is the estimated error bounds on @code{Freq} (again in parts per
 million).
 
+@item Offset
+This is the estimated offset of the source.
+
 @item Std Dev
 This is the estimated sample standard deviation.
 
index 7d6043b89fca36c193a880f1260e74ee797aa3a0..f27ce6465014dfacf59d8596052a6d3054b6705c 100644 (file)
--- a/client.c
+++ b/client.c
@@ -1553,9 +1553,8 @@ process_cmd_sources(char *line)
   int n_sources, i;
   int verbose = 0;
 
-  double orig_latest_meas, latest_meas, est_offset;
+  double orig_latest_meas, latest_meas, latest_meas_err;
   IPAddr ip_addr;
-  double latest_meas_err, est_offset_err;
   uint32_t latest_meas_ago;
   uint16_t poll, stratum;
   uint16_t state, mode;
@@ -1583,7 +1582,7 @@ process_cmd_sources(char *line)
     printf("MS Name/IP address           Stratum Poll LastRx Last sample\n");
     printf("============================================================================\n");
 
-    /*     "MS NNNNNNNNNNNNNNNNNNNNNNNNN    SS    PP   RRRR  SSSSSSS[SSSSSSS] +/- SSSSSS" */
+    /*     "MS NNNNNNNNNNNNNNNNNNNNNNNNN    SS   PP   RRRR  SSSSSSS[SSSSSSS] +/- SSSSSS" */
 
     for (i=0; i<n_sources; i++) {
       request.command = htons(REQ_SOURCE_DATA);
@@ -1598,8 +1597,6 @@ process_cmd_sources(char *line)
           orig_latest_meas = UTI_FloatNetworkToHost(reply.data.source_data.orig_latest_meas);
           latest_meas = UTI_FloatNetworkToHost(reply.data.source_data.latest_meas);
           latest_meas_err = UTI_FloatNetworkToHost(reply.data.source_data.latest_meas_err);
-          est_offset = UTI_FloatNetworkToHost(reply.data.source_data.est_offset);
-          est_offset_err = UTI_FloatNetworkToHost(reply.data.source_data.est_offset_err);
 
           if (mode == RPY_SD_MD_REF) {
             snprintf(hostname_buf, sizeof(hostname_buf), "%s", UTI_RefidToString(ip_addr.addr.in4));
@@ -1663,7 +1660,7 @@ process_cmd_sourcestats(char *line)
 
   char hostname_buf[32];
   unsigned long n_samples, n_runs, span_seconds;
-  double resid_freq_ppm, skew_ppm, sd;
+  double resid_freq_ppm, skew_ppm, sd, est_offset, est_offset_err;
   unsigned long ref_id;
   IPAddr ip_addr;
 
@@ -1678,16 +1675,17 @@ process_cmd_sourcestats(char *line)
       printf("                            /    .- Number of residual runs with same sign.\n");
       printf("                           |    /    .- Length of measurement set (time).\n");
       printf("                           |   |    /      .- Est. clock freq error (ppm).\n");
-      printf("                           |   |   |      /            .- Est error in freq.\n");
-      printf("                           |   |   |     |            /            .- On the\n");
-      printf("                           |   |   |     |           |            /   samples.\n");
-      printf("                           |   |   |     |           |           |\n");
+      printf("                           |   |   |      /           .- Est. error in freq.\n");
+      printf("                           |   |   |     |           /         .- Est. offset.\n");
+      printf("                           |   |   |     |          |          |   On the -.\n");
+      printf("                           |   |   |     |          |          |   samples. \\\n");
+      printf("                           |   |   |     |          |          |             |\n");
     }
 
-    printf("Name/IP Address            NP  NR  Span  Frequency   Freq Skew   Std Dev\n");
-    printf("========================================================================\n");
+    printf("Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev\n");
+    printf("==============================================================================\n");
 
-    /*      NNNNNNNNNNNNNNNNNNNNNNNNN  NP  NR  SSSS  FFFFFFFFFF  SSSSSSSSSS  SSSSSSS */
+    /*      NNNNNNNNNNNNNNNNNNNNNNNNN  NP  NR  SSSS FFFFFFFFFF SSSSSSSSSS  SSSSSSS  SSSSSS*/
 
     for (i=0; i<n_sources; i++) {
       request.command = htons(REQ_SOURCESTATS);
@@ -1701,6 +1699,8 @@ process_cmd_sourcestats(char *line)
           resid_freq_ppm = UTI_FloatNetworkToHost(reply.data.sourcestats.resid_freq_ppm);
           skew_ppm = UTI_FloatNetworkToHost(reply.data.sourcestats.skew_ppm);
           sd = UTI_FloatNetworkToHost(reply.data.sourcestats.sd);
+          est_offset = UTI_FloatNetworkToHost(reply.data.sourcestats.est_offset);
+          est_offset_err = UTI_FloatNetworkToHost(reply.data.sourcestats.est_offset_err);
 
           if (ip_addr.family == IPADDR_UNSPEC)
             snprintf(hostname_buf, sizeof(hostname_buf), "%s", UTI_RefidToString(ref_id));
@@ -1713,7 +1713,9 @@ process_cmd_sourcestats(char *line)
 
           printf("%-25s  %2lu  %2lu  ", hostname_buf, n_samples, n_runs);
           print_seconds(span_seconds);
-          printf("  %10.3f  %10.3f  ", resid_freq_ppm, skew_ppm);
+          printf(" %10.3f %10.3f  ", resid_freq_ppm, skew_ppm);
+          print_signed_nanoseconds(est_offset);
+          printf("  ");
           print_nanoseconds(sd);
           printf("\n");
       } else {
index 62fb5470fac7dc445b4d12a52dde679e9fe18ecb..e1edfba16dc8a2dec400604d45857129ed81dc78 100644 (file)
--- a/cmdmon.c
+++ b/cmdmon.c
@@ -1043,8 +1043,6 @@ handle_source_data(CMD_Request *rx_message, CMD_Reply *tx_message)
     tx_message->data.source_data.orig_latest_meas = UTI_FloatHostToNetwork(report.orig_latest_meas);
     tx_message->data.source_data.latest_meas = UTI_FloatHostToNetwork(report.latest_meas);
     tx_message->data.source_data.latest_meas_err = UTI_FloatHostToNetwork(report.latest_meas_err);
-    tx_message->data.source_data.est_offset = UTI_FloatHostToNetwork(report.est_offset);
-    tx_message->data.source_data.est_offset_err = UTI_FloatHostToNetwork(report.est_offset_err);
   } else {
     tx_message->status = htons(STT_NOSUCHSOURCE);
   }
@@ -1395,8 +1393,12 @@ handle_sourcestats(CMD_Request *rx_message, CMD_Reply *tx_message)
 {
   int status;
   RPT_SourcestatsReport report;
+  struct timeval now_corr;
+  double local_clock_err;
+
+  LCL_ReadCookedTime(&now_corr, &local_clock_err);
   status = SRC_ReportSourcestats(ntohl(rx_message->data.sourcestats.index),
-                                 &report);
+                                 &report, &now_corr);
 
   if (status) {
     tx_message->status = htons(STT_SUCCESS);
@@ -1409,6 +1411,8 @@ handle_sourcestats(CMD_Request *rx_message, CMD_Reply *tx_message)
     tx_message->data.sourcestats.resid_freq_ppm = UTI_FloatHostToNetwork(report.resid_freq_ppm);
     tx_message->data.sourcestats.skew_ppm = UTI_FloatHostToNetwork(report.skew_ppm);
     tx_message->data.sourcestats.sd = UTI_FloatHostToNetwork(report.sd);
+    tx_message->data.sourcestats.est_offset = UTI_FloatHostToNetwork(report.est_offset);
+    tx_message->data.sourcestats.est_offset_err = UTI_FloatHostToNetwork(report.est_offset_err);
   } else {
     tx_message->status = htons(STT_NOSUCHSOURCE);
   }
index 78e2d1045e6460d2ccf21125a8dc016f07c2d078..e2f16822ba246945278d849d9c73671d119c20a3 100644 (file)
--- a/reports.h
+++ b/reports.h
@@ -47,8 +47,6 @@ typedef struct {
   double orig_latest_meas; /* seconds */
   double latest_meas; /* seconds */
   double latest_meas_err; /* seconds */
-  double est_offset; /* seconds */
-  double est_offset_err; /* seconds */
 } RPT_SourceReport ;
 
 typedef struct {
@@ -73,6 +71,8 @@ typedef struct {
   double resid_freq_ppm;
   double skew_ppm;
   double sd;
+  double est_offset;
+  double est_offset_err;
 } RPT_SourcestatsReport;
 
 typedef struct {
index d898b89e02833666a9cd0600e61d2862b6ab63bf..03b6fb68fb4266c2fbe30eadb9c4e176165dac86 100644 (file)
--- a/sources.c
+++ b/sources.c
@@ -956,7 +956,7 @@ SRC_ReportSource(int index, RPT_SourceReport *report, struct timeval *now)
 /* ================================================== */
 
 int
-SRC_ReportSourcestats(int index, RPT_SourcestatsReport *report)
+SRC_ReportSourcestats(int index, RPT_SourcestatsReport *report, struct timeval *now)
 { 
   SRC_Instance src;
 
@@ -969,7 +969,7 @@ SRC_ReportSourcestats(int index, RPT_SourcestatsReport *report)
       report->ip_addr = *src->ip_addr;
     else
       report->ip_addr.family = IPADDR_UNSPEC; 
-    SST_DoSourcestatsReport(src->stats, report);
+    SST_DoSourcestatsReport(src->stats, report, now);
     return 1;
   }
 }
index 54d86eaf4ca1ef1a79384994eed8daffd8d4a62f..c1cfffca7fa23145429c086fe769f3cfeb1c53e7 100644 (file)
--- a/sources.h
+++ b/sources.h
@@ -146,7 +146,7 @@ extern int SRC_IsSyncPeer(SRC_Instance inst);
 extern int SRC_ReadNumberOfSources(void);
 extern int SRC_ReportSource(int index, RPT_SourceReport *report, struct timeval *now);
 
-extern int SRC_ReportSourcestats(int index, RPT_SourcestatsReport *report);
+extern int SRC_ReportSourcestats(int index, RPT_SourcestatsReport *report, struct timeval *now);
 
 extern SRC_Type SRC_GetType(int index);
 
index 196c5d9eb9cd4bf3356dae7d677f2fb0528c3ac2..3dc61e0f44fd93d992fa1094f8750b02bda4fc90 100644 (file)
@@ -845,8 +845,7 @@ SST_LoadFromFile(SST_Stats inst, FILE *in)
 void
 SST_DoSourceReport(SST_Stats inst, RPT_SourceReport *report, struct timeval *now)
 {
-  int n, nb;
-  double elapsed, sample_elapsed;
+  int n;
   struct timeval ago;
 
   if (inst->n_samples > 0) {
@@ -858,27 +857,12 @@ SST_DoSourceReport(SST_Stats inst, RPT_SourceReport *report, struct timeval *now
 
     UTI_DiffTimevals(&ago, now, &inst->sample_times[n]);
     report->latest_meas_ago = ago.tv_sec;
-
-    if (inst->n_samples > 3) {
-      UTI_DiffTimevalsToDouble(&elapsed, now, &inst->offset_time);
-      nb = inst->best_single_sample;
-      UTI_DiffTimevalsToDouble(&sample_elapsed, now, &(inst->sample_times[nb]));
-      report->est_offset = inst->estimated_offset + elapsed * inst->estimated_frequency;
-      report->est_offset_err = (inst->estimated_offset_sd +
-                 sample_elapsed * inst->skew +
-                 (0.5*inst->root_delays[nb] + inst->root_dispersions[nb]));
-    } else {
-      report->est_offset = report->latest_meas;
-      report->est_offset_err = report->latest_meas_err;
-    }
   } else {
     report->latest_meas_ago = 86400 * 365 * 10;
     report->orig_latest_meas = 0;
     report->latest_meas = 0;
     report->latest_meas_err = 0;
     report->stratum = 0;
-    report->est_offset = 0;
-    report->est_offset_err = 0;
   }
 }
 
@@ -893,10 +877,11 @@ SST_Skew_Direction SST_LastSkewChange(SST_Stats inst)
 /* ================================================== */
 
 void
-SST_DoSourcestatsReport(SST_Stats inst, RPT_SourcestatsReport *report)
+SST_DoSourcestatsReport(SST_Stats inst, RPT_SourcestatsReport *report, struct timeval *now)
 {
   double dspan;
-  int n;
+  double elapsed, sample_elapsed;
+  int n, nb;
 
   report->n_samples = inst->n_samples;
   report->n_runs = inst->nruns;
@@ -905,8 +890,23 @@ SST_DoSourcestatsReport(SST_Stats inst, RPT_SourcestatsReport *report)
     n = inst->n_samples - 1;
     UTI_DiffTimevalsToDouble(&dspan, &inst->sample_times[n], &inst->sample_times[0]);
     report->span_seconds = (unsigned long) (dspan + 0.5);
+
+    if (inst->n_samples > 3) {
+      UTI_DiffTimevalsToDouble(&elapsed, now, &inst->offset_time);
+      nb = inst->best_single_sample;
+      UTI_DiffTimevalsToDouble(&sample_elapsed, now, &(inst->sample_times[nb]));
+      report->est_offset = inst->estimated_offset + elapsed * inst->estimated_frequency;
+      report->est_offset_err = (inst->estimated_offset_sd +
+                 sample_elapsed * inst->skew +
+                 (0.5*inst->root_delays[nb] + inst->root_dispersions[nb]));
+    } else {
+      report->est_offset = inst->offsets[n];
+      report->est_offset_err = 0.5*inst->root_delays[n] + inst->root_dispersions[n];
+    }
   } else {
     report->span_seconds = 0;
+    report->est_offset = 0;
+    report->est_offset_err = 0;
   }
 
   report->resid_freq_ppm = 1.0e6 * inst->estimated_frequency;
index 6baf5b653488797148eaa3692a9771baa143d2c7..0a5a82b402a536853aead95f0067c71b3bf09efd 100644 (file)
@@ -140,7 +140,7 @@ extern int SST_LoadFromFile(SST_Stats inst, FILE *in);
 
 extern void SST_DoSourceReport(SST_Stats inst, RPT_SourceReport *report, struct timeval *now);
 
-extern void SST_DoSourcestatsReport(SST_Stats inst, RPT_SourcestatsReport *report);
+extern void SST_DoSourcestatsReport(SST_Stats inst, RPT_SourcestatsReport *report, struct timeval *now);
 
 typedef enum {
   SST_Skew_Decrease,