commit 1205197f2e15166a47fa1817feaf3587738fb37a Author: Miroslav Lichvar Date: Wed Nov 27 16:03:19 2024 +0100 avoid timestamps from future in PTP_SYS_OFFSET_EXTENDED diff --git a/client.c b/client.c index 065eddf..32796e0 100644 --- a/client.c +++ b/client.c @@ -2065,24 +2065,24 @@ int ioctl(int fd, unsigned long request, ...) { } else if (request == PTP_SYS_OFFSET_EXTENDED && fd == REFCLK_FD) { struct ptp_sys_offset_extended *sys_off = va_arg(ap, struct ptp_sys_offset_extended *); struct timespec ts, ts1, ts2; + double delay; int i; if (sys_off->n_samples > PTP_MAX_SAMPLES) sys_off->n_samples = PTP_MAX_SAMPLES; for (i = 0; i < sys_off->n_samples; i++) { + clock_gettime(CLOCK_REALTIME, &ts2); clock_gettime(REFCLK_ID, &ts); - sys_off->ts[i][1].sec = ts.tv_sec; - sys_off->ts[i][1].nsec = ts.tv_nsec; - } - - clock_gettime(CLOCK_REALTIME, &ts); - for (i = 0; i < sys_off->n_samples; i++) { - ts1 = ts, ts2 = ts; - add_to_timespec(&ts1, -get_phc_delay(-1)); - add_to_timespec(&ts2, get_phc_delay(1)); + delay = get_phc_delay(1); + add_to_timespec(&ts, -delay); + delay += get_phc_delay(-1); + ts1 = ts2; + add_to_timespec(&ts1, -delay); sys_off->ts[i][0].sec = ts1.tv_sec; sys_off->ts[i][0].nsec = ts1.tv_nsec; + sys_off->ts[i][1].sec = ts.tv_sec; + sys_off->ts[i][1].nsec = ts.tv_nsec; sys_off->ts[i][2].sec = ts2.tv_sec; sys_off->ts[i][2].nsec = ts2.tv_nsec; } commit 8b8831d98df1fca21288a9bc18c6a8fbfe6874a6 Author: Miroslav Lichvar Date: Wed Nov 27 16:06:40 2024 +0100 round nanoseconds in PTP_SYS_OFFSET* delay adjustments diff --git a/client.c b/client.c index 32796e0..0e235a6 100644 --- a/client.c +++ b/client.c @@ -794,7 +794,7 @@ static void normalize_timespec(struct timespec *tp) { static void add_to_timespec(struct timespec *tp, double offset) { tp->tv_sec += floor(offset); - tp->tv_nsec += (offset - floor(offset)) * 1e9; + tp->tv_nsec += round((offset - floor(offset)) * 1e9); normalize_timespec(tp); }