Browse Source

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@
OPENBSD_3_6
alexander 20 years ago
parent
commit
56d2eb7b65
3 changed files with 45 additions and 21 deletions
  1. +27
    -12
      src/usr.sbin/ntpd/ntp.c
  2. +3
    -2
      src/usr.sbin/ntpd/ntpd.h
  3. +15
    -7
      src/usr.sbin/ntpd/server.c

+ 27
- 12
src/usr.sbin/ntpd/ntp.c View File

@ -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 */
}
}

+ 3
- 2
src/usr.sbin/ntpd/ntpd.h View File

@ -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 *);


+ 15
- 7
src/usr.sbin/ntpd/server.c View File

@ -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));
}

Loading…
Cancel
Save