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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
accumulate_sample(RCL_Instance instance, struct timespec *sample_time, double offset, double dispersion)
|
accumulate_sample(RCL_Instance instance, struct timespec *sample_time, double offset, double dispersion)
|
||||||
{
|
{
|
||||||
NTP_Sample sample;
|
NTP_Sample sample;
|
||||||
|
@ -391,7 +391,7 @@ accumulate_sample(RCL_Instance instance, struct timespec *sample_time, double of
|
||||||
else
|
else
|
||||||
sample.stratum = instance->stratum;
|
sample.stratum = instance->stratum;
|
||||||
|
|
||||||
SPF_AccumulateSample(instance->filter, &sample);
|
return SPF_AccumulateSample(instance->filter, &sample);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -428,7 +428,10 @@ RCL_AddSample(RCL_Instance instance, struct timespec *sample_time, double offset
|
||||||
return 0;
|
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;
|
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, dispersion);
|
||||||
|
@ -570,7 +573,9 @@ RCL_AddCookedPulse(RCL_Instance instance, struct timespec *cooked_time,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
accumulate_sample(instance, cooked_time, offset, dispersion);
|
if (!accumulate_sample(instance, cooked_time, offset, dispersion))
|
||||||
|
return 0;
|
||||||
|
|
||||||
instance->leap_status = leap;
|
instance->leap_status = leap;
|
||||||
instance->pps_active = 1;
|
instance->pps_active = 1;
|
||||||
|
|
||||||
|
@ -599,17 +604,13 @@ RCL_GetDriverPoll(RCL_Instance instance)
|
||||||
static int
|
static int
|
||||||
valid_sample_time(RCL_Instance instance, struct timespec *sample_time)
|
valid_sample_time(RCL_Instance instance, struct timespec *sample_time)
|
||||||
{
|
{
|
||||||
NTP_Sample last_sample;
|
|
||||||
struct timespec now;
|
struct timespec now;
|
||||||
double diff;
|
double diff;
|
||||||
|
|
||||||
LCL_ReadCookedTime(&now, NULL);
|
LCL_ReadCookedTime(&now, NULL);
|
||||||
diff = UTI_DiffTimespecsToDouble(&now, sample_time);
|
diff = UTI_DiffTimespecsToDouble(&now, sample_time);
|
||||||
|
|
||||||
if (diff < 0.0 || diff > UTI_Log2ToDouble(instance->poll + 1) ||
|
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)) {
|
|
||||||
DEBUG_LOG("%s refclock sample time %s not valid age=%.6f",
|
DEBUG_LOG("%s refclock sample time %s not valid age=%.6f",
|
||||||
UTI_RefidToString(instance->ref_id),
|
UTI_RefidToString(instance->ref_id),
|
||||||
UTI_TimespecToString(sample_time), diff);
|
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)
|
SPF_AccumulateSample(SPF_Instance filter, NTP_Sample *sample)
|
||||||
{
|
{
|
||||||
|
if (!check_sample(filter, sample))
|
||||||
|
return 0;
|
||||||
|
|
||||||
filter->index++;
|
filter->index++;
|
||||||
filter->index %= filter->max_samples;
|
filter->index %= filter->max_samples;
|
||||||
filter->last = filter->index;
|
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",
|
DEBUG_LOG("filter sample %d t=%s offset=%.9f peer_disp=%.9f",
|
||||||
filter->index, UTI_TimespecToString(&sample->time),
|
filter->index, UTI_TimespecToString(&sample->time),
|
||||||
sample->offset, sample->peer_dispersion);
|
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);
|
double max_dispersion, double combine_ratio);
|
||||||
extern void SPF_DestroyInstance(SPF_Instance filter);
|
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_GetLastSample(SPF_Instance filter, NTP_Sample *sample);
|
||||||
extern int SPF_GetNumberOfSamples(SPF_Instance filter);
|
extern int SPF_GetNumberOfSamples(SPF_Instance filter);
|
||||||
extern double SPF_GetAvgSampleDispersion(SPF_Instance filter);
|
extern double SPF_GetAvgSampleDispersion(SPF_Instance filter);
|
||||||
|
|
Loading…
Reference in a new issue