diff --git a/ntp_io_linux.c b/ntp_io_linux.c index ce19b86..4d099cc 100644 --- a/ntp_io_linux.c +++ b/ntp_io_linux.c @@ -73,7 +73,7 @@ struct Interface { /* Minimum interval between PHC readings */ #define MIN_PHC_POLL -6 -/* Maximum acceptable offset between HW and daemon/kernel timestamp */ +/* Maximum acceptable offset between SW/HW and daemon timestamp */ #define MAX_TS_DELAY 1.0 /* Array of Interfaces */ @@ -619,6 +619,28 @@ process_hw_timestamp(struct Interface *iface, struct timespec *hw_ts, local_ts->source = NTP_TS_HARDWARE; } +/* ================================================== */ + +static void +process_sw_timestamp(struct timespec *sw_ts, NTP_Local_Timestamp *local_ts) +{ + double ts_delay, local_err; + struct timespec ts; + + LCL_CookTime(sw_ts, &ts, &local_err); + + ts_delay = UTI_DiffTimespecsToDouble(&local_ts->ts, &ts); + + if (fabs(ts_delay) > MAX_TS_DELAY) { + DEBUG_LOG("Unacceptable timestamp delay %.9f", ts_delay); + return; + } + + local_ts->ts = ts; + local_ts->err = local_err; + local_ts->source = NTP_TS_KERNEL; +} + /* ================================================== */ /* Extract UDP data from a layer 2 message. Supported is Ethernet with optional VLAN tags. */ @@ -744,8 +766,7 @@ NIO_Linux_ProcessMessage(SCK_Message *message, NTP_Local_Address *local_addr, if (local_ts->source == NTP_TS_DAEMON && !UTI_IsZeroTimespec(&message->timestamp.kernel) && (!is_tx || UTI_IsZeroTimespec(&message->timestamp.hw))) { - LCL_CookTime(&message->timestamp.kernel, &local_ts->ts, &local_ts->err); - local_ts->source = NTP_TS_KERNEL; + process_sw_timestamp(&message->timestamp.kernel, local_ts); } /* If the kernel is slow with enabling RX timestamping, open a dummy