diff options
-rw-r--r-- | networking/ntpd.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/networking/ntpd.c b/networking/ntpd.c index adda6e5b0..2eec99f99 100644 --- a/networking/ntpd.c +++ b/networking/ntpd.c | |||
@@ -252,6 +252,9 @@ typedef struct { | |||
252 | * or when receive times out (if p_fd >= 0): */ | 252 | * or when receive times out (if p_fd >= 0): */ |
253 | double next_action_time; | 253 | double next_action_time; |
254 | double p_xmttime; | 254 | double p_xmttime; |
255 | double p_raw_delay; | ||
256 | /* p_raw_delay is set even by "high delay" packets */ | ||
257 | /* lastpkt_delay isn't */ | ||
255 | double lastpkt_recv_time; | 258 | double lastpkt_recv_time; |
256 | double lastpkt_delay; | 259 | double lastpkt_delay; |
257 | double lastpkt_rootdelay; | 260 | double lastpkt_rootdelay; |
@@ -1685,7 +1688,8 @@ recv_and_process_peer_pkt(peer_t *p) | |||
1685 | ssize_t size; | 1688 | ssize_t size; |
1686 | msg_t msg; | 1689 | msg_t msg; |
1687 | double T1, T2, T3, T4; | 1690 | double T1, T2, T3, T4; |
1688 | double dv, offset; | 1691 | double offset; |
1692 | double prev_delay, delay; | ||
1689 | unsigned interval; | 1693 | unsigned interval; |
1690 | datapoint_t *datapoint; | 1694 | datapoint_t *datapoint; |
1691 | peer_t *q; | 1695 | peer_t *q; |
@@ -1745,12 +1749,6 @@ recv_and_process_peer_pkt(peer_t *p) | |||
1745 | // if (msg.m_rootdelay / 2 + msg.m_rootdisp >= MAXDISP || p->lastpkt_reftime > msg.m_xmt) | 1749 | // if (msg.m_rootdelay / 2 + msg.m_rootdisp >= MAXDISP || p->lastpkt_reftime > msg.m_xmt) |
1746 | // return; /* invalid header values */ | 1750 | // return; /* invalid header values */ |
1747 | 1751 | ||
1748 | p->lastpkt_status = msg.m_status; | ||
1749 | p->lastpkt_stratum = msg.m_stratum; | ||
1750 | p->lastpkt_rootdelay = sfp_to_d(msg.m_rootdelay); | ||
1751 | p->lastpkt_rootdisp = sfp_to_d(msg.m_rootdisp); | ||
1752 | p->lastpkt_refid = msg.m_refid; | ||
1753 | |||
1754 | /* | 1752 | /* |
1755 | * From RFC 2030 (with a correction to the delay math): | 1753 | * From RFC 2030 (with a correction to the delay math): |
1756 | * | 1754 | * |
@@ -1770,28 +1768,35 @@ recv_and_process_peer_pkt(peer_t *p) | |||
1770 | T3 = lfp_to_d(msg.m_xmttime); | 1768 | T3 = lfp_to_d(msg.m_xmttime); |
1771 | T4 = G.cur_time; | 1769 | T4 = G.cur_time; |
1772 | 1770 | ||
1773 | p->lastpkt_recv_time = T4; | ||
1774 | VERB6 bb_error_msg("%s->lastpkt_recv_time=%f", p->p_dotted, p->lastpkt_recv_time); | ||
1775 | |||
1776 | /* The delay calculation is a special case. In cases where the | 1771 | /* The delay calculation is a special case. In cases where the |
1777 | * server and client clocks are running at different rates and | 1772 | * server and client clocks are running at different rates and |
1778 | * with very fast networks, the delay can appear negative. In | 1773 | * with very fast networks, the delay can appear negative. In |
1779 | * order to avoid violating the Principle of Least Astonishment, | 1774 | * order to avoid violating the Principle of Least Astonishment, |
1780 | * the delay is clamped not less than the system precision. | 1775 | * the delay is clamped not less than the system precision. |
1781 | */ | 1776 | */ |
1782 | dv = p->lastpkt_delay; | 1777 | delay = (T4 - T1) - (T3 - T2); |
1783 | p->lastpkt_delay = (T4 - T1) - (T3 - T2); | 1778 | if (delay < G_precision_sec) |
1784 | if (p->lastpkt_delay < G_precision_sec) | 1779 | delay = G_precision_sec; |
1785 | p->lastpkt_delay = G_precision_sec; | ||
1786 | /* | 1780 | /* |
1787 | * If this packet's delay is much bigger than the last one, | 1781 | * If this packet's delay is much bigger than the last one, |
1788 | * it's better to just ignore it than use its much less precise value. | 1782 | * it's better to just ignore it than use its much less precise value. |
1789 | */ | 1783 | */ |
1790 | if (p->reachable_bits && p->lastpkt_delay > dv * BAD_DELAY_GROWTH) { | 1784 | prev_delay = p->p_raw_delay; |
1785 | p->p_raw_delay = delay; | ||
1786 | if (p->reachable_bits && delay > prev_delay * BAD_DELAY_GROWTH) { | ||
1791 | bb_error_msg("reply from %s: delay %f is too high, ignoring", p->p_dotted, p->lastpkt_delay); | 1787 | bb_error_msg("reply from %s: delay %f is too high, ignoring", p->p_dotted, p->lastpkt_delay); |
1792 | goto pick_normal_interval; | 1788 | goto pick_normal_interval; |
1793 | } | 1789 | } |
1794 | 1790 | ||
1791 | p->lastpkt_delay = delay; | ||
1792 | p->lastpkt_recv_time = T4; | ||
1793 | VERB6 bb_error_msg("%s->lastpkt_recv_time=%f", p->p_dotted, p->lastpkt_recv_time); | ||
1794 | p->lastpkt_status = msg.m_status; | ||
1795 | p->lastpkt_stratum = msg.m_stratum; | ||
1796 | p->lastpkt_rootdelay = sfp_to_d(msg.m_rootdelay); | ||
1797 | p->lastpkt_rootdisp = sfp_to_d(msg.m_rootdisp); | ||
1798 | p->lastpkt_refid = msg.m_refid; | ||
1799 | |||
1795 | p->datapoint_idx = p->reachable_bits ? (p->datapoint_idx + 1) % NUM_DATAPOINTS : 0; | 1800 | p->datapoint_idx = p->reachable_bits ? (p->datapoint_idx + 1) % NUM_DATAPOINTS : 0; |
1796 | datapoint = &p->filter_datapoint[p->datapoint_idx]; | 1801 | datapoint = &p->filter_datapoint[p->datapoint_idx]; |
1797 | datapoint->d_recv_time = T4; | 1802 | datapoint->d_recv_time = T4; |