From 16afa8eb5022792c1b4bf08e3b01095ca5ebd0f5 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Fri, 21 Jul 2017 12:16:21 +0200 Subject: [PATCH] ntp: don't accumulate old samples in interleaved client mode Check how many responses were missing before accumulating a sample using old timestamps to avoid correcting the clock with an offset extrapolated over a long interval. This should be eventually done in sourcestats for all sources. --- ntp_core.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/ntp_core.c b/ntp_core.c index d38c79d7..1c08d281 100644 --- a/ntp_core.c +++ b/ntp_core.c @@ -266,6 +266,10 @@ static ARR_Instance broadcasts; /* Maximum number of missed responses to follow peer's polling interval */ #define MAX_PEER_POLL_TX 8 +/* Maximum number of missed responses to accept samples using old timestamps + in the interleaved client/server mode */ +#define MAX_CLIENT_INTERLEAVED_TX 4 + /* Maximum ratio of local intervals in the timestamp selection of the interleaved mode to prefer a sample using previous timestamps */ #define MAX_INTERLEAVED_L2L_RATIO 0.1 @@ -1498,11 +1502,14 @@ receive_packet(NCR_Instance inst, NTP_Local_Address *local_addr, /* Test A requires that the minimum estimate of the peer delay is not larger than the configured maximum, in client mode that the server - processing time is sane, and in the interleaved symmetric mode that - the delay is not longer than half of the remote polling interval to - detect missed packets */ + processing time is sane, in the interleaved client mode that the + timestamps are not too old, and in the interleaved symmetric mode + that the delay is not longer than half of the remote polling interval + to detect missed packets */ testA = delay - dispersion <= inst->max_delay && precision <= inst->max_delay && - !(inst->mode == MODE_CLIENT && response_time > MAX_SERVER_INTERVAL) && + !(inst->mode == MODE_CLIENT && + (response_time > MAX_SERVER_INTERVAL || + (interleaved_packet && inst->tx_count > MAX_CLIENT_INTERLEAVED_TX + 1))) && !(inst->mode == MODE_ACTIVE && interleaved_packet && delay > UTI_Log2ToDouble(message->poll - 1)); -- 2.47.3