aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-08-03 11:03:55 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2018-08-03 11:14:22 +0200
commit9b1c8bf89be668a533505e5fb4405bac6eed651c (patch)
tree53255856b64fae3c5001426c42655bb93dd7e2c9
parenta380aacca61271e24656df237d73fb9930702ff1 (diff)
downloadbusybox-w32-9b1c8bf89be668a533505e5fb4405bac6eed651c.tar.gz
busybox-w32-9b1c8bf89be668a533505e5fb4405bac6eed651c.tar.bz2
busybox-w32-9b1c8bf89be668a533505e5fb4405bac6eed651c.zip
ntpd: show real, unclamped delays on low-latency networks
On fast network, I've seen "delay:0.002000" shown for all packets, thus completely losing information on what real delays are. The new code is careful to not reject packets with tiny delays if the delay "grows a lot" but is still tiny: 0.000009 is "much larger" than 0.000001 (nine times larger), but is still very good small delay. function old new delta recv_and_process_peer_pkt 863 889 +26 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--networking/ntpd.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/networking/ntpd.c b/networking/ntpd.c
index 7462113ce..991c518f6 100644
--- a/networking/ntpd.c
+++ b/networking/ntpd.c
@@ -150,7 +150,7 @@
150 150
151#define INITIAL_SAMPLES 4 /* how many samples do we want for init */ 151#define INITIAL_SAMPLES 4 /* how many samples do we want for init */
152#define MIN_FREQHOLD 12 /* adjust offset, but not freq in this many first adjustments */ 152#define MIN_FREQHOLD 12 /* adjust offset, but not freq in this many first adjustments */
153#define BAD_DELAY_GROWTH 4 /* drop packet if its delay grew by more than this */ 153#define BAD_DELAY_GROWTH 4 /* drop packet if its delay grew by more than this factor */
154 154
155#define RETRY_INTERVAL 32 /* on send/recv error, retry in N secs (need to be power of 2) */ 155#define RETRY_INTERVAL 32 /* on send/recv error, retry in N secs (need to be power of 2) */
156#define NOREPLY_INTERVAL 512 /* sent, but got no reply: cap next query by this many seconds */ 156#define NOREPLY_INTERVAL 512 /* sent, but got no reply: cap next query by this many seconds */
@@ -1819,7 +1819,7 @@ update_local_clock(peer_t *p)
1819 VERB2 bb_error_msg("update from:%s offset:%+f delay:%f jitter:%f clock drift:%+.3fppm tc:%d", 1819 VERB2 bb_error_msg("update from:%s offset:%+f delay:%f jitter:%f clock drift:%+.3fppm tc:%d",
1820 p->p_dotted, 1820 p->p_dotted,
1821 offset, 1821 offset,
1822 p->lastpkt_delay, 1822 p->p_raw_delay,
1823 G.discipline_jitter, 1823 G.discipline_jitter,
1824 (double)tmx.freq / 65536, 1824 (double)tmx.freq / 65536,
1825 (int)tmx.constant 1825 (int)tmx.constant
@@ -1976,27 +1976,30 @@ recv_and_process_peer_pkt(peer_t *p)
1976 T2 = lfp_to_d(msg.m_rectime); 1976 T2 = lfp_to_d(msg.m_rectime);
1977 T3 = lfp_to_d(msg.m_xmttime); 1977 T3 = lfp_to_d(msg.m_xmttime);
1978 T4 = G.cur_time; 1978 T4 = G.cur_time;
1979
1980 /* The delay calculation is a special case. In cases where the
1981 * server and client clocks are running at different rates and
1982 * with very fast networks, the delay can appear negative. In
1983 * order to avoid violating the Principle of Least Astonishment,
1984 * the delay is clamped not less than the system precision.
1985 */
1986 delay = (T4 - T1) - (T3 - T2); 1979 delay = (T4 - T1) - (T3 - T2);
1987 if (delay < G_precision_sec) 1980
1988 delay = G_precision_sec;
1989 /* 1981 /*
1990 * If this packet's delay is much bigger than the last one, 1982 * If this packet's delay is much bigger than the last one,
1991 * it's better to just ignore it than use its much less precise value. 1983 * it's better to just ignore it than use its much less precise value.
1992 */ 1984 */
1993 prev_delay = p->p_raw_delay; 1985 prev_delay = p->p_raw_delay;
1994 p->p_raw_delay = delay; 1986 p->p_raw_delay = (delay < 0 ? 0.0 : delay);
1995 if (p->reachable_bits && delay > prev_delay * BAD_DELAY_GROWTH) { 1987 if (p->reachable_bits
1988 && delay > prev_delay * BAD_DELAY_GROWTH
1989 && delay > 1.0 / (8 * 1024) /* larger than ~0.000122 */
1990 ) {
1996 bb_error_msg("reply from %s: delay %f is too high, ignoring", p->p_dotted, delay); 1991 bb_error_msg("reply from %s: delay %f is too high, ignoring", p->p_dotted, delay);
1997 goto pick_normal_interval; 1992 goto pick_normal_interval;
1998 } 1993 }
1999 1994
1995 /* The delay calculation is a special case. In cases where the
1996 * server and client clocks are running at different rates and
1997 * with very fast networks, the delay can appear negative. In
1998 * order to avoid violating the Principle of Least Astonishment,
1999 * the delay is clamped not less than the system precision.
2000 */
2001 if (delay < G_precision_sec)
2002 delay = G_precision_sec;
2000 p->lastpkt_delay = delay; 2003 p->lastpkt_delay = delay;
2001 p->lastpkt_recv_time = T4; 2004 p->lastpkt_recv_time = T4;
2002 VERB6 bb_error_msg("%s->lastpkt_recv_time=%f", p->p_dotted, p->lastpkt_recv_time); 2005 VERB6 bb_error_msg("%s->lastpkt_recv_time=%f", p->p_dotted, p->lastpkt_recv_time);
@@ -2024,7 +2027,7 @@ recv_and_process_peer_pkt(peer_t *p)
2024 bb_error_msg("reply from %s: offset:%+f delay:%f status:0x%02x strat:%d refid:0x%08x rootdelay:%f reach:0x%02x", 2027 bb_error_msg("reply from %s: offset:%+f delay:%f status:0x%02x strat:%d refid:0x%08x rootdelay:%f reach:0x%02x",
2025 p->p_dotted, 2028 p->p_dotted,
2026 offset, 2029 offset,
2027 p->lastpkt_delay, 2030 p->p_raw_delay,
2028 p->lastpkt_status, 2031 p->lastpkt_status,
2029 p->lastpkt_stratum, 2032 p->lastpkt_stratum,
2030 p->lastpkt_refid, 2033 p->lastpkt_refid,