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:
parent
cffc856b50
commit
bba29a0ee7
3 changed files with 34 additions and 11 deletions
19
refclock.c
19
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);
|
||||
|
|
24
samplefilt.c
24
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;
|
||||
}
|
||||
|
||||
/* ================================================== */
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue