diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-08-03 11:03:55 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-08-03 11:14:22 +0200 |
commit | 9b1c8bf89be668a533505e5fb4405bac6eed651c (patch) | |
tree | 53255856b64fae3c5001426c42655bb93dd7e2c9 | |
parent | a380aacca61271e24656df237d73fb9930702ff1 (diff) | |
download | busybox-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.c | 31 |
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, |