return 1;
}
-static void
+static int
accumulate_sample(RCL_Instance instance, struct timespec *sample_time, double offset, double dispersion)
{
NTP_Sample sample;
else
sample.stratum = instance->stratum;
- SPF_AccumulateSample(instance->filter, &sample);
+ return SPF_AccumulateSample(instance->filter, &sample);
}
int
return 0;
}
- accumulate_sample(instance, &cooked_time, offset - correction + instance->offset, dispersion);
+ if (!accumulate_sample(instance, &cooked_time,
+ offset - correction + instance->offset, dispersion))
+ return 0;
+
instance->pps_active = 0;
log_sample(instance, &cooked_time, 0, 0, offset, offset - correction + instance->offset, dispersion);
return 0;
}
- accumulate_sample(instance, cooked_time, offset, dispersion);
+ if (!accumulate_sample(instance, cooked_time, offset, dispersion))
+ return 0;
+
instance->leap_status = leap;
instance->pps_active = 1;
static int
valid_sample_time(RCL_Instance instance, struct timespec *sample_time)
{
- NTP_Sample last_sample;
struct timespec now;
double diff;
LCL_ReadCookedTime(&now, NULL);
diff = UTI_DiffTimespecsToDouble(&now, sample_time);
- if (diff < 0.0 || diff > UTI_Log2ToDouble(instance->poll + 1) ||
- (SPF_GetNumberOfSamples(instance->filter) > 0 &&
- SPF_GetLastSample(instance->filter, &last_sample) &&
- UTI_CompareTimespecs(&last_sample.time, sample_time) >= 0)) {
+ if (diff < 0.0 || diff > UTI_Log2ToDouble(instance->poll + 1)) {
DEBUG_LOG("%s refclock sample time %s not valid age=%.6f",
UTI_RefidToString(instance->ref_id),
UTI_TimespecToString(sample_time), diff);
/* ================================================== */
-void
+/* Check that samples times are strictly increasing */
+
+static int
+check_sample(SPF_Instance filter, NTP_Sample *sample)
+{
+ if (filter->used <= 0)
+ return 1;
+
+ if (UTI_CompareTimespecs(&filter->samples[filter->last].time, &sample->time) >= 0) {
+ DEBUG_LOG("filter non-increasing sample time %s", UTI_TimespecToString(&sample->time));
+ return 0;
+ }
+
+ return 1;
+}
+
+/* ================================================== */
+
+int
SPF_AccumulateSample(SPF_Instance filter, NTP_Sample *sample)
{
+ if (!check_sample(filter, sample))
+ return 0;
+
filter->index++;
filter->index %= filter->max_samples;
filter->last = filter->index;
DEBUG_LOG("filter sample %d t=%s offset=%.9f peer_disp=%.9f",
filter->index, UTI_TimespecToString(&sample->time),
sample->offset, sample->peer_dispersion);
+ return 1;
}
/* ================================================== */
double max_dispersion, double combine_ratio);
extern void SPF_DestroyInstance(SPF_Instance filter);
-extern void SPF_AccumulateSample(SPF_Instance filter, NTP_Sample *sample);
+extern int SPF_AccumulateSample(SPF_Instance filter, NTP_Sample *sample);
extern int SPF_GetLastSample(SPF_Instance filter, NTP_Sample *sample);
extern int SPF_GetNumberOfSamples(SPF_Instance filter);
extern double SPF_GetAvgSampleDispersion(SPF_Instance filter);