Skip to content
Permalink
Browse files

busybox: ntpd: show real, unclamped delays on low-latency networks (b…

…ackport)

Original commit: 9b1c8bf89be668a533505e5fb4405bac6eed651c
  • Loading branch information...
Denys Vlasenko authored and RMerl committed May 13, 2019
1 parent 72735e2 commit 2091dd648970e9b7922453ce51372b129cc953fa
Showing with 17 additions and 14 deletions.
  1. +17 −14 release/src/router/busybox/networking/ntpd.c
@@ -126,7 +126,7 @@

#define INITIAL_SAMPLES 1 /* how many samples do we want for init */
#define MIN_FREQHOLD 12 /* adjust offset, but not freq in this many first adjustments */
#define BAD_DELAY_GROWTH 4 /* drop packet if its delay grew by more than this */
#define BAD_DELAY_GROWTH 4 /* drop packet if its delay grew by more than this factor */

#define RETRY_INTERVAL 32 /* on send/recv error, retry in N secs (need to be power of 2) */
#define NOREPLY_INTERVAL 512 /* sent, but got no reply: cap next query by this many seconds */
@@ -1800,7 +1800,7 @@ update_local_clock(peer_t *p)
VERB2 bb_error_msg("update from:%s offset:%+f delay:%f jitter:%f clock drift:%+.3fppm tc:%d",
p->p_dotted,
offset,
p->lastpkt_delay,
p->p_raw_delay,
G.discipline_jitter,
(double)tmx.freq / 65536,
(int)tmx.constant
@@ -1958,27 +1958,30 @@ recv_and_process_peer_pkt(peer_t *p)
T2 = lfp_to_d(msg.m_rectime);
T3 = lfp_to_d(msg.m_xmttime);
T4 = G.cur_time;

/* The delay calculation is a special case. In cases where the
* server and client clocks are running at different rates and
* with very fast networks, the delay can appear negative. In
* order to avoid violating the Principle of Least Astonishment,
* the delay is clamped not less than the system precision.
*/
delay = (T4 - T1) - (T3 - T2);
if (delay < G_precision_sec)
delay = G_precision_sec;

/*
* If this packet's delay is much bigger than the last one,
* it's better to just ignore it than use its much less precise value.
*/
prev_delay = p->p_raw_delay;
p->p_raw_delay = delay;
if (p->reachable_bits && delay > prev_delay * BAD_DELAY_GROWTH) {
p->p_raw_delay = (delay < 0 ? 0.0 : delay);
if (p->reachable_bits
&& delay > prev_delay * BAD_DELAY_GROWTH
&& delay > 1.0 / (8 * 1024) /* larger than ~0.000122 */
) {
bb_error_msg("reply from %s: delay %f is too high, ignoring", p->p_dotted, delay);
goto pick_normal_interval;
}

/* The delay calculation is a special case. In cases where the
* server and client clocks are running at different rates and
* with very fast networks, the delay can appear negative. In
* order to avoid violating the Principle of Least Astonishment,
* the delay is clamped not less than the system precision.
*/
if (delay < G_precision_sec)
delay = G_precision_sec;
p->lastpkt_delay = delay;
p->lastpkt_recv_time = T4;
VERB6 bb_error_msg("%s->lastpkt_recv_time=%f", p->p_dotted, p->lastpkt_recv_time);
@@ -2006,7 +2009,7 @@ recv_and_process_peer_pkt(peer_t *p)
bb_error_msg("reply from %s: offset:%+f delay:%f status:0x%02x strat:%d refid:0x%08x rootdelay:%f reach:0x%02x",
p->p_dotted,
offset,
p->lastpkt_delay,
p->p_raw_delay,
p->lastpkt_status,
p->lastpkt_stratum,
p->lastpkt_refid,

0 comments on commit 2091dd6

Please sign in to comment.
You can’t perform that action at this time.