From cce7a5f15e339f1445df92f6e7e49c8b1e5fb3f6 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Tue, 4 Jun 2013 19:20:37 +0200 Subject: [PATCH] Improve peer polling in symmetric mode If the remote stratum is higher than ours, try to lock on the peer's polling to minimize our response time by slightly extending our delay or waiting for the peer to catch up with us as the random part in the actual interval is reduced. If the remote stratum is equal to ours, try to interleave evenly with the peer. --- ntp_core.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/ntp_core.c b/ntp_core.c index b61b9e3..96441a2 100644 --- a/ntp_core.c +++ b/ntp_core.c @@ -84,6 +84,8 @@ struct NCR_Instance_Record { int local_poll; /* Log2 of polling interval at our end */ int remote_poll; /* Log2 of server/peer's polling interval (recovered from received packets) */ + int remote_stratum; /* Stratum of the server/peer (recovered from + received packets) */ int presend_minpoll; /* If the current polling interval is at least this, an echo datagram @@ -178,6 +180,9 @@ struct NCR_Instance_Record { /* Randomness added to spacing between samples for one server/peer */ #define SAMPLING_RANDOMNESS 0.02 +/* Adjustment of the peer polling interval */ +#define PEER_SAMPLING_ADJ 1.1 + /* Spacing between samples in burst mode for one server/peer */ #define BURST_INTERVAL 2.0 @@ -331,6 +336,7 @@ NCR_GetInstance(NTP_Remote_Address *remote_addr, NTP_Source_Type type, SourcePar result->local_poll = params->minpoll; result->remote_poll = 0; + result->remote_stratum = 0; /* Create a source instance for this NTP source */ result->source = SRC_CreateNewInstance(UTI_IPToRefid(&remote_addr->ip_addr), SRC_NTP, params->sel_option, &result->remote_addr.ip_addr); @@ -441,7 +447,7 @@ get_poll_adj(NCR_Instance inst, double error_in_estimate, double peer_distance) static double get_transmit_delay(NCR_Instance inst, int on_tx, double last_tx) { - int poll_to_use; + int poll_to_use, stratum_diff; double delay_time; /* If we're in burst mode, queue for immediate dispatch. @@ -488,6 +494,18 @@ get_transmit_delay(NCR_Instance inst, int on_tx, double last_tx) delay_time = (double) (1UL<remote_stratum - REF_GetOurStratum(); + if ((stratum_diff > 0 && last_tx * PEER_SAMPLING_ADJ < delay_time) || + (!on_tx && !stratum_diff && + last_tx / delay_time > PEER_SAMPLING_ADJ - 0.5)) + delay_time *= PEER_SAMPLING_ADJ; + + /* Substract the already spend time */ if (last_tx > 0.0) delay_time -= last_tx; if (delay_time < 0.0) @@ -1116,6 +1134,7 @@ receive_packet(NTP_Packet *message, struct timeval *now, double now_err, NCR_Ins if (valid_header && valid_data) { inst->remote_poll = message->poll; + inst->remote_stratum = message->stratum; inst->tx_count = 0; SRC_UpdateReachability(inst->source, 1);