ntpd: field renames and style fixes, no code changes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2009-12-17 23:29:33 +01:00
parent e99c8d2ef5
commit afa2d33aa4

View File

@ -16,23 +16,23 @@
/* Sync to peers every N secs */
#define INTERVAL_QUERY_NORMAL 30
#define INTERVAL_QUERY_PATHETIC 60
#define INTERVAL_QUERY_AGRESSIVE 5
#define INTERVAL_QUERY_NORMAL 30
#define INTERVAL_QUERY_PATHETIC 60
#define INTERVAL_QUERY_AGRESSIVE 5
/* Bad if *less than* TRUSTLEVEL_BADPEER */
#define TRUSTLEVEL_BADPEER 6
#define TRUSTLEVEL_PATHETIC 2
#define TRUSTLEVEL_AGRESSIVE 8
#define TRUSTLEVEL_MAX 10
#define TRUSTLEVEL_BADPEER 6
#define TRUSTLEVEL_PATHETIC 2
#define TRUSTLEVEL_AGRESSIVE 8
#define TRUSTLEVEL_MAX 10
#define QSCALE_OFF_MIN 0.05
#define QSCALE_OFF_MAX 0.50
#define QSCALE_OFF_MIN 0.05
#define QSCALE_OFF_MAX 0.50
/* Single query might take n secs max */
#define QUERYTIME_MAX 15
#define QUERYTIME_MAX 15
/* Min offset for settime at start. "man ntpd" says it's 128 ms */
#define STEPTIME_MIN_OFFSET 0.128
#define STEPTIME_MIN_OFFSET 0.128
typedef struct {
uint32_t int_partl;
@ -67,58 +67,58 @@ typedef struct {
} ntp_msg_t;
enum {
NTP_VERSION = 4,
NTP_MAXSTRATUM = 15,
NTP_VERSION = 4,
NTP_MAXSTRATUM = 15,
/* Leap Second Codes (high order two bits of m_status) */
LI_NOWARNING = (0 << 6), /* no warning */
LI_PLUSSEC = (1 << 6), /* add a second (61 seconds) */
LI_MINUSSEC = (2 << 6), /* minus a second (59 seconds) */
LI_ALARM = (3 << 6), /* alarm condition */
LI_NOWARNING = (0 << 6), /* no warning */
LI_PLUSSEC = (1 << 6), /* add a second (61 seconds) */
LI_MINUSSEC = (2 << 6), /* minus a second (59 seconds) */
LI_ALARM = (3 << 6), /* alarm condition */
/* Status Masks */
MODE_MASK = (7 << 0),
VERSION_MASK = (7 << 3),
VERSION_SHIFT = 3,
LI_MASK = (3 << 6),
MODE_MASK = (7 << 0),
VERSION_MASK = (7 << 3),
VERSION_SHIFT = 3,
LI_MASK = (3 << 6),
/* Mode values */
MODE_RES0 = 0, /* reserved */
MODE_SYM_ACT = 1, /* symmetric active */
MODE_SYM_PAS = 2, /* symmetric passive */
MODE_CLIENT = 3, /* client */
MODE_SERVER = 4, /* server */
MODE_BROADCAST = 5, /* broadcast */
MODE_RES1 = 6, /* reserved for NTP control message */
MODE_RES2 = 7, /* reserved for private use */
MODE_RES0 = 0, /* reserved */
MODE_SYM_ACT = 1, /* symmetric active */
MODE_SYM_PAS = 2, /* symmetric passive */
MODE_CLIENT = 3, /* client */
MODE_SERVER = 4, /* server */
MODE_BROADCAST = 5, /* broadcast */
MODE_RES1 = 6, /* reserved for NTP control message */
MODE_RES2 = 7, /* reserved for private use */
};
#define OFFSET_1900_1970 2208988800UL /* 1970 - 1900 in seconds */
typedef struct {
double o_offset;
double o_delay;
//UNUSED: double o_error;
time_t o_rcvd;
uint32_t o_refid4;
uint8_t o_leap;
uint8_t o_stratum;
uint8_t o_good;
} ntp_offset_t;
double d_offset;
double d_delay;
//UNUSED: double d_error;
time_t d_rcvd;
uint32_t d_refid4;
uint8_t d_leap;
uint8_t d_stratum;
uint8_t d_good;
} ntp_datapoint_t;
#define OFFSET_ARRAY_SIZE 8
#define NUM_DATAPOINTS 8
typedef struct {
len_and_sockaddr *lsa;
char *dotted;
/* When to send new query (if fd == -1)
* or when receive times out (if fd >= 0): */
time_t next_action_time;
int fd;
uint8_t shift;
uint8_t trustlevel;
ntp_msg_t msg;
double xmttime;
ntp_offset_t update;
ntp_offset_t reply[OFFSET_ARRAY_SIZE];
len_and_sockaddr *p_lsa;
char *p_dotted;
/* When to send new query (if p_fd == -1)
* or when receive times out (if p_fd >= 0): */
time_t next_action_time;
int p_fd;
uint8_t p_datapoint_idx;
uint8_t trustlevel;
ntp_msg_t msg;
double p_xmttime;
ntp_datapoint_t update;
ntp_datapoint_t p_datapoint[NUM_DATAPOINTS];
} ntp_peer_t;
enum {
@ -134,24 +134,24 @@ enum {
struct globals {
double rootdelay;
double reftime;
llist_t *ntp_peers;
double rootdelay;
double reftime;
llist_t *ntp_peers;
#if ENABLE_FEATURE_NTPD_SERVER
int listen_fd;
int listen_fd;
#endif
unsigned verbose;
unsigned peer_cnt;
unsigned scale;
uint32_t refid;
uint32_t refid4;
uint8_t synced;
uint8_t leap;
unsigned verbose;
unsigned peer_cnt;
unsigned scale;
uint32_t refid;
uint32_t refid4;
uint8_t synced;
uint8_t leap;
#define G_precision -6
// int8_t precision;
uint8_t stratum;
uint8_t time_is_stepped;
uint8_t first_adj_done;
// int8_t precision;
uint8_t stratum;
uint8_t time_was_stepped;
uint8_t first_adj_done;
};
#define G (*ptr_to_globals)
@ -171,9 +171,9 @@ add_peers(char *s)
ntp_peer_t *p;
p = xzalloc(sizeof(*p));
p->lsa = xhost2sockaddr(s, 123);
p->dotted = xmalloc_sockaddr2dotted_noport(&p->lsa->u.sa);
p->fd = -1;
p->p_lsa = xhost2sockaddr(s, 123);
p->p_dotted = xmalloc_sockaddr2dotted_noport(&p->p_lsa->u.sa);
p->p_fd = -1;
p->msg.m_status = MODE_CLIENT | (NTP_VERSION << 3);
p->trustlevel = TRUSTLEVEL_PATHETIC;
p->next_action_time = time(NULL); /* = set_next(p, 0); */
@ -292,15 +292,15 @@ send_query_to_peer(ntp_peer_t *p)
// Uncomment this and use strace to see it in action:
#define PROBE_LOCAL_ADDR // { len_and_sockaddr lsa; lsa.len = LSA_SIZEOF_SA; getsockname(p->query.fd, &lsa.u.sa, &lsa.len); }
if (p->fd == -1) {
if (p->p_fd == -1) {
int fd, family;
len_and_sockaddr *local_lsa;
family = p->lsa->u.sa.sa_family;
p->fd = fd = xsocket_type(&local_lsa, family, SOCK_DGRAM);
family = p->p_lsa->u.sa.sa_family;
p->p_fd = fd = xsocket_type(&local_lsa, family, SOCK_DGRAM);
/* local_lsa has "null" address and port 0 now.
* bind() ensures we have a *particular port* selected by kernel
* and remembered in p->fd, thus later recv(p->fd)
* and remembered in p->p_fd, thus later recv(p->p_fd)
* receives only packets sent to this port.
*/
PROBE_LOCAL_ADDR
@ -328,19 +328,19 @@ send_query_to_peer(ntp_peer_t *p)
*/
p->msg.m_xmttime.int_partl = random();
p->msg.m_xmttime.fractionl = random();
p->xmttime = gettime1900d();
p->p_xmttime = gettime1900d();
if (do_sendto(p->fd, /*from:*/ NULL, /*to:*/ &p->lsa->u.sa, /*addrlen:*/ p->lsa->len,
if (do_sendto(p->p_fd, /*from:*/ NULL, /*to:*/ &p->p_lsa->u.sa, /*addrlen:*/ p->p_lsa->len,
&p->msg, NTP_MSGSIZE_NOAUTH) == -1
) {
close(p->fd);
p->fd = -1;
close(p->p_fd);
p->p_fd = -1;
set_next(p, INTERVAL_QUERY_PATHETIC);
return -1;
}
if (G.verbose)
bb_error_msg("sent query to %s", p->dotted);
bb_error_msg("sent query to %s", p->p_dotted);
set_next(p, QUERYTIME_MAX);
return 0;
@ -357,9 +357,9 @@ step_time_once(double offset)
char buf[80];
time_t tval;
if (G.time_is_stepped)
if (G.time_was_stepped)
goto bail;
G.time_is_stepped = 1;
G.time_was_stepped = 1;
/* if the offset is small, don't step, slew (later) */
if (offset < STEPTIME_MIN_OFFSET && offset > -STEPTIME_MIN_OFFSET)
@ -397,9 +397,9 @@ compare_offsets(const void *aa, const void *bb)
{
const ntp_peer_t *const *a = aa;
const ntp_peer_t *const *b = bb;
if ((*a)->update.o_offset < (*b)->update.o_offset)
if ((*a)->update.d_offset < (*b)->update.d_offset)
return -1;
return ((*a)->update.o_offset > (*b)->update.o_offset);
return ((*a)->update.d_offset > (*b)->update.d_offset);
}
static unsigned
updated_scale(double offset)
@ -428,7 +428,7 @@ slew_time(void)
ntp_peer_t *p = (ntp_peer_t *) item->data;
if (p->trustlevel < TRUSTLEVEL_BADPEER)
continue;
if (!p->update.o_good) {
if (!p->update.d_good) {
free(peers);
return;
}
@ -444,22 +444,22 @@ slew_time(void)
middle = goodpeer_cnt / 2;
if (middle != 0 && (goodpeer_cnt & 1) == 0) {
offset_median = (peers[middle-1]->update.o_offset + peers[middle]->update.o_offset) / 2;
G.rootdelay = (peers[middle-1]->update.o_delay + peers[middle]->update.o_delay) / 2;
G.stratum = 1 + MAX(peers[middle-1]->update.o_stratum, peers[middle]->update.o_stratum);
offset_median = (peers[middle-1]->update.d_offset + peers[middle]->update.d_offset) / 2;
G.rootdelay = (peers[middle-1]->update.d_delay + peers[middle]->update.d_delay) / 2;
G.stratum = 1 + MAX(peers[middle-1]->update.d_stratum, peers[middle]->update.d_stratum);
} else {
offset_median = peers[middle]->update.o_offset;
G.rootdelay = peers[middle]->update.o_delay;
G.stratum = 1 + peers[middle]->update.o_stratum;
offset_median = peers[middle]->update.d_offset;
G.rootdelay = peers[middle]->update.d_delay;
G.stratum = 1 + peers[middle]->update.d_stratum;
}
G.leap = peers[middle]->update.o_leap;
G.refid4 = peers[middle]->update.o_refid4;
G.leap = peers[middle]->update.d_leap;
G.refid4 = peers[middle]->update.d_refid4;
G.refid =
#if ENABLE_FEATURE_IPV6
peers[middle]->lsa->u.sa.sa_family != AF_INET ?
peers[middle]->p_lsa->u.sa.sa_family != AF_INET ?
G.refid4 :
#endif
peers[middle]->lsa->u.sin.sin_addr.s_addr;
peers[middle]->p_lsa->u.sin.sin_addr.s_addr;
free(peers);
}
//TODO: if (offset_median > BIG) step_time(offset_median)?
@ -490,7 +490,7 @@ slew_time(void)
clear_good:
for (item = G.ntp_peers; item != NULL; item = item->link) {
ntp_peer_t *p = (ntp_peer_t *) item->data;
p->update.o_good = 0;
p->update.d_good = 0;
}
}
@ -498,7 +498,7 @@ static void
update_peer_data(ntp_peer_t *p)
{
/* Clock filter.
* Find the offset which arrived with the lowest delay.
* Find the datapoint with the lowest delay.
* Use that as the peer update.
* Invalidate it and all older ones.
*/
@ -506,23 +506,23 @@ update_peer_data(ntp_peer_t *p)
int best = -1;
int good = 0;
for (i = 0; i < OFFSET_ARRAY_SIZE; i++) {
if (p->reply[i].o_good) {
for (i = 0; i < NUM_DATAPOINTS; i++) {
if (p->p_datapoint[i].d_good) {
good++;
if (best < 0 || p->reply[i].o_delay < p->reply[best].o_delay)
if (best < 0 || p->p_datapoint[i].d_delay < p->p_datapoint[best].d_delay)
best = i;
}
}
if (good < 8) //FIXME: was it meant to be OFFSET_ARRAY_SIZE, not 8?
if (good < 8) //FIXME: was it meant to be NUM_DATAPOINTS, not 8?
return;
memcpy(&p->update, &p->reply[best], sizeof(p->update));
memcpy(&p->update, &p->p_datapoint[best], sizeof(p->update));
slew_time();
for (i = 0; i < OFFSET_ARRAY_SIZE; i++)
if (p->reply[i].o_rcvd <= p->reply[best].o_rcvd)
p->reply[i].o_good = 0;
for (i = 0; i < NUM_DATAPOINTS; i++)
if (p->p_datapoint[i].d_rcvd <= p->p_datapoint[best].d_rcvd)
p->p_datapoint[i].d_good = 0;
}
static unsigned
@ -536,19 +536,19 @@ scale_interval(unsigned requested)
static void
recv_and_process_peer_pkt(ntp_peer_t *p)
{
ssize_t size;
ntp_msg_t msg;
double T1, T2, T3, T4;
unsigned interval;
ntp_offset_t *offset;
ssize_t size;
ntp_msg_t msg;
double T1, T2, T3, T4;
unsigned interval;
ntp_datapoint_t *datapoint;
/* We can recvfrom here and check from.IP, but some multihomed
* ntp servers reply from their *other IP*.
* TODO: maybe we should check at least what we can: from.port == 123?
*/
size = recv(p->fd, &msg, sizeof(msg), MSG_DONTWAIT);
size = recv(p->p_fd, &msg, sizeof(msg), MSG_DONTWAIT);
if (size == -1) {
bb_perror_msg("recv(%s) error", p->dotted);
bb_perror_msg("recv(%s) error", p->p_dotted);
if (errno == EHOSTUNREACH || errno == EHOSTDOWN
|| errno == ENETUNREACH || errno == ENETDOWN
|| errno == ECONNREFUSED || errno == EADDRNOTAVAIL
@ -562,7 +562,7 @@ recv_and_process_peer_pkt(ntp_peer_t *p)
}
if (size != NTP_MSGSIZE_NOAUTH && size != NTP_MSGSIZE) {
bb_error_msg("malformed packet received from %s", p->dotted);
bb_error_msg("malformed packet received from %s", p->p_dotted);
goto bail;
}
@ -580,52 +580,52 @@ recv_and_process_peer_pkt(ntp_peer_t *p)
// "DENY", "RSTR" - peer does not like us at all
// "RATE" - peer is overloaded, reduce polling freq
interval = error_interval();
bb_error_msg("reply from %s: not synced, next query in %us", p->dotted, interval);
bb_error_msg("reply from %s: not synced, next query in %us", p->p_dotted, interval);
goto close_sock;
}
/*
* From RFC 2030 (with a correction to the delay math):
*
* Timestamp Name ID When Generated
* ------------------------------------------------------------
* Originate Timestamp T1 time request sent by client
* Receive Timestamp T2 time request received by server
* Transmit Timestamp T3 time reply sent by server
* Destination Timestamp T4 time reply received by client
* Timestamp Name ID When Generated
* ------------------------------------------------------------
* Originate Timestamp T1 time request sent by client
* Receive Timestamp T2 time request received by server
* Transmit Timestamp T3 time reply sent by server
* Destination Timestamp T4 time reply received by client
*
* The roundtrip delay d and local clock offset t are defined as
* The roundtrip delay and local clock offset are defined as
*
* d = (T4 - T1) - (T3 - T2) t = ((T2 - T1) + (T3 - T4)) / 2.
* delay = (T4 - T1) - (T3 - T2); offset = ((T2 - T1) + (T3 - T4)) / 2
*/
T4 = gettime1900d();
T1 = p->xmttime;
T1 = p->p_xmttime;
T2 = lfp_to_d(msg.m_rectime);
T3 = lfp_to_d(msg.m_xmttime);
offset = &p->reply[p->shift];
datapoint = &p->p_datapoint[p->p_datapoint_idx];
offset->o_offset = ((T2 - T1) + (T3 - T4)) / 2;
offset->o_delay = (T4 - T1) - (T3 - T2);
if (offset->o_delay < 0) {
bb_error_msg("reply from %s: negative delay %f", p->dotted, offset->o_delay);
datapoint->d_offset = ((T2 - T1) + (T3 - T4)) / 2;
datapoint->d_delay = (T4 - T1) - (T3 - T2);
if (datapoint->d_delay < 0) {
bb_error_msg("reply from %s: negative delay %f", p->p_dotted, datapoint->d_delay);
interval = error_interval();
set_next(p, interval);
goto close_sock;
}
//UNUSED: offset->o_error = (T2 - T1) - (T3 - T4);
offset->o_rcvd = (time_t)(T4 - OFFSET_1900_1970); /* = time(NULL); */
offset->o_good = 1;
//UNUSED: datapoint->d_error = (T2 - T1) - (T3 - T4);
datapoint->d_rcvd = (time_t)(T4 - OFFSET_1900_1970); /* = time(NULL); */
datapoint->d_good = 1;
offset->o_leap = (msg.m_status & LI_MASK);
//UNUSED: offset->o_precision = msg.m_precision;
//UNUSED: offset->o_rootdelay = sfp_to_d(msg.m_rootdelay);
//UNUSED: offset->o_rootdispersion = sfp_to_d(msg.m_dispersion);
//UNUSED: offset->o_refid = ntohl(msg.m_refid);
offset->o_refid4 = msg.m_xmttime.fractionl;
//UNUSED: offset->o_reftime = lfp_to_d(msg.m_reftime);
//UNUSED: offset->o_poll = msg.m_ppoll;
offset->o_stratum = msg.m_stratum;
datapoint->d_leap = (msg.m_status & LI_MASK);
//UNUSED: datapoint->o_precision = msg.m_precision;
//UNUSED: datapoint->o_rootdelay = sfp_to_d(msg.m_rootdelay);
//UNUSED: datapoint->o_rootdispersion = sfp_to_d(msg.m_dispersion);
//UNUSED: datapoint->d_refid = ntohl(msg.m_refid);
datapoint->d_refid4 = msg.m_xmttime.fractionl;
//UNUSED: datapoint->o_reftime = lfp_to_d(msg.m_reftime);
//UNUSED: datapoint->o_poll = msg.m_ppoll;
datapoint->d_stratum = msg.m_stratum;
if (p->trustlevel < TRUSTLEVEL_PATHETIC)
interval = scale_interval(INTERVAL_QUERY_PATHETIC);
@ -640,28 +640,28 @@ recv_and_process_peer_pkt(ntp_peer_t *p)
if (p->trustlevel < TRUSTLEVEL_MAX) {
p->trustlevel++;
if (p->trustlevel == TRUSTLEVEL_BADPEER)
bb_error_msg("peer %s now valid", p->dotted);
bb_error_msg("peer %s now valid", p->p_dotted);
}
if (G.verbose)
bb_error_msg("reply from %s: offset %f delay %f, next query in %us", p->dotted,
offset->o_offset, offset->o_delay, interval);
bb_error_msg("reply from %s: offset %f delay %f, next query in %us", p->p_dotted,
datapoint->d_offset, datapoint->d_delay, interval);
update_peer_data(p);
//TODO: do it after all peers had a chance to return at least one reply?
step_time_once(offset->o_offset);
step_time_once(datapoint->d_offset);
p->shift++;
if (p->shift >= OFFSET_ARRAY_SIZE)
p->shift = 0;
p->p_datapoint_idx++;
if (p->p_datapoint_idx >= NUM_DATAPOINTS)
p->p_datapoint_idx = 0;
close_sock:
/* We do not expect any more packets from this peer for now.
* Closing the socket informs kernel about it.
* We open a new socket when we send a new query.
*/
close(p->fd);
p->fd = -1;
close(p->p_fd);
p->p_fd = -1;
bail:
return;
}
@ -840,7 +840,7 @@ static NOINLINE void ntp_init(char **argv)
if (!(opts & (OPT_p|OPT_l)))
bb_show_usage();
if (opts & OPT_x) /* disable stepping, only slew is allowed */
G.time_is_stepped = 1;
G.time_was_stepped = 1;
while (peers)
add_peers(llist_pop(&peers));
if (!(opts & OPT_n)) {
@ -872,7 +872,7 @@ static NOINLINE void ntp_init(char **argv)
clock_getres(CLOCK_REALTIME, &tp);
tp.tv_sec = 0;
tp.tv_nsec = 10000000;
b = 1000000000 / tp.tv_nsec; /* convert to Hz */
b = 1000000000 / tp.tv_nsec; /* convert to Hz */
# else
b = 100; /* b = 1000000000/10000000 = 100 */
# endif
@ -934,22 +934,22 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv)
/* Overflow-safe "if (p->next_action_time <= cur_time) ..." */
if ((int)(cur_time - p->next_action_time) >= 0) {
if (p->fd == -1) {
if (p->p_fd == -1) {
/* Time to send new req */
trial_cnt++;
if (send_query_to_peer(p) == 0)
sent_cnt++;
} else {
/* Timed out waiting for reply */
close(p->fd);
p->fd = -1;
close(p->p_fd);
p->p_fd = -1;
timeout = error_interval();
bb_error_msg("timed out waiting for %s, "
"next query in %us", p->dotted, timeout);
"next query in %us", p->p_dotted, timeout);
if (p->trustlevel >= TRUSTLEVEL_BADPEER) {
p->trustlevel /= 2;
if (p->trustlevel < TRUSTLEVEL_BADPEER)
bb_error_msg("peer %s now invalid", p->dotted);
bb_error_msg("peer %s now invalid", p->p_dotted);
}
set_next(p, timeout);
}
@ -958,9 +958,9 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv)
if (p->next_action_time < nextaction)
nextaction = p->next_action_time;
if (p->fd >= 0) {
if (p->p_fd >= 0) {
/* Wait for reply from this peer */
pfd[i].fd = p->fd;
pfd[i].fd = p->p_fd;
pfd[i].events = POLLIN;
idx2peer[i] = p;
i++;