samplefilt: check for non-increasing sample times

Adopt the check from the refclock code to check also samples from NTP.
This commit is contained in:
Miroslav Lichvar 2018-08-23 14:19:16 +02:00
parent cffc856b50
commit bba29a0ee7
3 changed files with 34 additions and 11 deletions

View file

@ -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);

View file

@ -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;
}
/* ================================================== */

View file

@ -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);