From 2d2642bb8289293832ff585b83ddde6d05f2967d Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Tue, 21 Nov 2023 07:51:37 +0100 Subject: [PATCH] ntp: fix presend in interleaved mode The presend option in interleaved mode uses two presend requests instead of one to get an interleaved response from servers like chrony which delay the first interleaved response due to an optimization saving timestamps only for clients actually using the interleaved mode. After commit 0ae6f2485b97 ("ntp: don't use first response in interleaved mode") the first interleaved response following the two presend responses in basic mode is dropped as the preferred set of timestamps minimizing error in delay was already used by the second sample in basic mode. There are only three responses in the burst and no sample is accumulated. Increasing the number of presend requests to three to get a fourth sample would be wasteful. Instead, allow reusing timestamps of the second presend sample in basic mode, which is never accumulated. Reported-by: Aaron Thompson Fixes: 0ae6f2485b97 ("ntp: don't use first response in interleaved mode") --- ntp_core.c | 2 +- test/simulation/114-presend | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/ntp_core.c b/ntp_core.c index 2b2b78e..3b21f36 100644 --- a/ntp_core.c +++ b/ntp_core.c @@ -2302,7 +2302,7 @@ process_response(NCR_Instance inst, int saved, NTP_Local_Address *local_addr, inst->local_tx.net_correction = net_correction; /* Don't use the same set of timestamps for the next sample */ - if (interleaved_packet) + if (interleaved_packet || inst->presend_done > 0) inst->prev_local_tx = inst->local_tx; else zero_local_timestamp(&inst->prev_local_tx); diff --git a/test/simulation/114-presend b/test/simulation/114-presend index 19400ab..3b89a70 100755 --- a/test/simulation/114-presend +++ b/test/simulation/114-presend @@ -23,4 +23,29 @@ check_source_selection || test_fail check_packet_interval || test_fail check_sync || test_fail +limit=10 +base_delay=$default_base_delay +client_conf="logdir tmp +log measurements" + +client_server_options="presend 5" + +run_test || test_fail +check_chronyd_exit || test_fail +check_packet_interval || test_fail + +check_file_messages "20.*123\.1.* 111 111 0111" 1 1 measurements.log || test_fail +check_file_messages "20.*123\.1.* 111 111 1111" 1 1 measurements.log || test_fail +rm -f tmp/measurements.log + +client_server_options="presend 5 xleave" + +run_test || test_fail +check_chronyd_exit || test_fail +check_packet_interval || test_fail + +check_file_messages "20.*123\.1.* 111 111 0111" 2 2 measurements.log || test_fail +check_file_messages "20.*123\.1.* 111 111 1111" 1 1 measurements.log || test_fail +rm -f tmp/measurements.log + test_pass