From 50f99ec5f49ec4dd1e989bcea65fabbdca9f8fea Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Thu, 19 Jan 2017 16:23:35 +0100 Subject: [PATCH] conf: add nocrossts option to hwtimestamp directive This option disables the use of the PTP_SYS_OFFSET_PRECISE ioctl. --- conf.c | 4 ++++ conf.h | 1 + doc/chrony.conf.adoc | 3 +++ ntp_io_linux.c | 6 ++++-- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/conf.c b/conf.c index d296da42..5904b911 100644 --- a/conf.c +++ b/conf.c @@ -1260,6 +1260,7 @@ parse_hwtimestamp(char *line) iface = ARR_GetNewElement(hwts_interfaces); iface->name = Strdup(p); iface->minpoll = 0; + iface->nocrossts = 0; iface->precision = 100.0e-9; iface->tx_comp = 0.0; iface->rx_comp = 0.0; @@ -1279,6 +1280,9 @@ parse_hwtimestamp(char *line) } else if (!strcasecmp(p, "txcomp")) { if (sscanf(line, "%lf%n", &iface->tx_comp, &n) != 1) break; + } else if (!strcasecmp(p, "nocrossts")) { + n = 0; + iface->nocrossts = 1; } else { break; } diff --git a/conf.h b/conf.h index b84d9213..22e65429 100644 --- a/conf.h +++ b/conf.h @@ -122,6 +122,7 @@ extern double CNF_GetInitStepThreshold(void); typedef struct { char *name; int minpoll; + int nocrossts; double precision; double tx_comp; double rx_comp; diff --git a/doc/chrony.conf.adoc b/doc/chrony.conf.adoc index a0801f04..3dc4189e 100644 --- a/doc/chrony.conf.adoc +++ b/doc/chrony.conf.adoc @@ -1836,6 +1836,9 @@ This option specifies the difference in seconds between the reported receive timestamp and the actual reception time at the physical layer. This value will be subtracted from receive timestamps obtained from the NIC. The default value is 0. +*nocrossts*::: +Some hardware can precisely cross timestamp the NIC clock with the system +clock. This option disables the use of the cross timestamping. :: + Examples of the directive are: diff --git a/ntp_io_linux.c b/ntp_io_linux.c index 686d175c..7a9d242a 100644 --- a/ntp_io_linux.c +++ b/ntp_io_linux.c @@ -62,6 +62,7 @@ struct Interface { int if_index; int phc_fd; int phc_mode; + int phc_nocrossts; /* Link speed in mbit/s */ int link_speed; /* Start of UDP data at layer 2 for IPv4 and IPv6 */ @@ -165,6 +166,7 @@ add_interface(CNF_HwTsInterface *conf_iface) iface->if_index = if_index; iface->phc_fd = phc_fd; iface->phc_mode = 0; + iface->phc_nocrossts = conf_iface->nocrossts; /* Start with 1 gbit and no VLANs or IPv4/IPv6 options */ iface->link_speed = 1000; @@ -368,8 +370,8 @@ process_hw_timestamp(struct Interface *iface, struct timespec *hw_ts, int l2_length; if (HCL_NeedsNewSample(iface->clock, &local_ts->ts)) { - if (!SYS_Linux_GetPHCSample(iface->phc_fd, 0, iface->precision, &iface->phc_mode, - &sample_phc_ts, &sample_sys_ts, &err)) + if (!SYS_Linux_GetPHCSample(iface->phc_fd, iface->phc_nocrossts, iface->precision, + &iface->phc_mode, &sample_phc_ts, &sample_sys_ts, &err)) return; LCL_CookTime(&sample_sys_ts, &sample_local_ts, NULL); -- 2.47.3