From bba29a0ee78e6033e886c37af577776156a920af Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Thu, 23 Aug 2018 14:19:16 +0200 Subject: [PATCH] samplefilt: check for non-increasing sample times Adopt the check from the refclock code to check also samples from NTP. --- refclock.c | 19 ++++++++++--------- samplefilt.c | 24 +++++++++++++++++++++++- samplefilt.h | 2 +- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/refclock.c b/refclock.c index 45fb3ab..66224d5 100644 --- a/refclock.c +++ b/refclock.c @@ -372,7 +372,7 @@ convert_tai_offset(struct timespec *sample_time, double *offset) return 1; } -static void +static int accumulate_sample(RCL_Instance instance, struct timespec *sample_time, double offset, double dispersion) { NTP_Sample sample; @@ -391,7 +391,7 @@ accumulate_sample(RCL_Instance instance, struct timespec *sample_time, double of else sample.stratum = instance->stratum; - SPF_AccumulateSample(instance->filter, &sample); + return SPF_AccumulateSample(instance->filter, &sample); } int @@ -428,7 +428,10 @@ RCL_AddSample(RCL_Instance instance, struct timespec *sample_time, double offset 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); @@ -570,7 +573,9 @@ RCL_AddCookedPulse(RCL_Instance instance, struct timespec *cooked_time, 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; @@ -599,17 +604,13 @@ RCL_GetDriverPoll(RCL_Instance instance) 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); diff --git a/samplefilt.c b/samplefilt.c index af0b34c..7226963 100644 --- a/samplefilt.c +++ b/samplefilt.c @@ -102,9 +102,30 @@ SPF_DestroyInstance(SPF_Instance filter) /* ================================================== */ -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; @@ -116,6 +137,7 @@ SPF_AccumulateSample(SPF_Instance filter, NTP_Sample *sample) 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; } /* ================================================== */ diff --git a/samplefilt.h b/samplefilt.h index 03eb939..3b4350a 100644 --- a/samplefilt.h +++ b/samplefilt.h @@ -36,7 +36,7 @@ extern SPF_Instance SPF_CreateInstance(int min_samples, int max_samples, 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);