diff --git a/ntp_io.c b/ntp_io.c index 9aa4785..e1f1655 100644 --- a/ntp_io.c +++ b/ntp_io.c @@ -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", diff --git a/sys_linux.c b/sys_linux.c index dd8529b..c4f5c14 100644 --- a/sys_linux.c +++ b/sys_linux.c @@ -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 };