diff --git a/conf.c b/conf.c index 3ba8355..8a7080c 100644 --- a/conf.c +++ b/conf.c @@ -1281,7 +1281,7 @@ parse_hwtimestamp(char *line) iface->name = Strdup(p); iface->minpoll = 0; iface->nocrossts = 0; - iface->rxfilter = CNF_HWTS_RXFILTER_NTP; + iface->rxfilter = CNF_HWTS_RXFILTER_ANY; iface->precision = 100.0e-9; iface->tx_comp = 0.0; iface->rx_comp = 0.0; diff --git a/conf.h b/conf.h index b3d143b..ea4fd45 100644 --- a/conf.h +++ b/conf.h @@ -118,9 +118,10 @@ extern char *CNF_GetHwclockFile(void); extern int CNF_GetInitSources(void); extern double CNF_GetInitStepThreshold(void); -#define CNF_HWTS_RXFILTER_NONE 0 -#define CNF_HWTS_RXFILTER_NTP 1 -#define CNF_HWTS_RXFILTER_ALL 2 +#define CNF_HWTS_RXFILTER_ANY 0 +#define CNF_HWTS_RXFILTER_NONE 1 +#define CNF_HWTS_RXFILTER_NTP 2 +#define CNF_HWTS_RXFILTER_ALL 3 typedef struct { char *name; diff --git a/doc/chrony.conf.adoc b/doc/chrony.conf.adoc index 3003637..612bc00 100644 --- a/doc/chrony.conf.adoc +++ b/doc/chrony.conf.adoc @@ -1886,11 +1886,12 @@ be enabled by the *xleave* option in the <> or the This directive is supported on Linux 3.19 and newer. The NIC must support HW timestamping, which can be verified with the *ethtool -T* command. The list of capabilities should include _SOF_TIMESTAMPING_RAW_HARDWARE_, -_SOF_TIMESTAMPING_TX_HARDWARE_, _SOF_TIMESTAMPING_RX_HARDWARE_, and the receive -filters should include _HWTSTAMP_FILTER_ALL_ or _HWTSTAMP_FILTER_NTP_ALL_. When -*chronyd* is running, no other process (e.g. a PTP daemon) should be working -with the NIC clock. HW timestamping of packets received from bridged and bonded -interfaces is supported on Linux 4.13 and newer. +_SOF_TIMESTAMPING_TX_HARDWARE_, and _SOF_TIMESTAMPING_RX_HARDWARE_. Receive +filter _HWTSTAMP_FILTER_ALL_, or _HWTSTAMP_FILTER_NTP_ALL_, is necessary for +timestamping of received packets. Timestamping of packets received from bridged +and bonded interfaces is supported on Linux 4.13 and newer. When *chronyd* is +running, no other process (e.g. a PTP daemon) should be working with the NIC +clock. + If the kernel supports software timestamping, it will be enabled for all interfaces. The source of timestamps (i.e. hardware, kernel, or daemon) is @@ -1925,15 +1926,21 @@ is 0. Some hardware can precisely cross timestamp the NIC clock with the system clock. This option disables the use of the cross timestamping. *rxfilter* _filter_::: -This option selects the receive timestamping filter. Possible values are: -_all_, _ntp_, and _none_. The default value is _ntp_, which enables -timestamping of NTP packets (_HWTSTAMP_FILTER_NTP_ALL_) if it is supported, or -timestamping of all packets (_HWTSTAMP_FILTER_ALL_). Setting *rxfilter* to -_all_ forces timestamping of all packets, which can be useful when the NIC -supports both filters and NTP packets are received from or on a non-standard -UDP port (e.g. specified by the *port* directive). Setting *rxfilter* to _none_ -disables receive HW timestamping and allows transmit HW timestamping to be -enabled when the NIC supports only PTP-specific receive filters. +This option selects the receive timestamping filter. The _filter_ can be one of +the following: +_all_:::: +Enables timestamping of all received packets. +_ntp_:::: +Enables timestamping of received NTP packets. +_none_:::: +Disables timestamping of received packets. +::: +The most specific filter for timestamping NTP packets which is supported by the +NIC is selected by default. Some NICs can timestamp only PTP packets, which +limits the selection to the _none_ filter. Forcing timestamping of all packets +with the _all_ filter when the NIC supports both _all_ and _ntp_ filters can be +useful when packets are received from or on a non-standard UDP port (e.g. +specified by the *port* directive). :: + Examples of the directive are: diff --git a/ntp_io_linux.c b/ntp_io_linux.c index 0fa5841..00caed0 100644 --- a/ntp_io_linux.c +++ b/ntp_io_linux.c @@ -154,17 +154,25 @@ add_interface(CNF_HwTsInterface *conf_iface) ts_config.tx_type = HWTSTAMP_TX_ON; switch (conf_iface->rxfilter) { + case CNF_HWTS_RXFILTER_ANY: +#ifdef HAVE_LINUX_TIMESTAMPING_RXFILTER_NTP + if (ts_info.rx_filters & (1 << HWTSTAMP_FILTER_NTP_ALL)) + ts_config.rx_filter = HWTSTAMP_FILTER_NTP_ALL; + else +#endif + if (ts_info.rx_filters & (1 << HWTSTAMP_FILTER_ALL)) + ts_config.rx_filter = HWTSTAMP_FILTER_ALL; + else + ts_config.rx_filter = HWTSTAMP_FILTER_NONE; + break; case CNF_HWTS_RXFILTER_NONE: ts_config.rx_filter = HWTSTAMP_FILTER_NONE; break; - case CNF_HWTS_RXFILTER_NTP: #ifdef HAVE_LINUX_TIMESTAMPING_RXFILTER_NTP - if (ts_info.rx_filters & (1 << HWTSTAMP_FILTER_NTP_ALL)) { - ts_config.rx_filter = HWTSTAMP_FILTER_NTP_ALL; - break; - } + case CNF_HWTS_RXFILTER_NTP: + ts_config.rx_filter = HWTSTAMP_FILTER_NTP_ALL; + break; #endif - /* Fall through */ default: ts_config.rx_filter = HWTSTAMP_FILTER_ALL; break; @@ -203,7 +211,8 @@ add_interface(CNF_HwTsInterface *conf_iface) iface->clock = HCL_CreateInstance(UTI_Log2ToDouble(MAX(conf_iface->minpoll, MIN_PHC_POLL))); - LOG(LOGS_INFO, "Enabled HW timestamping on %s", iface->name); + LOG(LOGS_INFO, "Enabled HW timestamping %son %s", + ts_config.rx_filter == HWTSTAMP_FILTER_NONE ? "(TX only) " : "", iface->name); return 1; }