Browse Source

use __packed structs for the on-the-wire packets and just memcpy at once

instead of kind-of manual copyin/out. increases accuracy in server mode.
collecting dust in my tree for some time, result of a conversation with
somebody i really want to give credit to, but I can't find the mails now :(
okey dokey sez theo
OPENBSD_4_2
henning 17 years ago
parent
commit
f9096ad09f
2 changed files with 13 additions and 47 deletions
  1. +2
    -4
      src/usr.sbin/ntpd/ntp.h
  2. +11
    -43
      src/usr.sbin/ntpd/ntp_msg.c

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

@ -1,4 +1,4 @@
/* $OpenBSD: ntp.h,v 1.11 2004/12/13 12:22:52 dtucker Exp $ */
/* $OpenBSD: ntp.h,v 1.12 2007/05/26 21:20:35 henning Exp $ */
/*
* Copyright (c) 2004 Henning Brauer <henning@openbsd.org>
@ -105,9 +105,7 @@ struct ntp_msg {
struct l_fixedpt orgtime;
struct l_fixedpt rectime;
struct l_fixedpt xmttime;
u_int32_t keyid;
u_int8_t digest[NTP_DIGESTSIZE];
};
} __packed;
struct ntp_query {
int fd;


+ 11
- 43
src/usr.sbin/ntpd/ntp_msg.c View File

@ -1,4 +1,4 @@
/* $OpenBSD: ntp_msg.c,v 1.16 2006/07/01 18:52:46 otto Exp $ */
/* $OpenBSD: ntp_msg.c,v 1.17 2007/05/26 21:20:35 henning Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -34,25 +34,7 @@ ntp_getmsg(struct sockaddr *sa, char *p, ssize_t len, struct ntp_msg *msg)
return (-1);
}
#define copyin(f,p) memcpy(&(f), (p), sizeof(f)); (p) += sizeof(f)
copyin(msg->status, p);
copyin(msg->stratum, p);
copyin(msg->ppoll, p);
copyin(msg->precision, p);
copyin(msg->rootdelay.int_parts, p);
copyin(msg->rootdelay.fractions, p);
copyin(msg->dispersion.int_parts, p);
copyin(msg->dispersion.fractions, p);
copyin(msg->refid, p);
copyin(msg->reftime.int_partl, p);
copyin(msg->reftime.fractionl, p);
copyin(msg->orgtime.int_partl, p);
copyin(msg->orgtime.fractionl, p);
copyin(msg->rectime.int_partl, p);
copyin(msg->rectime.fractionl, p);
copyin(msg->xmttime.int_partl, p);
copyin(msg->xmttime.fractionl, p);
memcpy(msg, p, sizeof(*msg));
return (0);
}
@ -61,36 +43,16 @@ int
ntp_sendmsg(int fd, struct sockaddr *sa, struct ntp_msg *msg, ssize_t len,
int auth)
{
char buf[NTP_MSGSIZE];
char *p = buf;
socklen_t sa_len;
#define copyout(p,f) memcpy((p), &(f), sizeof(f)); p += sizeof(f)
copyout(p, msg->status);
copyout(p, msg->stratum);
copyout(p, msg->ppoll);
copyout(p, msg->precision);
copyout(p, msg->rootdelay.int_parts);
copyout(p, msg->rootdelay.fractions);
copyout(p, msg->dispersion.int_parts);
copyout(p, msg->dispersion.fractions);
copyout(p, msg->refid);
copyout(p, msg->reftime.int_partl);
copyout(p, msg->reftime.fractionl);
copyout(p, msg->orgtime.int_partl);
copyout(p, msg->orgtime.fractionl);
copyout(p, msg->rectime.int_partl);
copyout(p, msg->rectime.fractionl);
copyout(p, msg->xmttime.int_partl);
copyout(p, msg->xmttime.fractionl);
ssize_t n;
if (sa != NULL)
sa_len = SA_LEN(sa);
else
sa_len = 0;
if (sendto(fd, &buf, len, 0, sa, sa_len) != len) {
n = sendto(fd, msg, sizeof(*msg), 0, sa, sa_len);
if (n == -1) {
if (errno == ENOBUFS || errno == EHOSTUNREACH ||
errno == ENETDOWN || errno == EHOSTDOWN) {
/* logging is futile */
@ -100,5 +62,11 @@ ntp_sendmsg(int fd, struct sockaddr *sa, struct ntp_msg *msg, ssize_t len,
return (-1);
}
if (n != sizeof(*msg)) {
log_warnx("ntp_sendmsg: only %ld of %ld bytes sent", n,
sizeof(*msg));
return (-1);
}
return (0);
}

Loading…
Cancel
Save