[chrony-dev] [PATCH 2/3] refclock: Include TAI offset when adding samples

[ Thread Index | Date Index | More chrony.tuxfamily.org/chrony-dev Archives ]


If the refclock has the "tai" option set, get the current TAI offset and
include it when adding the sample.
---
 refclock.c  | 28 ++++++++++++++++++++++++++--
 reference.c | 11 +++++++++++
 reference.h |  3 +++
 3 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/refclock.c b/refclock.c
index 6ca9118..23dbe18 100644
--- a/refclock.c
+++ b/refclock.c
@@ -76,6 +76,7 @@ struct RCL_Instance_Record {
   int poll;
   int leap_status;
   int pps_forced;
+  int tai;
   int pps_rate;
   int pps_active;
   int max_lock_age;
@@ -189,6 +190,12 @@ RCL_AddRefclock(RefclockParameters *params)
     return 0;
   }
 
+  if (params->tai && !CNF_GetLeapSecTimezone()) {
+    LOG(LOGS_WARN,
+       "Refclock %s configured for auto tai offset, but no leapsectz configured",
+       UTI_RefidToString(params->ref_id));
+  }
+
   inst->data = NULL;
   inst->driver_parameter = params->driver_parameter;
   inst->driver_parameter_length = 0;
@@ -197,6 +204,7 @@ RCL_AddRefclock(RefclockParameters *params)
   inst->driver_polled = 0;
   inst->leap_status = LEAP_Normal;
   inst->pps_forced = params->pps_forced;
+  inst->tai = params->tai;
   inst->pps_rate = params->pps_rate;
   inst->pps_active = 0;
   inst->max_lock_age = params->max_lock_age;
@@ -360,6 +368,7 @@ int
 RCL_AddSample(RCL_Instance instance, struct timespec *sample_time, double offset, int leap)
 {
   double correction, dispersion;
+  int tai_offset;
   struct timespec cooked_time;
 
   if (instance->pps_forced)
@@ -385,10 +394,25 @@ RCL_AddSample(RCL_Instance instance, struct timespec *sample_time, double offset
       return 0;
   }
 
-  filter_add_sample(&instance->filter, &cooked_time, offset - correction + instance->offset, dispersion);
+  if (instance->tai) {
+    tai_offset = REF_GetTaiOffset();
+  } else {
+    tai_offset = 0;
+  }
+
+  filter_add_sample(&instance->filter,
+                    &cooked_time,
+                    offset - correction + instance->offset - tai_offset,
+                    dispersion);
   instance->pps_active = 0;
 
-  log_sample(instance, &cooked_time, 0, 0, offset, offset - correction + instance->offset, dispersion);
+  log_sample(instance,
+             &cooked_time,
+             0,
+             0,
+             offset,
+             offset - correction + instance->offset - tai_offset,
+             dispersion);
 
   /* for logging purposes */
   if (!instance->driver->poll)
diff --git a/reference.c b/reference.c
index 8138b8c..24b8543 100644
--- a/reference.c
+++ b/reference.c
@@ -1355,6 +1355,17 @@ int REF_IsLeapSecondClose(void)
 }
 
 /* ================================================== */
+int REF_GetTaiOffset(void)
+{
+  time_t now;
+  int tai_offset;
+
+  now = time(NULL);
+  get_tz_leap(now, &tai_offset);
+  return tai_offset;
+}
+
+/* ================================================== */
 
 void
 REF_GetTrackingReport(RPT_TrackingReport *rep)
diff --git a/reference.h b/reference.h
index e376770..2311e93 100644
--- a/reference.h
+++ b/reference.h
@@ -184,6 +184,9 @@ extern void REF_DisableLocal(void);
    and is better to discard any measurements */
 extern int REF_IsLeapSecondClose(void);
 
+/* Return the current TAI - UTC offset calculated from timezone files */
+extern int REF_GetTaiOffset(void);
+
 extern void REF_GetTrackingReport(RPT_TrackingReport *rep);
 
 #endif /* GOT_REFERENCE_H */
-- 
2.13.5


-- 
To unsubscribe email chrony-dev-request@xxxxxxxxxxxxxxxxxxxx with "unsubscribe" in the subject.
For help email chrony-dev-request@xxxxxxxxxxxxxxxxxxxx with "help" in the subject.
Trouble?  Email listmaster@xxxxxxxxxxxxxxxxxxxx.


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/