refclock: restart local mode after losing lock
A refclock in the local mode is locked to itself. When the maxlockage check failed after missing some samples, it failed permanently and the refclock was not able to accumulate any new samples. When the check fails, drop all samples and reset the source to start from scratch. Reported-by: Dan Drown <dan-ntp@drown.org>
This commit is contained in:
parent
a3b376cf0a
commit
8d08486edf
1 changed files with 8 additions and 2 deletions
10
refclock.c
10
refclock.c
|
@ -592,8 +592,14 @@ RCL_AddCookedPulse(RCL_Instance instance, struct timespec *cooked_time,
|
||||||
|
|
||||||
sample_diff = UTI_DiffTimespecsToDouble(cooked_time, &ref_sample.time);
|
sample_diff = UTI_DiffTimespecsToDouble(cooked_time, &ref_sample.time);
|
||||||
if (fabs(sample_diff) >= (double)instance->max_lock_age / rate) {
|
if (fabs(sample_diff) >= (double)instance->max_lock_age / rate) {
|
||||||
DEBUG_LOG("refclock pulse ignored samplediff=%.9f",
|
DEBUG_LOG("refclock pulse ignored samplediff=%.9f", sample_diff);
|
||||||
sample_diff);
|
|
||||||
|
/* Restart the local mode */
|
||||||
|
if (instance->local) {
|
||||||
|
LOG(LOGS_WARN, "Local refclock lost lock");
|
||||||
|
SPF_DropSamples(instance->filter);
|
||||||
|
SRC_ResetInstance(instance->source);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue