ntp: add support for SO_TIMESTAMPNS socket option

Enable the SO_TIMESTAMPNS option to get kernel timestamps in nanosecond
resolution.
This commit is contained in:
Miroslav Lichvar 2016-08-18 15:39:14 +02:00
parent 8d89610ff6
commit 7a1ebc3467
2 changed files with 14 additions and 1 deletions

View file

@ -202,6 +202,10 @@ prepare_socket(int family, int port_number, int client_only)
#ifdef SO_TIMESTAMP
/* Enable receiving of timestamp control messages */
#ifdef SO_TIMESTAMPNS
/* Try nanosecond resolution first */
if (setsockopt(sock_fd, SOL_SOCKET, SO_TIMESTAMPNS, (char *)&on_off, sizeof(on_off)) < 0)
#endif
if (setsockopt(sock_fd, SOL_SOCKET, SO_TIMESTAMP, (char *)&on_off, sizeof(on_off)) < 0) {
LOG(LOGS_ERR, LOGF_NtpIO, "Could not set %s socket option", "SO_TIMESTAMP");
/* Don't quit - we might survive anyway */
@ -597,6 +601,15 @@ process_receive(struct msghdr *hdr, int length, int sock_fd)
LCL_CookTime(&ts, &now, &now_err);
}
#endif
#ifdef SO_TIMESTAMPNS
if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SO_TIMESTAMPNS) {
struct timespec ts;
memcpy(&ts, CMSG_DATA(cmsg), sizeof (ts));
LCL_CookTime(&ts, &now, &now_err);
}
#endif
}
DEBUG_LOG(LOGF_NtpIO, "Received %d bytes from %s:%d to %s fd %d",

View file

@ -493,7 +493,7 @@ SYS_Linux_EnableSystemCallFilter(int level)
{ SOL_IPV6, IPV6_V6ONLY }, { SOL_IPV6, IPV6_RECVPKTINFO },
#endif
{ SOL_SOCKET, SO_BROADCAST }, { SOL_SOCKET, SO_REUSEADDR },
{ SOL_SOCKET, SO_TIMESTAMP },
{ SOL_SOCKET, SO_TIMESTAMP }, { SOL_SOCKET, SO_TIMESTAMPNS },
};
const static int fcntls[] = { F_GETFD, F_SETFD };