#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 */
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",
{ 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 };