diff --git a/src/usr.sbin/ntpd/client.c b/src/usr.sbin/ntpd/client.c index 8b97f9f8..2e300e16 100644 --- a/src/usr.sbin/ntpd/client.c +++ b/src/usr.sbin/ntpd/client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: client.c,v 1.6 2004/07/05 20:41:34 henning Exp $ */ +/* $OpenBSD: client.c,v 1.7 2004/07/05 22:12:53 henning Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -135,14 +135,20 @@ client_dispatch(struct ntp_peer *p) T2 = lfp_to_d(msg.rectime); T3 = lfp_to_d(msg.xmttime); - p->offset = ((T2 - T1) + (T3 - T4)) / 2; - p->delay = (T2 - T1) - (T3 - T4); + p->offset[p->shift] = ((T2 - T1) + (T3 - T4)) / 2; + p->delay[p->shift] = (T2 - T1) - (T3 - T4); p->state = STATE_REPLY_RECEIVED; p->next = time(NULL) + INTERVAL_QUERY; p->deadline = 0; - log_debug("reply received: offset %f delay %f", p->offset, p->delay); + log_debug("reply received: offset %f delay %f", p->offset[p->shift], + p->delay[p->shift]); + + if (++p->shift >= OFFSET_ARRAY_SIZE) { + p->shift = 0; + p->valid = 1; + } return (0); } diff --git a/src/usr.sbin/ntpd/ntp.c b/src/usr.sbin/ntpd/ntp.c index dadc76c2..9f4a980a 100644 --- a/src/usr.sbin/ntpd/ntp.c +++ b/src/usr.sbin/ntpd/ntp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ntp.c,v 1.10 2004/07/05 07:46:16 henning Exp $ */ +/* $OpenBSD: ntp.c,v 1.11 2004/07/05 22:12:53 henning Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -285,21 +285,21 @@ ntp_adjtime(struct ntpd_conf *conf) struct ntp_peer *p; double offset_median = 0; int offset_cnt = 0; + u_int8_t idx; TAILQ_FOREACH(p, &conf->ntp_peers, entry) { - if (p->state == STATE_NONE) + if (!p->valid) continue; - offset_median += p->offset; - offset_cnt++; + for (idx = 0; idx < OFFSET_ARRAY_SIZE; idx++) { + offset_median += p->offset[idx]; + offset_cnt++; + } } offset_median /= offset_cnt; - if (offset_median >= 0.001 || offset_median <= 0.001) { + if (offset_median >= 0.001 || offset_median <= 0.001) imsg_compose(&ibuf_main, IMSG_ADJTIME, 0, &offset_median, sizeof(offset_median)); - TAILQ_FOREACH(p, &conf->ntp_peers, entry) - p->offset = 0; - } } diff --git a/src/usr.sbin/ntpd/ntpd.h b/src/usr.sbin/ntpd/ntpd.h index 4d321821..ea083392 100644 --- a/src/usr.sbin/ntpd/ntpd.h +++ b/src/usr.sbin/ntpd/ntpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ntpd.h,v 1.11 2004/07/05 20:41:35 henning Exp $ */ +/* $OpenBSD: ntpd.h,v 1.12 2004/07/05 22:12:53 henning Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -37,8 +37,9 @@ #define NTPD_OPT_VERBOSE2 0x0002 #define INTERVAL_ADJTIME 120 /* call adjtime every n seconds */ -#define INTERVAL_QUERY 60 /* sync with peers every n seconds */ -#define QUERYTIME_MAX 30 /* single query might take n secs max */ +#define INTERVAL_QUERY 30 /* sync with peers every n seconds */ +#define QUERYTIME_MAX 15 /* single query might take n secs max */ +#define OFFSET_ARRAY_SIZE 8 enum client_state { STATE_NONE, @@ -59,8 +60,10 @@ struct ntp_peer { enum client_state state; time_t next; time_t deadline; - double offset; - double delay; + double offset[OFFSET_ARRAY_SIZE]; + double delay[OFFSET_ARRAY_SIZE]; + u_int8_t shift; + u_int8_t valid; }; struct ntpd_conf {