diff options
author | Alexander Guy <alexander@cvs.openbsd.org> | 2004-07-13 19:41:27 +0000 |
---|---|---|
committer | Alexander Guy <alexander@cvs.openbsd.org> | 2004-07-13 19:41:27 +0000 |
commit | 4ee086ea1118fc386cc2411cd0a809afdb9685bc (patch) | |
tree | 2d2e6a6dcc422eda809536351b54a867e4bb630d /usr.sbin/ntpd | |
parent | 60e25de5e35669e194bf8b9d6f05640140f27e49 (diff) |
Respond to client queries with better server statistics. We now output
a close-to-reality stratum, a real reference time, and a leap indicator
that will indicate if the local clock isn't synchronized.
This also means that until the server feels it's synchronized, it will
tell the clients it isn't. This is normal, and correct.
ok henning@
Diffstat (limited to 'usr.sbin/ntpd')
-rw-r--r-- | usr.sbin/ntpd/ntp.c | 39 | ||||
-rw-r--r-- | usr.sbin/ntpd/ntpd.h | 5 | ||||
-rw-r--r-- | usr.sbin/ntpd/server.c | 22 |
3 files changed, 45 insertions, 21 deletions
diff --git a/usr.sbin/ntpd/ntp.c b/usr.sbin/ntpd/ntp.c index 0a382d726bb..ac537634d88 100644 --- a/usr.sbin/ntpd/ntp.c +++ b/usr.sbin/ntpd/ntp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ntp.c,v 1.22 2004/07/10 18:42:51 henning Exp $ */ +/* $OpenBSD: ntp.c,v 1.23 2004/07/13 19:41:26 alexander Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> @@ -109,6 +109,9 @@ ntp_main(int pipe_prnt[2], struct ntpd_conf *conf) TAILQ_FOREACH(p, &conf->ntp_peers, entry) client_peer_init(p); + bzero(&conf->status, sizeof(conf->status)); + conf->status.leap = LI_ALARM; + log_info("ntp engine ready"); peer_cnt = 0; @@ -223,7 +226,7 @@ ntp_main(int pipe_prnt[2], struct ntpd_conf *conf) for (j = 1; nfds > 0 && j < idx_peers; j++) if (pfd[j].revents & POLLIN) { nfds--; - if (server_dispatch(pfd[j].fd) == -1) + if (server_dispatch(pfd[j].fd, conf) == -1) ntp_quit = 1; } @@ -278,22 +281,34 @@ ntp_adjtime(struct ntpd_conf *conf) { struct ntp_peer *p; double offset_median = 0; - int offset_cnt = 0; + int offset_cnt = 0, stratum = 254; - TAILQ_FOREACH(p, &conf->ntp_peers, entry) - if (p->update.good) { - if (p->update.rcvd + REPLY_MAXAGE < time(NULL)) - p->update.good = 0; - else - if (p->trustlevel >= TRUSTLEVEL_BADPEER) { - offset_median += p->update.offset; - offset_cnt++; - } + TAILQ_FOREACH(p, &conf->ntp_peers, entry) { + if (!p->update.good) + continue; + + if (p->update.rcvd + REPLY_MAXAGE < time(NULL)) { + p->update.good = 0; + continue; } + if (p->trustlevel < TRUSTLEVEL_BADPEER) + continue; + + offset_median += p->update.offset; + offset_cnt++; + + if (p->update.status.stratum < stratum) + stratum = p->update.status.stratum; /* XXX */ + } + if (offset_cnt > 0) { offset_median /= offset_cnt; imsg_compose(&ibuf_main, IMSG_ADJTIME, 0, &offset_median, sizeof(offset_median)); + + conf->status.reftime = gettime(); + conf->status.stratum = stratum + 1; + conf->status.leap = LI_NOWARNING; /* XXX */ } } diff --git a/usr.sbin/ntpd/ntpd.h b/usr.sbin/ntpd/ntpd.h index 452dace9c65..6379d1cd66d 100644 --- a/usr.sbin/ntpd/ntpd.h +++ b/usr.sbin/ntpd/ntpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ntpd.h,v 1.24 2004/07/11 00:15:10 alexander Exp $ */ +/* $OpenBSD: ntpd.h,v 1.25 2004/07/13 19:41:26 alexander Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> @@ -109,6 +109,7 @@ struct ntpd_conf { TAILQ_HEAD(ntp_peers, ntp_peer) ntp_peers; u_int8_t opts; u_int8_t listen_all; + struct ntp_status status; }; struct buf { @@ -211,7 +212,7 @@ int ntp_sendmsg(int, struct sockaddr *, struct ntp_msg *, ssize_t, int); /* server.c */ int setup_listeners(struct servent *, struct ntpd_conf *, u_int *); int ntp_reply(int, struct sockaddr *, struct ntp_msg *, int); -int server_dispatch(int); +int server_dispatch(int, struct ntpd_conf *); /* client.c */ int client_peer_init(struct ntp_peer *); diff --git a/usr.sbin/ntpd/server.c b/usr.sbin/ntpd/server.c index 31a5ad24bc1..cea725918bb 100644 --- a/usr.sbin/ntpd/server.c +++ b/usr.sbin/ntpd/server.c @@ -1,7 +1,8 @@ -/* $OpenBSD: server.c,v 1.9 2004/07/13 17:27:57 alexander Exp $ */ +/* $OpenBSD: server.c,v 1.10 2004/07/13 19:41:26 alexander Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> + * Copyright (c) 2004 Alexander Guy <alexander@openbsd.org> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -92,9 +93,10 @@ setup_listeners(struct servent *se, struct ntpd_conf *conf, u_int *cnt) } int -server_dispatch(int fd) +server_dispatch(int fd, struct ntpd_conf *conf) { ssize_t size; + u_int8_t version; double rectime; struct sockaddr_storage fsa; socklen_t fsa_len; @@ -111,21 +113,27 @@ server_dispatch(int fd) if (ntp_getmsg(buf, size, &query) == -1) return (0); + version = (query.status & VERSIONMASK) >> 3; + bzero(&reply, sizeof(reply)); - reply.status = 0 | (query.status & VERSIONMASK); + reply.status = conf->status.leap | (query.status & VERSIONMASK); if ((query.status & MODEMASK) == MODE_CLIENT) reply.status |= MODE_SERVER; else reply.status |= MODE_SYM_PAS; - reply.stratum = 2; /* XXX */ + reply.stratum = conf->status.stratum; reply.ppoll = query.ppoll; - reply.precision = 0; /* XXX */ + reply.precision = conf->status.precision; reply.rectime = d_to_lfp(rectime); - reply.reftime = reply.rectime; /* XXX */ + reply.reftime = d_to_lfp(conf->status.reftime); reply.xmttime = d_to_lfp(gettime()); reply.orgtime = query.xmttime; - reply.refid = reply.xmttime.fraction; /* XXX */ + + if (version > 3) + reply.refid = reply.xmttime.fraction; + else + reply.refid = 0; /* XXX */ return (ntp_sendmsg(fd, (struct sockaddr *)&fsa, &reply, size, 0)); } |