From 24fa8ea878809e8ab1438c52b6be4a98d1f51fed Mon Sep 17 00:00:00 2001 From: otto <> Date: Sun, 4 Jun 2006 18:58:13 +0000 Subject: [PATCH] Only invalidate stored replies if an adjustment was really made. ok henning@ --- src/usr.sbin/ntpd/client.c | 13 ++++---- src/usr.sbin/ntpd/ntp.c | 67 ++++++++++++++++++++------------------ src/usr.sbin/ntpd/ntpd.h | 4 +-- 3 files changed, 43 insertions(+), 41 deletions(-) diff --git a/src/usr.sbin/ntpd/client.c b/src/usr.sbin/ntpd/client.c index e4b2ea14..65fad713 100644 --- a/src/usr.sbin/ntpd/client.c +++ b/src/usr.sbin/ntpd/client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: client.c,v 1.68 2006/05/29 20:51:54 ckuethe Exp $ */ +/* $OpenBSD: client.c,v 1.69 2006/06/04 18:58:13 otto Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -325,12 +325,11 @@ client_update(struct ntp_peer *p) return (-1); memcpy(&p->update, &p->reply[best], sizeof(p->update)); - priv_adjtime(); - - for (i = 0; i < OFFSET_ARRAY_SIZE; i++) - if (p->reply[i].rcvd <= p->reply[best].rcvd) - p->reply[i].good = 0; - + if (priv_adjtime() == 0) { + for (i = 0; i < OFFSET_ARRAY_SIZE; i++) + if (p->reply[i].rcvd <= p->reply[best].rcvd) + p->reply[i].good = 0; + } return (0); } diff --git a/src/usr.sbin/ntpd/ntp.c b/src/usr.sbin/ntpd/ntp.c index 0578d22c..4657f6f0 100644 --- a/src/usr.sbin/ntpd/ntp.c +++ b/src/usr.sbin/ntpd/ntp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ntp.c,v 1.82 2006/06/02 20:45:34 henning Exp $ */ +/* $OpenBSD: ntp.c,v 1.83 2006/06/04 18:58:13 otto Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -422,7 +422,7 @@ peer_remove(struct ntp_peer *p) peer_cnt--; } -void +int priv_adjtime(void) { struct ntp_peer *p; @@ -435,7 +435,7 @@ priv_adjtime(void) if (p->trustlevel < TRUSTLEVEL_BADPEER) continue; if (!p->update.good) - return; + return (1); offset_cnt += p->weight; } @@ -445,6 +445,9 @@ priv_adjtime(void) offset_cnt += s->weight; } + if (offset_cnt == 0) + return (1); + if ((offsets = calloc(offset_cnt, sizeof(struct ntp_offset *))) == NULL) fatal("calloc priv_adjtime"); @@ -464,43 +467,43 @@ priv_adjtime(void) qsort(offsets, offset_cnt, sizeof(struct ntp_offset *), offset_compare); - if (offset_cnt > 0) { - if (offset_cnt > 1 && offset_cnt % 2 == 0) { - offset_median = - (offsets[offset_cnt / 2 - 1]->offset + - offsets[offset_cnt / 2]->offset) / 2; - conf->status.rootdelay = - (offsets[offset_cnt / 2 - 1]->delay + - offsets[offset_cnt / 2]->delay) / 2; - conf->status.stratum = MAX( - offsets[offset_cnt / 2 - 1]->status.stratum, - offsets[offset_cnt / 2]->status.stratum); - } else { - offset_median = offsets[offset_cnt / 2]->offset; - conf->status.rootdelay = - offsets[offset_cnt / 2]->delay; - conf->status.stratum = - offsets[offset_cnt / 2]->status.stratum; - } - conf->status.leap = offsets[offset_cnt / 2]->status.leap; + if (offset_cnt > 1 && offset_cnt % 2 == 0) { + offset_median = + (offsets[offset_cnt / 2 - 1]->offset + + offsets[offset_cnt / 2]->offset) / 2; + conf->status.rootdelay = + (offsets[offset_cnt / 2 - 1]->delay + + offsets[offset_cnt / 2]->delay) / 2; + conf->status.stratum = MAX( + offsets[offset_cnt / 2 - 1]->status.stratum, + offsets[offset_cnt / 2]->status.stratum); + } else { + offset_median = offsets[offset_cnt / 2]->offset; + conf->status.rootdelay = + offsets[offset_cnt / 2]->delay; + conf->status.stratum = + offsets[offset_cnt / 2]->status.stratum; + } + conf->status.leap = offsets[offset_cnt / 2]->status.leap; - imsg_compose(ibuf_main, IMSG_ADJTIME, 0, 0, - &offset_median, sizeof(offset_median)); + imsg_compose(ibuf_main, IMSG_ADJTIME, 0, 0, + &offset_median, sizeof(offset_median)); - conf->status.reftime = gettime(); - conf->status.stratum++; /* one more than selected peer */ - update_scale(offset_median); + conf->status.reftime = gettime(); + conf->status.stratum++; /* one more than selected peer */ + update_scale(offset_median); - conf->status.refid4 = - offsets[offset_cnt / 2]->status.refid4; - conf->status.refid = - offsets[offset_cnt / 2]->status.send_refid; - } + conf->status.refid4 = + offsets[offset_cnt / 2]->status.refid4; + conf->status.refid = + offsets[offset_cnt / 2]->status.send_refid; free(offsets); TAILQ_FOREACH(p, &conf->ntp_peers, entry) p->update.good = 0; + + return (0); } int diff --git a/src/usr.sbin/ntpd/ntpd.h b/src/usr.sbin/ntpd/ntpd.h index 788b3935..ec7c0a7d 100644 --- a/src/usr.sbin/ntpd/ntpd.h +++ b/src/usr.sbin/ntpd/ntpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ntpd.h,v 1.69 2006/05/28 20:39:16 henning Exp $ */ +/* $OpenBSD: ntpd.h,v 1.70 2006/06/04 18:58:13 otto Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -241,7 +241,7 @@ void imsg_free(struct imsg *); /* ntp.c */ pid_t ntp_main(int[2], struct ntpd_conf *); -void priv_adjtime(void); +int priv_adjtime(void); void priv_settime(double); void priv_host_dns(char *, u_int32_t);